diff --git a/.gn b/.gn index 1abcb11..95050bf 100644 --- a/.gn +++ b/.gn
@@ -93,7 +93,6 @@ "//extensions/browser/api/bluetooth_low_energy:*", # 22 errors "//extensions/browser/api/bluetooth_socket:*", # 12 errors "//extensions/browser/api/cast_channel:*", # 3 errors - "//extensions/browser/api/cec_private:*", # 4 errors "//extensions/browser/api/declarative:*", # 20 errors "//extensions/browser/api/declarative_content:*", # 2 errors "//extensions/browser/api/declarative_net_request:*", # 18 errors @@ -129,7 +128,6 @@ "//extensions/browser/api/system_storage:*", # 6 errors "//extensions/browser/api/test:*", # 1 error "//extensions/browser/api/usb:*", # 12 errors - "//extensions/browser/api/virtual_keyboard:*", # 1 error "//extensions/browser/api/virtual_keyboard_private:*", # 2 errors "//extensions/browser/api/vpn_provider:*", # 13 errors "//extensions/browser/api/web_request:*", # 37 errors
diff --git a/DEPS b/DEPS index b1dbbed..3e863140 100644 --- a/DEPS +++ b/DEPS
@@ -199,11 +199,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': 'f7ce1cd243f252ae970a5d9253f059e4da205c2b', + 'skia_revision': '8f282f5d9f30aeb5e3122735723b403203511370', # 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': '4d379d2f001373295530d8154f5bea14f1257e8d', + 'v8_revision': '5d60a181de0863d8d00ae42ec0ee3521f51b501a', # 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. @@ -211,15 +211,15 @@ # 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': 'f99ccb082ba59aab0fba2b8d04625bc2364fc01f', + 'angle_revision': '51603c63d1cb9e36afaf2069fc069e542ac2f3fb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '937395c1ed5d20af5a5fd999d7e2deddf1b78fe3', + 'swiftshader_revision': '588d32cb3f172d1a6092c2b3c7e5a5c5d8b3b06e', # 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': '4f67a285e22100c9dc9d175e8269c8fed1734f34', + 'pdfium_revision': 'f3b585e8edf5b271445c1ef7ce07f461e87a038f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -246,11 +246,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling NaCl # and whatever else without interference from each other. - 'nacl_revision': '299d4780ec86121ff2a5368ed9435ade0e356e5e', + 'nacl_revision': 'd28e6c52e05ea2f1b3231de473b6dbfce59bce40', # 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': 'cbc14b10e623a5d08c89a1323ae9c420c8492118', + 'freetype_revision': '34315538364b2e1ab7fb17d70dd59bb451982c80', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -274,7 +274,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '87d362bb2c4d3306cc900b124efeb38abe800cf8', + 'devtools_frontend_revision': '08a23169282404c7bc2b0be0c5469e31c0d3171a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -314,11 +314,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '00fcab636a055c78036ee20bb1a89339b0a28bad', + 'dawn_revision': '3a0405597374c9ae12fb93e33aac35826455a958', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '63bdfe586f8ceddf5e0823b75b1c595cbd380b2e', + 'quiche_revision': '425c25a8ad2d190f61531fd46e0a65050cc1b98a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -873,7 +873,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd4e0f040446f15ae891f3354d80ab8706fb1a7ce', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '1f19c9cd819c65dd73a82acf39e0e5aee84175d1', 'condition': 'checkout_chromeos', }, @@ -893,7 +893,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '60b433cf0b29e12218abbdf36a8d166fc59e7209', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c1aa4ecfcc8cbbbcf21e1b77125aa602339846ec', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1266,7 +1266,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '070ef598892aee3d5cfb628f577867217c863142', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '35f78f4a4562f61cde3b096492628e1d47acb04e', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1344,7 +1344,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'e-bgBYXeOkMw5xrqjCgQDp16bMPZeKKmilHzC-t2-1QC' + 'version': 'xAHa1IXmKteChkPvba9ezjSnKL7IyDePQRzWVUEAx9UC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1483,9 +1483,9 @@ }, 'src/third_party/usrsctp/usrsctplib': - Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '4191ca1784d8774dbf62d48ab9426c7311a91bc5', + Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'a3c3ef666b7a5e4c93ebae5a7462add6f86f5cf2', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@ffb3b84133b03dfc4b83a8430a418f4fa94308d8', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@b229877c6d2dd194a61794fa12e69405b09d8677', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '6c656df63da5995a932aafd45b32af1974e497d9', @@ -1518,7 +1518,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '3c2fe3888658d82b47ca831d59a2e07579619c2d', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'cdb3bc3b93dae5237610d0e45bccd900812a0cfe', + Var('webrtc_git') + '/src.git' + '@' + '42082f9045e74e65b9e3a66b51093e0dc2f9375a', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1590,7 +1590,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d39c0ebe595d27c9c096dff976daaf9c6920150e', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@0ec16d90f8a1eca252a2a5d5038246622fd45a98', 'condition': 'checkout_src_internal', }, @@ -1598,7 +1598,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'BrzlGtpSjp8quKJlBN8pxLiY0XfrgeDpvKGKAovPBTIC', + 'version': 'XqRO5qpWAA_j5rN924obLa6cvXOAk7XsrvyzobooTOoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1609,7 +1609,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'mqExY_CKGV64CkBK6pxd74QrlY0Ui90tdf5wIZPeB38C', + 'version': 'wqI-j8sCbfunzbh8sr3nRonzOeHLEK0lQHNePHx9xWwC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java index 33c3deba..a8c68cc 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -316,6 +316,12 @@ cl.appendSwitch(AwSwitches.WEBVIEW_SANDBOXED_RENDERER); } + // Enable modern SameSite cookie behavior if the app targets at least S. + if (BuildInfo.targetsAtLeastS()) { + CommandLine cl = CommandLine.getInstance(); + cl.appendSwitch(AwSwitches.WEBVIEW_ENABLE_MODERN_COOKIE_SAME_SITE); + } + int applicationFlags = ctx.getApplicationInfo().flags; boolean isAppDebuggable = (applicationFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; boolean isOsDebuggable = BuildInfo.isDebugAndroid();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 81d1569..92d6310 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -191,16 +191,6 @@ } } - // Used to record the UMA histogram Android.WebView.LoadDataWithBaseUrl.HistoryUrl. Since these - // values are persisted to logs, they should never be renumbered or reused. - @IntDef({HistoryUrl.EMPTY, HistoryUrl.BASEURL, HistoryUrl.DIFFERENT, HistoryUrl.COUNT}) - @interface HistoryUrl { - int EMPTY = 0; - int BASEURL = 1; - int DIFFERENT = 2; - int COUNT = 3; - } - // Used to record the UMA histogram Android.WebView.LoadDataWithBaseUrl.UrlScheme. Since these // values are persisted to logs, they should never be renumbered or reused. @VisibleForTesting @@ -1912,11 +1902,6 @@ return "base64".equals(encoding); } - private static void recordHistoryUrl(@HistoryUrl int value) { - RecordHistogram.recordEnumeratedHistogram( - "Android.WebView.LoadDataWithBaseUrl.HistoryUrl", value, HistoryUrl.COUNT); - } - private static void recordBaseUrl(@UrlScheme int value) { RecordHistogram.recordEnumeratedHistogram( DATA_BASE_URL_SCHEME_HISTOGRAM_NAME, value, UrlScheme.COUNT); @@ -2016,14 +2001,6 @@ baseUrl = fixupBase(baseUrl); historyUrl = fixupHistory(historyUrl); - if (historyUrl.equals(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL)) { - recordHistoryUrl(HistoryUrl.EMPTY); - } else if (historyUrl.equals(baseUrl)) { - recordHistoryUrl(HistoryUrl.BASEURL); - } else { - recordHistoryUrl(HistoryUrl.DIFFERENT); - } - recordBaseUrl(schemeForUrl(baseUrl)); if (baseUrl.startsWith("data:")) {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/OWNERS b/android_webview/javatests/src/org/chromium/android_webview/test/OWNERS index e258f091..57f2843 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/OWNERS +++ b/android_webview/javatests/src/org/chromium/android_webview/test/OWNERS
@@ -1,3 +1,9 @@ +# Autofill +per-file AwAutofillTest.java=battre@chromium.org + +# ContentCapture +per-file AwContentCaptureTest.java=file://components/content_capture/OWNERS + # Networking/Network Service per-file AwNetworkConfigurationTest.java=file://android_webview/browser/network_service/OWNERS per-file SslPreferencesTest.java=file://android_webview/browser/network_service/OWNERS
diff --git a/android_webview/test/shell/src/draw_fn/DEPS b/android_webview/test/shell/src/draw_fn/DEPS index d1fb631..a127cd33 100644 --- a/android_webview/test/shell/src/draw_fn/DEPS +++ b/android_webview/test/shell/src/draw_fn/DEPS
@@ -3,10 +3,4 @@ "+android_webview/public/browser", "+android_webview/test/draw_fn_impl_jni_headers", "+android_webview/test/shell/src/draw_fn", - - # For initializing GL bindings - "+android_webview/browser/gfx/gpu_service_webview.h", - - # For EGL bindings - "+ui/gl/gl_bindings.h", -] +] \ No newline at end of file
diff --git a/android_webview/test/shell/src/draw_fn/context_manager.cc b/android_webview/test/shell/src/draw_fn/context_manager.cc index cd981dd..4ed561f 100644 --- a/android_webview/test/shell/src/draw_fn/context_manager.cc +++ b/android_webview/test/shell/src/draw_fn/context_manager.cc
@@ -4,19 +4,104 @@ #include "android_webview/test/shell/src/draw_fn/context_manager.h" +#include <EGL/egl.h> +#include <GLES2/gl2.h> #include <android/native_window_jni.h> -#include "android_webview/browser/gfx/gpu_service_webview.h" #include "android_webview/public/browser/draw_fn.h" #include "android_webview/test/draw_fn_impl_jni_headers/ContextManager_jni.h" #include "android_webview/test/shell/src/draw_fn/allocator.h" #include "base/android/jni_array.h" #include "base/logging.h" +#include "base/native_library.h" #include "base/notreached.h" -#include "ui/gl/gl_bindings.h" +#include "base/threading/thread_restrictions.h" namespace draw_fn { +namespace { + +// TODO(penghuang): remove those proc types when EGL header is updated to 1.5. +typedef EGLBoolean(EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC)( + EGLDisplay dpy, + const EGLint* attrib_list, + EGLConfig* configs, + EGLint config_size, + EGLint* num_config); +typedef EGLContext(EGLAPIENTRYP PFNEGLCREATECONTEXTPROC)( + EGLDisplay dpy, + EGLConfig config, + EGLContext share_context, + const EGLint* attrib_list); +typedef EGLSurface(EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC)( + EGLDisplay dpy, + EGLConfig config, + EGLNativeWindowType win, + const EGLint* attrib_list); +typedef EGLBoolean(EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, + EGLContext ctx); +typedef EGLBoolean(EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, + EGLSurface surface); +typedef EGLDisplay(EGLAPIENTRYP PFNEGLGETDISPLAYPROC)( + EGLNativeDisplayType display_id); +typedef __eglMustCastToProperFunctionPointerType( + EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC)(const char* procname); +typedef EGLBoolean(EGLAPIENTRYP PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, + EGLSurface draw, + EGLSurface read, + EGLContext ctx); +typedef EGLBoolean(EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, + EGLSurface surface); +typedef EGLBoolean(EGLAPIENTRYP PFNEGLBINDAPIPROC)(EGLenum api); + +PFNEGLGETPROCADDRESSPROC eglGetProcAddressFn = nullptr; +PFNEGLBINDAPIPROC eglBindAPIFn = nullptr; +PFNEGLGETDISPLAYPROC eglGetDisplayFn = nullptr; +PFNEGLMAKECURRENTPROC eglMakeCurrentFn = nullptr; +PFNEGLSWAPBUFFERSPROC eglSwapBuffersFn = nullptr; +PFNEGLCHOOSECONFIGPROC eglChooseConfigFn = nullptr; +PFNEGLCREATECONTEXTPROC eglCreateContextFn = nullptr; +PFNEGLDESTROYCONTEXTPROC eglDestroyContextFn = nullptr; +PFNEGLCREATEWINDOWSURFACEPROC eglCreateWindowSurfaceFn = nullptr; +PFNEGLDESTROYSURFACEPROC eglDestroySurfaceFn = nullptr; +PFNGLREADPIXELSPROC glReadPixelsFn = nullptr; + +template <typename T> +void AssignProc(T& fn, const char* name) { + fn = reinterpret_cast<T>(eglGetProcAddressFn(name)); + CHECK(fn) << "Failed to get " << name; +} + +void InitializeBindings() { + if (eglGetProcAddressFn) + return; + + base::ScopedAllowBlockingForTesting allow_blocking; + base::NativeLibraryLoadError error; + base::FilePath filename("libEGL.so"); + base::NativeLibrary egl_library = base::LoadNativeLibrary(filename, &error); + CHECK(egl_library) << "Failed to load " << filename.MaybeAsASCII() << ": " + << error.ToString(); + + eglGetProcAddressFn = reinterpret_cast<PFNEGLGETPROCADDRESSPROC>( + base::GetFunctionPointerFromNativeLibrary(egl_library, + "eglGetProcAddress")); + CHECK(eglGetProcAddressFn) << "Failed to get eglGetProcAddress."; + + AssignProc(eglBindAPIFn, "eglBindAPI"); + AssignProc(eglGetDisplayFn, "eglGetDisplay"); + AssignProc(eglMakeCurrentFn, "eglMakeCurrent"); + AssignProc(eglSwapBuffersFn, "eglSwapBuffers"); + AssignProc(eglChooseConfigFn, "eglChooseConfig"); + AssignProc(eglCreateContextFn, "eglCreateContext"); + AssignProc(eglDestroyContextFn, "eglDestroyContext"); + AssignProc(eglCreateWindowSurfaceFn, "eglCreateWindowSurface"); + AssignProc(eglDestroySurfaceFn, "eglDestroySurface"); + AssignProc(glReadPixelsFn, "glReadPixels"); +} + +} // namespace + static jlong JNI_ContextManager_GetDrawFnFunctionTable(JNIEnv* env) { return reinterpret_cast<intptr_t>(draw_fn::GetDrawFnFunctionTable()); } @@ -25,7 +110,9 @@ return reinterpret_cast<intptr_t>(new ContextManager); } -ContextManager::ContextManager() = default; +ContextManager::ContextManager() { + InitializeBindings(); +} ContextManager::~ContextManager() { DestroyContext(); @@ -67,7 +154,7 @@ } EGLDisplay GetDisplay() { - static EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + static EGLDisplay display = eglGetDisplayFn(EGL_DEFAULT_DISPLAY); CHECK_NE(display, EGL_NO_DISPLAY); return display; } @@ -152,21 +239,21 @@ int quarter_width = width / 4; int quarter_height = height / 4; GLubyte bytes[4] = {}; - glReadPixels(quarter_width, quarter_height * 3, 1, 1, GL_RGBA, - GL_UNSIGNED_BYTE, bytes); + glReadPixelsFn(quarter_width, quarter_height * 3, 1, 1, GL_RGBA, + GL_UNSIGNED_BYTE, bytes); results[0] = rgbaToArgb(bytes); - glReadPixels(quarter_width * 3, quarter_height * 3, 1, 1, GL_RGBA, - GL_UNSIGNED_BYTE, bytes); + glReadPixelsFn(quarter_width * 3, quarter_height * 3, 1, 1, GL_RGBA, + GL_UNSIGNED_BYTE, bytes); results[1] = rgbaToArgb(bytes); - glReadPixels(quarter_width, quarter_height, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - bytes); + glReadPixelsFn(quarter_width, quarter_height, 1, 1, GL_RGBA, + GL_UNSIGNED_BYTE, bytes); results[2] = rgbaToArgb(bytes); - glReadPixels(quarter_width * 3, quarter_height, 1, 1, GL_RGBA, - GL_UNSIGNED_BYTE, bytes); + glReadPixelsFn(quarter_width * 3, quarter_height, 1, 1, GL_RGBA, + GL_UNSIGNED_BYTE, bytes); results[3] = rgbaToArgb(bytes); } - CHECK(eglSwapBuffers(GetDisplay(), surface_)); + CHECK(eglSwapBuffersFn(GetDisplay(), surface_)); return readback_quadrants ? base::android::ToJavaIntArray(env, results) : nullptr; @@ -206,14 +293,14 @@ EGL_WINDOW_BIT | EGL_PBUFFER_BIT, EGL_NONE}; EGLint num_configs = 0; - if (!eglChooseConfig(GetDisplay(), config_attribs, nullptr, 0, - &num_configs) || + if (!eglChooseConfigFn(GetDisplay(), config_attribs, nullptr, 0, + &num_configs) || num_configs == 0) { continue; } - CHECK(eglChooseConfig(GetDisplay(), config_attribs, &config, 1, - &num_configs)); + CHECK(eglChooseConfigFn(GetDisplay(), config_attribs, &config, 1, + &num_configs)); use_es3 = try_es3; break; } @@ -227,9 +314,6 @@ void ContextManager::CreateContext( JNIEnv* env, const base::android::JavaRef<jobject>& surface) { - // Initialize bindings. - android_webview::GpuServiceWebView::GetInstance(); - java_surface_.Reset(surface); if (java_surface_.is_null()) return; @@ -242,8 +326,8 @@ std::vector<EGLint> egl_window_attributes; egl_window_attributes.push_back(EGL_NONE); surface_ = - eglCreateWindowSurface(GetDisplay(), GetConfig(&use_es3), - native_window_, &egl_window_attributes[0]); + eglCreateWindowSurfaceFn(GetDisplay(), GetConfig(&use_es3), + native_window_, &egl_window_attributes[0]); CHECK(surface_); } @@ -253,10 +337,10 @@ context_attributes.push_back(use_es3 ? 3 : 2); context_attributes.push_back(EGL_NONE); - CHECK(eglBindAPI(EGL_OPENGL_ES_API)); + CHECK(eglBindAPIFn(EGL_OPENGL_ES_API)); - context_ = eglCreateContext(GetDisplay(), GetConfig(&use_es3), nullptr, - context_attributes.data()); + context_ = eglCreateContextFn(GetDisplay(), GetConfig(&use_es3), nullptr, + context_attributes.data()); CHECK(context_); } } @@ -272,11 +356,11 @@ } DCHECK(context_); - CHECK(eglDestroyContext(GetDisplay(), context_)); + CHECK(eglDestroyContextFn(GetDisplay(), context_)); context_ = nullptr; DCHECK(surface_); - CHECK(eglDestroySurface(GetDisplay(), surface_)); + CHECK(eglDestroySurfaceFn(GetDisplay(), surface_)); surface_ = nullptr; ANativeWindow_release(native_window_); java_surface_.Reset(); @@ -285,7 +369,7 @@ void ContextManager::MakeCurrent() { DCHECK(surface_); DCHECK(context_); - CHECK(eglMakeCurrent(GetDisplay(), surface_, surface_, context_)); + CHECK(eglMakeCurrentFn(GetDisplay(), surface_, surface_, context_)); } } // namespace draw_fn
diff --git a/ash/accelerometer/accelerometer_file_reader.cc b/ash/accelerometer/accelerometer_file_reader.cc index 79feba2f..294e2a1 100644 --- a/ash/accelerometer/accelerometer_file_reader.cc +++ b/ash/accelerometer/accelerometer_file_reader.cc
@@ -373,7 +373,7 @@ // If we haven't yet passed the timeout cutoff, try this again. This will // be scheduled at the same rate as reading. if (base::TimeTicks::Now() < initialization_timeout_) { - blocking_task_runner_->PostDelayedTask( + ui_task_runner_->PostDelayedTask( FROM_HERE, base::BindOnce(&AccelerometerFileReader::TryScheduleInitialize, this),
diff --git a/ash/ash_strings_grd/IDS_ASH_PHONE_HUB_LOCATE_BUTTON_NOT_AVAILABLE_TOOLTIP.png.sha1 b/ash/ash_strings_grd/IDS_ASH_PHONE_HUB_LOCATE_BUTTON_NOT_AVAILABLE_TOOLTIP.png.sha1 index 834b4364..48675ec 100644 --- a/ash/ash_strings_grd/IDS_ASH_PHONE_HUB_LOCATE_BUTTON_NOT_AVAILABLE_TOOLTIP.png.sha1 +++ b/ash/ash_strings_grd/IDS_ASH_PHONE_HUB_LOCATE_BUTTON_NOT_AVAILABLE_TOOLTIP.png.sha1
@@ -1 +1 @@ -d7fa90d6f286617baaaef959c781bab2d64f43ad \ No newline at end of file +b0805735ec8f8c3fe148d54af99053ff89594236 \ No newline at end of file
diff --git a/ash/assistant/assistant_interaction_controller_impl.cc b/ash/assistant/assistant_interaction_controller_impl.cc index 2cb2463..43ca62a 100644 --- a/ash/assistant/assistant_interaction_controller_impl.cc +++ b/ash/assistant/assistant_interaction_controller_impl.cc
@@ -148,24 +148,6 @@ assistant_->StartTextInteraction(text, query_source, allow_tts); } -void AssistantInteractionControllerImpl::StartBloomInteraction() { - // TODO(jeroendh): Test. - StopActiveInteraction(false); - - AssistantUiController::Get()->ShowUi(AssistantEntryPoint::kBloom); - - OnInteractionStarted(AssistantInteractionMetadata( - AssistantInteractionType::kText, AssistantQuerySource::kBloom, - /*query=*/"processing query")); -} - -void AssistantInteractionControllerImpl::ShowBloomResult( - const std::string& html) { - // TODO(jeroendh) ensure we're in a bloom interaction - - OnHtmlResponse(html, /*fallback=*/""); -} - void AssistantInteractionControllerImpl::OnAssistantControllerConstructed() { AssistantUiController::Get()->GetModel()->AddObserver(this); assistant_controller_->view_delegate()->AddObserver(this);
diff --git a/ash/assistant/assistant_interaction_controller_impl.h b/ash/assistant/assistant_interaction_controller_impl.h index ff0345c..c83dc0b 100644 --- a/ash/assistant/assistant_interaction_controller_impl.h +++ b/ash/assistant/assistant_interaction_controller_impl.h
@@ -69,8 +69,6 @@ void StartTextInteraction(const std::string& text, bool allow_tts, AssistantQuerySource query_source) override; - void StartBloomInteraction() override; - void ShowBloomResult(const std::string& html) override; // AssistantControllerObserver: void OnAssistantControllerConstructed() override;
diff --git a/ash/assistant/util/assistant_util.cc b/ash/assistant/util/assistant_util.cc index e826342f..6ad78c7 100644 --- a/ash/assistant/util/assistant_util.cc +++ b/ash/assistant/util/assistant_util.cc
@@ -47,7 +47,6 @@ case AssistantEntryPoint::kProactiveSuggestions: case AssistantEntryPoint::kSetup: case AssistantEntryPoint::kStylus: - case AssistantEntryPoint::kBloom: return false; } }
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 84b4d6d..6a92be60 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -382,6 +382,7 @@ ":cpp", "//base", "//base/test:test_support", + "//chromeos/ui/vector_icons", "//mojo/public/cpp/bindings", "//testing/gtest", "//ui/aura:test_support",
diff --git a/ash/public/cpp/assistant/controller/assistant_interaction_controller.h b/ash/public/cpp/assistant/controller/assistant_interaction_controller.h index a282954..62f2a781 100644 --- a/ash/public/cpp/assistant/controller/assistant_interaction_controller.h +++ b/ash/public/cpp/assistant/controller/assistant_interaction_controller.h
@@ -41,10 +41,6 @@ bool allow_tts, chromeos::assistant::AssistantQuerySource source) = 0; - // Start Bloom interaction. - virtual void StartBloomInteraction() = 0; - virtual void ShowBloomResult(const std::string& html) = 0; - protected: AssistantInteractionController(); virtual ~AssistantInteractionController();
diff --git a/ash/public/cpp/holding_space/holding_space_constants.h b/ash/public/cpp/holding_space/holding_space_constants.h index f87df492..aea8462 100644 --- a/ash/public/cpp/holding_space/holding_space_constants.h +++ b/ash/public/cpp/holding_space/holding_space_constants.h
@@ -16,22 +16,13 @@ constexpr int kHoldingSpaceBubbleWidth = 360; constexpr gfx::Insets kHoldingSpaceChildBubblePadding(16); constexpr int kHoldingSpaceChildBubbleChildSpacing = 16; -constexpr gfx::Insets kHoldingSpaceChipPadding(8); -constexpr int kHoldingSpaceChipChildSpacing = 8; -constexpr int kHoldingSpaceChipHeight = 40; constexpr int kHoldingSpaceChipIconSize = 24; -constexpr int kHoldingSpaceChipWidth = 160; -constexpr int kHoldingSpaceChipLabelMaskGradientWidth = 16; -constexpr int kHoldingSpaceChipsPerRow = 2; -constexpr int kHoldingSpaceColumnSpacing = 8; -constexpr int kHoldingSpaceColumnWidth = 160; constexpr int kHoldingSpaceContextMenuMargin = 8; constexpr int kHoldingSpaceCornerRadius = 8; constexpr int kHoldingSpaceDownloadsChevronIconSize = 20; constexpr int kHoldingSpaceDownloadsHeaderSpacing = 16; constexpr int kHoldingSpaceFocusInsets = -2; constexpr int kHoldingSpaceIconSize = 20; -constexpr int kHoldingSpaceRowSpacing = 8; constexpr gfx::Insets kHoldingSpaceScreenCapturePadding(8); constexpr gfx::Size kHoldingSpaceScreenCapturePinButtonSize(24, 24); constexpr gfx::Size kHoldingSpaceScreenCapturePlayIconSize(32, 32); @@ -41,6 +32,7 @@ constexpr int kHoldingSpaceSectionChildSpacing = 16; constexpr float kHoldingSpaceSelectedOverlayOpacity = 0.24f; constexpr int kHoldingSpaceTrayIconMaxVisiblePreviews = 3; +constexpr int kHoldingSpaceTrayIconPreviewSize = 32; constexpr int kHoldingSpaceTrayIconSize = 20; // Context menu commands.
diff --git a/ash/public/cpp/holding_space/holding_space_controller.cc b/ash/public/cpp/holding_space/holding_space_controller.cc index b444a565..bbbed40 100644 --- a/ash/public/cpp/holding_space/holding_space_controller.cc +++ b/ash/public/cpp/holding_space/holding_space_controller.cc
@@ -83,8 +83,10 @@ void HoldingSpaceController::SetModel(HoldingSpaceModel* model) { if (model_) { + HoldingSpaceModel* const old_model = model_; + model_ = nullptr; for (auto& observer : observers_) - observer.OnHoldingSpaceModelDetached(model_); + observer.OnHoldingSpaceModelDetached(old_model); } model_ = model;
diff --git a/ash/public/cpp/holding_space/holding_space_image.cc b/ash/public/cpp/holding_space/holding_space_image.cc index 639a21d..33d1581 100644 --- a/ash/public/cpp/holding_space/holding_space_image.cc +++ b/ash/public/cpp/holding_space/holding_space_image.cc
@@ -4,22 +4,75 @@ #include "ash/public/cpp/holding_space/holding_space_image.h" +#include <algorithm> #include <map> +#include "ash/public/cpp/file_icon_util.h" +#include "ash/public/cpp/holding_space/holding_space_color_provider.h" +#include "ash/public/cpp/holding_space/holding_space_constants.h" #include "base/bind.h" #include "base/callback.h" #include "base/location.h" +#include "chromeos/ui/vector_icons/vector_icons.h" +#include "ui/gfx/image/canvas_image_source.h" +#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_skia_source.h" +#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/skia_util.h" namespace ash { namespace { +// Appearance. +constexpr int kFileTypeIconSize = 20; + // Whether image invalidation should be done without a delay. May be set in // tests. bool g_use_zero_invalidation_delay_for_testing = false; +// EmptyImageSkiaSource -------------------------------------------------------- + +class EmptyImageSkiaSource : public gfx::CanvasImageSource { + public: + explicit EmptyImageSkiaSource(const gfx::Size& size) + : gfx::CanvasImageSource(size) {} + + EmptyImageSkiaSource(const EmptyImageSkiaSource&) = delete; + EmptyImageSkiaSource& operator=(const EmptyImageSkiaSource&) = delete; + ~EmptyImageSkiaSource() override = default; + + private: + // gfx::CanvasImageSource: + void Draw(gfx::Canvas* canvas) override {} // Draw nothing. +}; + +// Helpers --------------------------------------------------------------------- + +// Creates an empty image of the specified `size`. +gfx::ImageSkia CreateEmptyImageSkia(const gfx::Size& size) { + return gfx::ImageSkia(std::make_unique<EmptyImageSkiaSource>(size), size); +} + +// Creates an image to represent the file type of the specified `file_path`. +gfx::ImageSkia CreateFileTypeImageSkia(const base::FilePath& file_path, + bool is_folder, + const gfx::Size& size) { + gfx::ImageSkia file_type_icon; + if (is_folder) { + file_type_icon = gfx::CreateVectorIcon( + chromeos::kFiletypeFolderIcon, kFileTypeIconSize, + HoldingSpaceColorProvider::Get()->GetFileIconColor()); + } else { + file_type_icon = GetIconForPath( + file_path, HoldingSpaceColorProvider::Get()->GetFileIconColor()); + } + // Superimpose the `file_type_icon` over an empty image in order to center it + // within the image at a fixed size. + return gfx::ImageSkiaOperations::CreateSuperimposedImage( + CreateEmptyImageSkia(size), file_type_icon); +} + } // namespace // HoldingSpaceImage::ImageSkiaSource ------------------------------------------ @@ -50,18 +103,42 @@ // HoldingSpaceImage ----------------------------------------------------------- -HoldingSpaceImage::HoldingSpaceImage(const base::FilePath& backing_file_path, - const gfx::ImageSkia& placeholder, +HoldingSpaceImage::HoldingSpaceImage(const gfx::Size& max_size, + const base::FilePath& backing_file_path, AsyncBitmapResolver async_bitmap_resolver) - : backing_file_path_(backing_file_path), - placeholder_(placeholder), + : max_size_(max_size), + backing_file_path_(backing_file_path), async_bitmap_resolver_(async_bitmap_resolver) { + // Use an empty `placeholder_` until a bitmap is asynchronously returned. + placeholder_ = CreateEmptyImageSkia(max_size_); CreateImageSkia(); } HoldingSpaceImage::~HoldingSpaceImage() = default; // static +gfx::Size HoldingSpaceImage::GetMaxSizeForType(HoldingSpaceItem::Type type) { + gfx::Size size; + switch (type) { + case HoldingSpaceItem::Type::kDownload: + case HoldingSpaceItem::Type::kNearbyShare: + case HoldingSpaceItem::Type::kPinnedFile: + size = gfx::Size(kHoldingSpaceChipIconSize, kHoldingSpaceChipIconSize); + break; + case HoldingSpaceItem::Type::kScreenRecording: + case HoldingSpaceItem::Type::kScreenshot: + size = kHoldingSpaceScreenCaptureSize; + break; + } + // To avoid pixelation, ensure that the holding space image size is at least + // as large as the tray icon preview size. The image will be scaled down + // elsewhere if needed. + size.SetToMax(gfx::Size(kHoldingSpaceTrayIconPreviewSize, + kHoldingSpaceTrayIconPreviewSize)); + return size; +} + +// static void HoldingSpaceImage::SetUseZeroInvalidationDelayForTesting(bool value) { g_use_zero_invalidation_delay_for_testing = value; } @@ -78,22 +155,34 @@ void HoldingSpaceImage::LoadBitmap(float scale) { async_bitmap_resolver_.Run( backing_file_path_, gfx::ScaleToCeiledSize(image_skia_.size(), scale), - scale, base::BindOnce(&HoldingSpaceImage::OnBitmapLoaded, weak_factory_.GetWeakPtr(), backing_file_path_, scale)); } void HoldingSpaceImage::OnBitmapLoaded(const base::FilePath& file_path, float scale, - const SkBitmap* bitmap) { + const SkBitmap* bitmap, + base::File::Error error) { if (!bitmap) { - // Retry load if the backing file path has changed while the image load was - // in progress. - if (backing_file_path_ != file_path) + DCHECK_NE(error, base::File::FILE_OK); + if (backing_file_path_ != file_path) { + // Retry load if the backing file path has changed while the image load + // was in progress. LoadBitmap(scale); + } else if (async_bitmap_resolver_error_ != error) { + // A new `error` may mean a better file type image can be displayed. The + // `error`, for example, may indicate that the file is in fact a folder in + // which case there is a more appropriate icon that can be shown. Notify + // subscribers to invalidate themselves. + async_bitmap_resolver_error_ = error; + callback_list_.Notify(); + } return; } + DCHECK_EQ(error, base::File::FILE_OK); + async_bitmap_resolver_error_ = base::File::FILE_OK; + // Force invalidate `image_skia_` for `scale` so that it will request the // updated `gfx::ImageSkiaRep` at next access. image_skia_.RemoveRepresentation(scale); @@ -110,6 +199,50 @@ callback_list_.Notify(); } +gfx::ImageSkia HoldingSpaceImage::GetImageSkia( + const base::Optional<gfx::Size>& opt_size) const { + const gfx::Size size = opt_size.value_or(max_size_); + + // Requested `size` must be less than or equal to `max_size_` to avoid + // pixelation that would otherwise occur due to upscaling. + DCHECK_LE(size.height(), max_size_.height()); + DCHECK_LE(size.width(), max_size_.width()); + + // Requested `size` must be greater than the file type icon size in order for + // the image representing file type to render correctly. + DCHECK_GT(size.height(), kFileTypeIconSize); + DCHECK_GT(size.width(), kFileTypeIconSize); + + // When an error occurs, fallback to an image representing file type. + if (async_bitmap_resolver_error_ && + async_bitmap_resolver_error_ != base::File::FILE_OK) { + const bool is_folder = + async_bitmap_resolver_error_ == base::File::FILE_ERROR_NOT_A_FILE; + return CreateFileTypeImageSkia(backing_file_path_, is_folder, size); + } + + // Short-circuit resizing logic. + if (image_skia_.size() == size) + return image_skia_; + + gfx::ImageSkia image_skia(image_skia_); + + // Resize. + const float scale_x = size.width() / static_cast<float>(image_skia.width()); + const float scale_y = size.height() / static_cast<float>(image_skia.height()); + const float scale = std::max(scale_x, scale_y); + DCHECK_LE(scale, 1.f); // Upscaling would result in pixelation. + gfx::Size scaled_size = gfx::ScaleToCeiledSize(image_skia.size(), scale); + image_skia = gfx::ImageSkiaOperations::CreateResizedImage( + image_skia, skia::ImageOperations::ResizeMethod::RESIZE_BEST, + scaled_size); + + // Crop. + gfx::Rect cropped_bounds(image_skia.size()); + cropped_bounds.ClampToCenteredSize(size); + return gfx::ImageSkiaOperations::ExtractSubset(image_skia, cropped_bounds); +} + void HoldingSpaceImage::Invalidate() { if (invalidate_timer_.IsRunning()) return; @@ -153,7 +286,7 @@ image_skia_ = gfx::ImageSkia(std::make_unique<ImageSkiaSource>( /*host=*/weak_factory_.GetWeakPtr(), placeholder_), - placeholder_.size()); + max_size_); } } // namespace ash
diff --git a/ash/public/cpp/holding_space/holding_space_image.h b/ash/public/cpp/holding_space/holding_space_image.h index 524bcb00..f4f4b08 100644 --- a/ash/public/cpp/holding_space/holding_space_image.h +++ b/ash/public/cpp/holding_space/holding_space_image.h
@@ -8,8 +8,11 @@ #include <memory> #include "ash/public/cpp/ash_public_export.h" +#include "ash/public/cpp/holding_space/holding_space_item.h" #include "base/callback_forward.h" #include "base/callback_list.h" +#include "base/files/file.h" +#include "base/optional.h" #include "base/timer/timer.h" #include "ui/gfx/image/image_skia.h" @@ -21,22 +24,25 @@ using CallbackList = base::RepeatingClosureList; // Returns a bitmap. - using BitmapCallback = base::OnceCallback<void(const SkBitmap*)>; + using BitmapCallback = + base::OnceCallback<void(const SkBitmap* bitmap, base::File::Error error)>; // Returns a bitmap asynchronously for a given size. using AsyncBitmapResolver = base::RepeatingCallback<void(const base::FilePath& file_path, - const gfx::Size&, - float scale_factor, - BitmapCallback)>; + const gfx::Size& size, + BitmapCallback callback)>; - HoldingSpaceImage(const base::FilePath& backing_file_path, - const gfx::ImageSkia& placeholder, + HoldingSpaceImage(const gfx::Size& max_size, + const base::FilePath& backing_file_path, AsyncBitmapResolver async_bitmap_resolver); HoldingSpaceImage(const HoldingSpaceImage&) = delete; HoldingSpaceImage& operator=(const HoldingSpaceImage&) = delete; ~HoldingSpaceImage(); + // Returns the maximum size required for a holding space item of `type`. + static gfx::Size GetMaxSizeForType(HoldingSpaceItem::Type type); + static void SetUseZeroInvalidationDelayForTesting(bool value); bool operator==(const HoldingSpaceImage& rhs) const; @@ -45,9 +51,14 @@ base::CallbackListSubscription AddImageSkiaChangedCallback( CallbackList::CallbackType callback) const; - // Returns the underlying `gfx::ImageSkia`. Note that the image source may be - // dynamically updated, so UI classes should observe and react to updates. - const gfx::ImageSkia& image_skia() const { return image_skia_; } + // Returns the underlying `gfx::ImageSkia`. If `size` is omitted, the + // `max_size_` passed in the constructor is used. If `size` is present, it + // must be less than or equal to the `max_size_` passed in the constructor in + // order to prevent pixelation that would otherwise occur due to upscaling. + // Note that the image source may be dynamically updated, so UI classes should + // observe and react to updates. + gfx::ImageSkia GetImageSkia( + const base::Optional<gfx::Size>& size = base::nullopt) const; // Creates new image skia for the item, and thus invalidates currently loaded // representation. When the image is requested next time, the image @@ -72,7 +83,8 @@ // Response to an image representation load request. void OnBitmapLoaded(const base::FilePath& file_path, float scale, - const SkBitmap* bitmap); + const SkBitmap* bitmap, + base::File::Error error); // Creates `image_skia_` to be used for the holding space image. // If `image_skia_` already exists, it will be recreated with a fresh image @@ -83,11 +95,13 @@ // loads if the backing file gets updated multiple times in quick succession. void OnInvalidateTimer(); + const gfx::Size max_size_; base::FilePath backing_file_path_; - gfx::ImageSkia placeholder_; AsyncBitmapResolver async_bitmap_resolver_; + base::Optional<base::File::Error> async_bitmap_resolver_error_; gfx::ImageSkia image_skia_; + gfx::ImageSkia placeholder_; // Timer used to throttle image invalidate requests. base::OneShotTimer invalidate_timer_;
diff --git a/ash/public/cpp/holding_space/holding_space_image_unittest.cc b/ash/public/cpp/holding_space/holding_space_image_unittest.cc index cb3487c..45d7110 100644 --- a/ash/public/cpp/holding_space/holding_space_image_unittest.cc +++ b/ash/public/cpp/holding_space/holding_space_image_unittest.cc
@@ -8,22 +8,35 @@ #include <utility> #include <vector> +#include "ash/public/cpp/file_icon_util.h" +#include "ash/public/cpp/holding_space/holding_space_color_provider.h" #include "ash/public/cpp/holding_space/holding_space_item.h" #include "base/bind.h" #include "base/memory/weak_ptr.h" #include "base/test/bind.h" #include "base/test/task_environment.h" +#include "chromeos/ui/vector_icons/vector_icons.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColor.h" +#include "ui/gfx/color_palette.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image_skia.h" +#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_unittest_util.h" +#include "ui/gfx/paint_vector_icon.h" namespace ash { namespace { +// Appearance. +constexpr gfx::Size kImageSize(32, 32); +constexpr int kFileTypeIconSize = 20; +constexpr SkColor kFileTypeIconColor(gfx::kPlaceholderColor); + +// Helpers --------------------------------------------------------------------- + SkBitmap CreateBitmap(int width, int height, SkColor color) { SkBitmap bitmap; bitmap.allocN32Pixels(width, height); @@ -31,10 +44,35 @@ return bitmap; } -gfx::ImageSkia CreateImageSkia(int width, int height, SkColor color) { - return gfx::ImageSkia::CreateFrom1xBitmap(CreateBitmap(width, height, color)); +gfx::ImageSkia ExtractFileTypeIcon(const gfx::ImageSkia& image) { + gfx::Rect file_type_icon_bounds(image.size()); + file_type_icon_bounds.ClampToCenteredSize( + gfx::Size(kFileTypeIconSize, kFileTypeIconSize)); + return gfx::ImageSkiaOperations::ExtractSubset(image, file_type_icon_bounds); } +bool ContainsFileTypeIcon(const gfx::ImageSkia& image, + const base::FilePath& file_path) { + gfx::ImageSkia actual = ExtractFileTypeIcon(image); + gfx::ImageSkia expected = GetIconForPath(file_path, kFileTypeIconColor); + return gfx::test::AreImagesEqual(gfx::Image(actual), gfx::Image(expected)); +} + +bool ContainsFolderTypeIcon(const gfx::ImageSkia& image) { + gfx::ImageSkia actual = ExtractFileTypeIcon(image); + gfx::ImageSkia expected = gfx::CreateVectorIcon( + chromeos::kFiletypeFolderIcon, kFileTypeIconSize, kFileTypeIconColor); + return gfx::test::AreImagesEqual(gfx::Image(actual), gfx::Image(expected)); +} + +// Fake implementation of HoldingSpaceColorProvider. +class FakeHoldingSpaceColorProvider : public HoldingSpaceColorProvider { + public: + // HoldingSpaceColorProvider: + SkColor GetBackgroundColor() const override { return gfx::kPlaceholderColor; } + SkColor GetFileIconColor() const override { return kFileTypeIconColor; } +}; + // Helper class that provides a test implementation for the async bitmap // resolver callback used to generate holding space image representations. class ImageGenerator { @@ -51,7 +89,6 @@ void GenerateImage(const base::FilePath& file_path, const gfx::Size& size, - float scale, HoldingSpaceImage::BitmapCallback callback) { auto request = std::make_unique<PendingRequest>(); request->file_path = file_path; @@ -81,17 +118,18 @@ pending_requests_.erase(it); - std::move(callback).Run(&result); + std::move(callback).Run(&result, base::File::FILE_OK); } - void FailRequest(size_t index) { + void FailRequest(size_t index, + base::File::Error error = base::File::FILE_ERROR_FAILED) { ASSERT_LT(index, pending_requests_.size()); auto it = pending_requests_.begin() + index; HoldingSpaceImage::BitmapCallback callback = std::move((*it)->callback); pending_requests_.erase(it); - std::move(callback).Run(nullptr); + std::move(callback).Run(/*bitmap=*/nullptr, error); } private: @@ -114,11 +152,11 @@ image_subscription_ = image_->AddImageSkiaChangedCallback( base::BindRepeating(&TestImageClient::OnHoldingSpaceItemImageChanged, base::Unretained(this))); - image_->image_skia().GetRepresentation(1.0f); + image_->GetImageSkia().GetRepresentation(1.0f); } void OnHoldingSpaceItemImageChanged() { - image_->image_skia().GetRepresentation(1.0f); + image_->GetImageSkia().GetRepresentation(1.0f); ++image_change_count_; } @@ -137,20 +175,14 @@ std::unique_ptr<HoldingSpaceItem> CreateTestItem( const base::FilePath& file_path, ImageGenerator* image_generator, - int image_size, - SkColor image_color) { + const gfx::Size& image_size) { const GURL file_system_url("filesystem:file_system_url"); - gfx::ImageSkia placeholder( - CreateImageSkia(image_size, image_size, image_color)); - placeholder.AddRepresentation(gfx::ImageSkiaRep( - CreateBitmap(image_size * 2, image_size * 2, image_color), 2)); - return HoldingSpaceItem::CreateFileBackedItem( HoldingSpaceItem::Type::kPinnedFile, file_path, file_system_url, base::BindLambdaForTesting([&](HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, placeholder, image_generator->CreateResolverCallback()); + image_size, file_path, image_generator->CreateResolverCallback()); })); } @@ -165,6 +197,7 @@ private: base::test::TaskEnvironment task_environment_; + FakeHoldingSpaceColorProvider holding_space_color_provider_; }; // Tests the basic flow for generating holding space image bitmaps. @@ -172,8 +205,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -184,9 +216,9 @@ EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); // The image should return the placeholder bitmap. - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); // Generate the holding space item image, and verify the icon has been // updated. @@ -194,8 +226,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -208,8 +240,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); TestImageClient image_client(&holding_space_item->image()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); @@ -218,8 +249,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -231,49 +262,79 @@ EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); // Use placeholder while the image request is in progress. - EXPECT_EQ(20, bitmap_2x.height()); - EXPECT_EQ(20, bitmap_2x.width()); - EXPECT_EQ(SK_ColorRED, bitmap_2x.getColor(5, 5)); + EXPECT_EQ(kImageSize.height() * 2, bitmap_2x.height()); + EXPECT_EQ(kImageSize.width() * 2, bitmap_2x.width()); + EXPECT_EQ(SK_ColorTRANSPARENT, bitmap_2x.getColor(5, 5)); // Verify that the image gets updated once the holding space image is // generated. image_generator.FulfillRequest(0, SK_ColorBLUE); - image = holding_space_item->image().image_skia(); + image = holding_space_item->image().GetImageSkia(); const SkBitmap loaded_bitmap_2x = image.GetRepresentation(2.0f).GetBitmap(); - EXPECT_EQ(20, loaded_bitmap_2x.height()); - EXPECT_EQ(20, loaded_bitmap_2x.width()); + EXPECT_EQ(kImageSize.height() * 2, loaded_bitmap_2x.height()); + EXPECT_EQ(kImageSize.width() * 2, loaded_bitmap_2x.width()); EXPECT_EQ(SK_ColorBLUE, loaded_bitmap_2x.getColor(5, 5)); } // Verifies that the holding space image handles failed holding space image // requests. TEST_F(HoldingSpaceImageTest, ImageLoadFailure) { + const base::FilePath file_path("test_file.txt"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + CreateTestItem(file_path, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); - // Test image client requests an image representation durion construction. + // Test image client requests an image representation during construction. TestImageClient image_client(&holding_space_item->image()); EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); // Use placeholder while the image request is in progress. - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); - // Simulate failed holding space item image request, and verify the icon keeps - // using the placeholder image. + // Simulate failed holding space item image request, and verify the icon will + // fallback to the file type icon. image_generator.FailRequest(0); + EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_TRUE(ContainsFileTypeIcon(image, file_path)); +} + +// Verifies that the holding space image handles failed holding space image +// requests and special cases the fallback image for folders. +TEST_F(HoldingSpaceImageTest, ImageLoadFailureForFolder) { + ImageGenerator image_generator; + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_folder"), &image_generator, kImageSize); + + EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); + + // Test image client requests an image representation during construction. + TestImageClient image_client(&holding_space_item->image()); + EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + + // Use placeholder while the image request is in progress. + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); + + // Simulate failed holding space item image request using the special case + // error code used to signal that the backing file is a folder. + image_generator.FailRequest(0, base::File::FILE_ERROR_NOT_A_FILE); + + // Verify the image will fallback to the folder type icon. + EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_TRUE(ContainsFolderTypeIcon(image)); } // Verifies that the holding space image can be updated using @@ -282,8 +343,7 @@ ImageGenerator image_generator; const base::FilePath kTestFile("test_file.test"); std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); // Finish loading the initial image. TestImageClient image_client(&holding_space_item->image()); @@ -292,8 +352,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); @@ -308,8 +368,8 @@ EXPECT_EQ(kTestFile, image_generator.GetPendingRequestFilePath(0)); // While image load request is in progress, use the previously loaded icon. - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); @@ -318,8 +378,8 @@ image_generator.FulfillRequest(0, SK_ColorGREEN); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -332,8 +392,7 @@ ImageGenerator image_generator; const base::FilePath kTestFile("test_file.test"); std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); // Finish loading the initial image. TestImageClient image_client(&holding_space_item->image()); @@ -341,8 +400,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); @@ -365,8 +424,8 @@ image_generator.FulfillRequest(0, SK_ColorGREEN); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -377,9 +436,8 @@ // load is in progress. TEST_F(HoldingSpaceImageTest, ImageRefreshDuringInitialLoad) { ImageGenerator image_generator; - std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_file.txt"), &image_generator, kImageSize); // The test client implementation requests an image on construction. TestImageClient image_client(&holding_space_item->image()); @@ -387,18 +445,18 @@ EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); // Use placeholder while the image load is in progress. - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); holding_space_item->InvalidateImage(); ASSERT_TRUE( holding_space_item->image_for_testing().FireInvalidateTimerForTesting()); // Verify that placeholder image remains to be used. - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); EXPECT_EQ(2u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); @@ -407,17 +465,17 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); // Fulfill the later request, and verify the icon gets updated. EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); image_generator.FulfillRequest(0, SK_ColorGREEN); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -430,9 +488,8 @@ TEST_F(HoldingSpaceImageTest, ImageRefreshDuringInitialLoadWithOutOfOrderResponses) { ImageGenerator image_generator; - std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_file.txt"), &image_generator, kImageSize); // The test client implementation requests an image on construction. TestImageClient image_client(&holding_space_item->image()); @@ -440,9 +497,9 @@ EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); // Use placeholder while the image load is in progress. - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); holding_space_item->InvalidateImage(); ASSERT_TRUE( @@ -454,8 +511,8 @@ image_generator.FulfillRequest(1, SK_ColorGREEN); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); // Fulfill the initial request, and verify the result is ignored @@ -463,8 +520,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -476,16 +533,15 @@ // using the image placeholder). TEST_F(HoldingSpaceImageTest, ImageRequestsAfterItemDestruction) { ImageGenerator image_generator; - std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_file.txt"), &image_generator, kImageSize); // Finish the flow for loading 1x bitmap. TestImageClient image_client(&holding_space_item->image()); image_generator.FulfillRequest(0, SK_ColorBLUE); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); // Reset the holding space item, and request 2x representation. @@ -494,9 +550,9 @@ // Verify that image returns the placeholder bitmap, and that no image // generation requests are actually issued. - EXPECT_EQ(20, bitmap_2x.height()); - EXPECT_EQ(20, bitmap_2x.width()); - EXPECT_EQ(SK_ColorRED, bitmap_2x.getColor(5, 5)); + EXPECT_EQ(kImageSize.height() * 2, bitmap_2x.height()); + EXPECT_EQ(kImageSize.width() * 2, bitmap_2x.width()); + EXPECT_EQ(SK_ColorTRANSPARENT, bitmap_2x.getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); } @@ -505,25 +561,24 @@ // image load is still in progress. TEST_F(HoldingSpaceImageTest, ItemDestructionDuringImageLoad) { ImageGenerator image_generator; - std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_file.txt"), &image_generator, kImageSize); TestImageClient image_client(&holding_space_item->image()); EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); // Reset the item, and then simulate image request response. holding_space_item.reset(); image_generator.FulfillRequest(0, SK_ColorBLUE); // Verify that the image keeps using the placeholder bitmap. - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); @@ -533,9 +588,8 @@ // image load is still in progress, in case the pending image load fails. TEST_F(HoldingSpaceImageTest, ItemDestructionDuringFailedImageLoad) { ImageGenerator image_generator; - std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_file.txt"), &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); TestImageClient image_client(&holding_space_item->image()); @@ -543,17 +597,17 @@ EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); // Reset the item, and then simulate a failed image request response. holding_space_item.reset(); image_generator.FailRequest(0); // Verify that the image keeps using the placeholder bitmap. - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); @@ -563,9 +617,8 @@ // while image refresh is in progress. TEST_F(HoldingSpaceImageTest, ItemDestructionDuringImageRefresh) { ImageGenerator image_generator; - std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(base::FilePath("test_file.txt"), &image_generator, - /*image_size=*/10, /*image_color=*/SK_ColorRED); + std::unique_ptr<HoldingSpaceItem> holding_space_item = CreateTestItem( + base::FilePath("test_file.txt"), &image_generator, kImageSize); // Run thr flow for loading the initial image version. TestImageClient image_client(&holding_space_item->image()); @@ -573,8 +626,8 @@ EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); holding_space_item->InvalidateImage(); @@ -588,7 +641,7 @@ image_generator.FulfillRequest(0, SK_ColorGREEN); // Verify that the image keeps using previously generated icon. - EXPECT_EQ(gfx::Size(10, 10), image.size()); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -601,8 +654,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -621,8 +673,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); @@ -637,8 +689,8 @@ image_generator.FulfillRequest(0, SK_ColorGREEN); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); } @@ -649,8 +701,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -668,7 +719,7 @@ kUpdatedTestFile, GURL("filesystem:updated_file_system_url")); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); image.GetRepresentation(2.0f); EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); @@ -676,8 +727,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); const SkBitmap bitmap_2x = image.GetRepresentation(2.0f).GetBitmap(); - EXPECT_EQ(20, bitmap_2x.height()); - EXPECT_EQ(20, bitmap_2x.width()); + EXPECT_EQ(kImageSize.height() * 2, bitmap_2x.height()); + EXPECT_EQ(kImageSize.width() * 2, bitmap_2x.width()); EXPECT_EQ(SK_ColorBLUE, bitmap_2x.getColor(10, 10)); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); } @@ -688,8 +739,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -698,7 +748,7 @@ EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); EXPECT_EQ(kTestFile, image_generator.GetPendingRequestFilePath(0)); - // Update the backing file path, and simulate image load failure.. + // Update the backing file path, and simulate image load failure. const base::FilePath kUpdatedTestFile("updated_test_file.test"); holding_space_item->UpdateBackingFile( kUpdatedTestFile, GURL("filesystem:updated_file_system_url")); @@ -711,8 +761,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); } @@ -724,8 +774,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -736,9 +785,9 @@ // Simulate request failure before updating the backing file path. image_generator.FailRequest(0); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_TRUE(ContainsFileTypeIcon(image, kTestFile)); // Update the backing file path, and verify the failed request was not // retried. @@ -749,10 +798,10 @@ // Verify that image load is retried using the new file path. EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); - EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_TRUE(ContainsFileTypeIcon(image, kTestFile)); + EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); } // Tests that failed image loads will be not be retried for requests issued @@ -761,8 +810,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -778,10 +826,10 @@ EXPECT_EQ(kUpdatedTestFile, image_generator.GetPendingRequestFilePath(0)); image_generator.FailRequest(0); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); - EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_TRUE(ContainsFileTypeIcon(image, kUpdatedTestFile)); + EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); // Verify that the request is not retried. EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -792,8 +840,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); @@ -804,8 +851,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); // Update the backing file path, and verify the image load is not requested @@ -814,8 +861,8 @@ holding_space_item->UpdateBackingFile( kUpdatedTestFile, GURL("filesystem:updated_file_system_url")); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); // Verify that the request is not retried. @@ -830,8 +877,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); // Create test image client. @@ -850,8 +896,8 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorBLUE, image.bitmap()->getColor(5, 5)); // Verify that the request is not retried. @@ -874,8 +920,7 @@ const base::FilePath kTestFile("test_file.test"); ImageGenerator image_generator; std::unique_ptr<HoldingSpaceItem> holding_space_item = - CreateTestItem(kTestFile, &image_generator, /*image_size=*/10, - /*image_color=*/SK_ColorRED); + CreateTestItem(kTestFile, &image_generator, kImageSize); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests()); // Create test image client to initiate image request. @@ -901,9 +946,9 @@ image_generator.FulfillRequest(0, SK_ColorBLUE); EXPECT_EQ(0u, image_client.GetAndResetImageChangeCount()); - gfx::ImageSkia image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); - EXPECT_EQ(SK_ColorRED, image.bitmap()->getColor(5, 5)); + gfx::ImageSkia image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); + EXPECT_EQ(SK_ColorTRANSPARENT, image.bitmap()->getColor(5, 5)); // Finish the later request, and verify the image gets updated. EXPECT_EQ(1u, image_generator.NumberOfPendingRequests()); @@ -911,8 +956,8 @@ image_generator.FulfillRequest(0, SK_ColorGREEN); EXPECT_EQ(1u, image_client.GetAndResetImageChangeCount()); - image = holding_space_item->image().image_skia(); - EXPECT_EQ(gfx::Size(10, 10), image.size()); + image = holding_space_item->image().GetImageSkia(); + EXPECT_EQ(kImageSize, image.size()); EXPECT_EQ(SK_ColorGREEN, image.bitmap()->getColor(5, 5)); EXPECT_EQ(0u, image_generator.NumberOfPendingRequests());
diff --git a/ash/public/cpp/holding_space/holding_space_item_unittest.cc b/ash/public/cpp/holding_space/holding_space_item_unittest.cc index 6d8203e..d88b89ed 100644 --- a/ash/public/cpp/holding_space/holding_space_item_unittest.cc +++ b/ash/public/cpp/holding_space/holding_space_item_unittest.cc
@@ -11,8 +11,6 @@ #include "base/callback_helpers.h" #include "base/test/bind.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/gfx/image/image_skia.h" -#include "ui/gfx/image/image_unittest_util.h" namespace ash { @@ -29,7 +27,7 @@ HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, /*placeholder=*/gfx::test::CreateImageSkia(10, 10), + HoldingSpaceImage::GetMaxSizeForType(type), file_path, /*async_bitmap_resolver=*/base::DoNothing()); } @@ -41,7 +39,6 @@ TEST_P(HoldingSpaceItemTest, Serialization) { const base::FilePath file_path("file_path"); const GURL file_system_url("filesystem:file_system_url"); - const gfx::ImageSkia placeholder(gfx::test::CreateImageSkia(10, 10)); const auto holding_space_item = HoldingSpaceItem::CreateFileBackedItem( /*type=*/GetParam(), file_path, file_system_url,
diff --git a/ash/public/cpp/views_text_services_context_menu_impl.cc b/ash/public/cpp/views_text_services_context_menu_impl.cc index 42f1396a..7fd34053 100644 --- a/ash/public/cpp/views_text_services_context_menu_impl.cc +++ b/ash/public/cpp/views_text_services_context_menu_impl.cc
@@ -93,6 +93,9 @@ const int target_index = index_of_paste + 1; menu->InsertItemAt(target_index, IDS_APP_SHOW_CLIPBOARD_HISTORY, l10n_util::GetStringUTF16(IDS_APP_SHOW_CLIPBOARD_HISTORY)); + menu->SetIsNewFeatureAt( + target_index, + chromeos::features::IsClipboardHistoryContextMenuNudgeEnabled()); } } // namespace ash
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 89c5a901..598d5380 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">ከ<ph name="NAME" /> ጋር በመገናኘት ላይ</translation> <translation id="3943857333388298514">ለጥፍ</translation> <translation id="394485226368336402">የድምጽ ቅንብሮች</translation> +<translation id="3945867833895287237">ከመገናኛ ነጥብ ጋር በመገናኘት ላይ...</translation> <translation id="3962859241508114581">ቀዳሚ ትራክ</translation> <translation id="3969043077941541451">አጥፋ</translation> <translation id="397105322502079400">በማስላት ላይ...</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 400f566..1c7ebb4a 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -586,7 +586,7 @@ <translation id="6291221004442998378">চাৰ্জ হৈ থকা নাই</translation> <translation id="6297287540776456956">কোনো অংশ বাছনি কৰিবলৈ ষ্টাইলাছ ব্যৱহাৰ কৰক</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ক <ph name="ROTATION" />লৈ ঘূৰোৱা হৈছিল</translation> -<translation id="6315170314923504164">কণ্ঠস্বৰ</translation> +<translation id="6315170314923504164">Voice</translation> <translation id="6338485349199627913"><ph name="DISPLAY_NAME" /> হৈছে <ph name="MANAGER" />এ পৰিচালনা কৰা এটা পৰিচালিত ছেশ্বন</translation> <translation id="6376931439017688372">ব্লুটুথ অন কৰা আছে</translation> <translation id="6381109794406942707">ডিভাইচটো আনলক কৰিবলৈ, আপোনাৰ পিনটো দিয়ক।</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index ca1618aa..23facf9 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Ідзе падключэнне да сеткі <ph name="NAME" /></translation> <translation id="3943857333388298514">Уставіць</translation> <translation id="394485226368336402">Налады гуку</translation> +<translation id="3945867833895287237">Ідзе падключэнне да хот-спота...</translation> <translation id="3962859241508114581">Папярэдні трэк</translation> <translation id="3969043077941541451">Выключана</translation> <translation id="397105322502079400">Ідзе разлік...</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 46a75b1..45cdef1 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627"><ph name="NAME" />-এ সংযোগ করা হচ্ছে</translation> <translation id="3943857333388298514">পেস্ট করুন</translation> <translation id="394485226368336402">অডিও সেটিংস</translation> +<translation id="3945867833895287237">হটস্পটে কানেক্ট করা হচ্ছে...</translation> <translation id="3962859241508114581">আগের ট্র্যাক চালান</translation> <translation id="3969043077941541451">বন্ধ আছে</translation> <translation id="397105322502079400">গণনা করা হচ্ছে...</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 5fa81397..d614a33 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">S'està connectant amb <ph name="NAME" /></translation> <translation id="3943857333388298514">Enganxa</translation> <translation id="394485226368336402">Configuració d'àudio</translation> +<translation id="3945867833895287237">S'està connectant a un punt d'accés…</translation> <translation id="3962859241508114581">Pista anterior</translation> <translation id="3969043077941541451">Desactivada</translation> <translation id="397105322502079400">S’està calculant...</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 0b6234ef..a39d82a 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Připojování k síti <ph name="NAME" /></translation> <translation id="3943857333388298514">Vložit</translation> <translation id="394485226368336402">Nastavení zvuku</translation> +<translation id="3945867833895287237">Připojování k hotspotu…</translation> <translation id="3962859241508114581">Předchozí skladba</translation> <translation id="3969043077941541451">Vypnout</translation> <translation id="397105322502079400">Probíhá výpočet…</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 42faeb28..a92e80650 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -328,6 +328,7 @@ <translation id="3901991538546252627"><ph name="NAME" /> sarera konektatzen</translation> <translation id="3943857333388298514">Itsatsi</translation> <translation id="394485226368336402">Audio-ezarpenak</translation> +<translation id="3945867833895287237">Wifi-gunera konektatzen…</translation> <translation id="3962859241508114581">Aurreko pista</translation> <translation id="3969043077941541451">Desaktibatuta</translation> <translation id="397105322502079400">Kalkulatzen…</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 69c49088..a1c47b6 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">در حال اتصال به <ph name="NAME" /></translation> <translation id="3943857333388298514">جاگذاری</translation> <translation id="394485226368336402">تنظیمات صوتی</translation> +<translation id="3945867833895287237">درحال اتصال به نقطه اتصال…</translation> <translation id="3962859241508114581">آهنگ قبلی</translation> <translation id="3969043077941541451">خاموش</translation> <translation id="397105322502079400">در حال محاسبه…</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 77d273e..fd924493 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Yhdistetään verkkoon <ph name="NAME" /></translation> <translation id="3943857333388298514">Liitä</translation> <translation id="394485226368336402">Ääniasetukset</translation> +<translation id="3945867833895287237">Yhdistetään hotspotiin…</translation> <translation id="3962859241508114581">Edellinen kappale</translation> <translation id="3969043077941541451">Pois päältä</translation> <translation id="397105322502079400">Lasketaan...</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 1f9d8ad..9492330 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Connexion à <ph name="NAME" /> en cours...</translation> <translation id="3943857333388298514">Coller</translation> <translation id="394485226368336402">Paramètres audio</translation> +<translation id="3945867833895287237">Connexion au point d'accès en cours…</translation> <translation id="3962859241508114581">Chanson précédente</translation> <translation id="3969043077941541451">Désactivé</translation> <translation id="397105322502079400">Calcul en cours...</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 24909785..9eddf18 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -328,6 +328,7 @@ <translation id="3901991538546252627">Conectando con <ph name="NAME" /></translation> <translation id="3943857333388298514">Pegar</translation> <translation id="394485226368336402">Configuración do audio</translation> +<translation id="3945867833895287237">Conectándose á zona wifi...</translation> <translation id="3962859241508114581">Pista anterior</translation> <translation id="3969043077941541451">Desactivar</translation> <translation id="397105322502079400">Calculando...</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 48611eb9..0c18f4e 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -588,7 +588,7 @@ <translation id="6291221004442998378">चार्ज नहीं हो रहा है</translation> <translation id="6297287540776456956">कोई क्षेत्र चुनने के लिए स्टाइलस का उपयोग करें</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> को <ph name="ROTATION" /> पर घुमाया गया</translation> -<translation id="6315170314923504164">ध्वनि</translation> +<translation id="6315170314923504164">Voice</translation> <translation id="6338485349199627913"><ph name="DISPLAY_NAME" /> एक प्रबंधित सत्र है. इसे <ph name="MANAGER" /> प्रबंधित करता है</translation> <translation id="6376931439017688372">ब्लूटूथ चालू है</translation> <translation id="6381109794406942707">यह डिवाइस अनलॉक करने के लिए, अपना पिन डालें.</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 3d04f99e..784295e 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Միացում <ph name="NAME" />-ին</translation> <translation id="3943857333388298514">Տեղադրել</translation> <translation id="394485226368336402">Ձայնի կարգավորումներ</translation> +<translation id="3945867833895287237">Միացում թեժ կետին…</translation> <translation id="3962859241508114581">Նախորդ կատարումը</translation> <translation id="3969043077941541451">Անջատված է</translation> <translation id="397105322502079400">Հաշվարկում…</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 9bbdfdb..c8077de 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -588,7 +588,7 @@ <translation id="6291221004442998378">ಚಾರ್ಜ್ ಆಗುತ್ತಿಲ್ಲ</translation> <translation id="6297287540776456956">ಪ್ರದೇಶವನ್ನು ಆಯ್ಕೆಮಾಡಲು ಸ್ಟೈಲಸ್ ಬಳಸಿ</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ಅನ್ನು <ph name="ROTATION" /> ಗೆ ತಿರುಗಿಸಲಾಗಿದೆ</translation> -<translation id="6315170314923504164">ಧ್ವನಿ</translation> +<translation id="6315170314923504164">Voice</translation> <translation id="6338485349199627913"><ph name="DISPLAY_NAME" /> ಎಂಬುದು <ph name="MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಒಂದು ನಿರ್ವಹಿಸಿದ ಸೆಶನ್ ಆಗಿದೆ</translation> <translation id="6376931439017688372">ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗಿದೆ</translation> <translation id="6381109794406942707">ಸಾಧನವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index d4279923..f59dbed 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Jungiamasi prie „<ph name="NAME" />“</translation> <translation id="3943857333388298514">Įklijuoti</translation> <translation id="394485226368336402">Garso nustatymai</translation> +<translation id="3945867833895287237">Prisijungiama prie viešosios interneto prieigos taško...</translation> <translation id="3962859241508114581">Ankstesnis takelis</translation> <translation id="3969043077941541451">Išjungta</translation> <translation id="397105322502079400">Skaičiuojama...</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 5438e37..5c5c3a996 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -328,6 +328,7 @@ <translation id="3901991538546252627">Се поврзува со <ph name="NAME" /></translation> <translation id="3943857333388298514">Залепи</translation> <translation id="394485226368336402">Поставки за аудио</translation> +<translation id="3945867833895287237">Се поврзува со точка на пристап…</translation> <translation id="3962859241508114581">Претходна песна</translation> <translation id="3969043077941541451">Исклучи</translation> <translation id="397105322502079400">Се пресметува…</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 1f0988f..76954f0 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -325,6 +325,7 @@ <translation id="3901991538546252627"><ph name="NAME" /> എന്നതിലേക്ക് കണക്റ്റുചെയ്യുന്നു</translation> <translation id="3943857333388298514">ഒട്ടിക്കുക</translation> <translation id="394485226368336402">ഓഡിയോ ക്രമീകരണം</translation> +<translation id="3945867833895287237">ഹോട്ട്സ്പോട്ടിലേക്ക് കണക്റ്റ് ചെയ്യുന്നു...</translation> <translation id="3962859241508114581">മുമ്പത്തെ ട്രാക്ക്</translation> <translation id="3969043077941541451">ഓഫാണ്</translation> <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation> @@ -584,7 +585,7 @@ <translation id="6291221004442998378">ചാർജ് ചെയ്യുന്നില്ല</translation> <translation id="6297287540776456956">ആവശ്യമുള്ള ഏരിയ തിരഞ്ഞെടുക്കാൻ സ്റ്റൈലസ് ഉപയോഗിക്കുക</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> എന്നതിനെ <ph name="ROTATION" /> എന്നതിലേയ്ക്ക് തിരിച്ചു</translation> -<translation id="6315170314923504164">വോയ്സ്</translation> +<translation id="6315170314923504164">Voice</translation> <translation id="6338485349199627913"><ph name="MANAGER" /> മാനേജ് ചെയ്യുന്ന ഒരു മാനേജ് ചെയ്യപ്പെടുന്ന സെഷനാണ് <ph name="DISPLAY_NAME" /></translation> <translation id="6376931439017688372">Bluetooth ഓണാണ്</translation> <translation id="6381109794406942707">ഉപകരണം അൺലോക്ക് ചെയ്യാൻ, നിങ്ങളുടെ പിൻ നൽകുക.</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index a404311..e684be0 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -586,7 +586,7 @@ <translation id="6291221004442998378">ଚାର୍ଜ ହେଉନାହିଁ</translation> <translation id="6297287540776456956">ଏକ ଅଞ୍ଚଳ ଚୟନ କରିବାକୁ ଷ୍ଟାଇଲସ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" />କୁ <ph name="ROTATION" />ରେ ଘୂରାଗଲା</translation> -<translation id="6315170314923504164">ଭଏସ୍</translation> +<translation id="6315170314923504164">Voice</translation> <translation id="6338485349199627913"><ph name="DISPLAY_NAME" /> ହେଉଛି <ph name="MANAGER" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଥିବା ଏକ ପରିଚାଳିତ ସେସନ୍</translation> <translation id="6376931439017688372">ବ୍ଲୁଟୁଥ୍ ଚାଲୁ ଅଛି</translation> <translation id="6381109794406942707">ଡିଭାଇସକୁ ଅନଲକ୍ କରିବା ପାଇଁ ଆପଣଙ୍କର PIN ଲେଖନ୍ତୁ।</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 25fce6b..da732df 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Se conectează la <ph name="NAME" /></translation> <translation id="3943857333388298514">Inserează</translation> <translation id="394485226368336402">Setări audio</translation> +<translation id="3945867833895287237">Se conectează la hotspot...</translation> <translation id="3962859241508114581">Melodia anterioară</translation> <translation id="3969043077941541451">Dezactivată</translation> <translation id="397105322502079400">Se calculează...</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 8983905a..41dad50 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627"><ph name="NAME" /> වෙත සබඳ වෙමින්</translation> <translation id="3943857333388298514">අලවන්න</translation> <translation id="394485226368336402">ශ්රව්ය සැකසීම්</translation> +<translation id="3945867833895287237">හොට්ස්පොට් වෙත සම්බන්ධ වෙමින්...</translation> <translation id="3962859241508114581">පෙර ඛණ්ඩය</translation> <translation id="3969043077941541451">ක්රියාවිරහිතයි</translation> <translation id="397105322502079400">ගණනය කරමින්...</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 93d4a2a..2d4ba62 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Pripája sa k sieti <ph name="NAME" /></translation> <translation id="3943857333388298514">Prilepiť</translation> <translation id="394485226368336402">Nastavenia zvuku</translation> +<translation id="3945867833895287237">Pripája sa k hotspotu…</translation> <translation id="3962859241508114581">Predchádzajúca stopa</translation> <translation id="3969043077941541451">Vypnuté</translation> <translation id="397105322502079400">Prebieha výpočet...</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index abf266c..290a263 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -327,6 +327,7 @@ <translation id="3901991538546252627">Po lidhet me <ph name="NAME" /></translation> <translation id="3943857333388298514">Ngjite</translation> <translation id="394485226368336402">Cilësimet e audios</translation> +<translation id="3945867833895287237">Po lidhet me zonën e qasjes për internet...</translation> <translation id="3962859241508114581">Kënga e mëparshme</translation> <translation id="3969043077941541451">Joaktive</translation> <translation id="397105322502079400">Po llogarit...</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index e65e0efa..5814dea1 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -588,7 +588,7 @@ <translation id="6291221004442998378">ఛార్జ్ కావడం లేదు</translation> <translation id="6297287540776456956">ప్రాంతాన్ని ఎంచుకోవడానికి స్టైలస్ను ఉపయోగించండి</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> <ph name="ROTATION" />కి తిప్పబడింది</translation> -<translation id="6315170314923504164">వాయిస్</translation> +<translation id="6315170314923504164">Voice</translation> <translation id="6338485349199627913"><ph name="DISPLAY_NAME" /> అనేది ఒక మేనేజ్ చేయబడిన సెషన్, దీనిని <ph name="MANAGER" /> మేనేజ్ చేస్తోంది</translation> <translation id="6376931439017688372">బ్లూటూత్ ఆన్ చేయబడింది</translation> <translation id="6381109794406942707">పరికరాన్ని అన్లాక్ చేయడానికి, మీ పిన్ను ఎంటర్ చేయండి.</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index d5934655..52dc1bb 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -514,7 +514,7 @@ <translation id="5648021990716966815">Mikrofon jakı</translation> <translation id="5669267381087807207">Etkinleştiriliyor</translation> <translation id="5673434351075758678">Ayarlarınız senkronize edildikten sonra "<ph name="FROM_LOCALE" />" olan dil "<ph name="TO_LOCALE" />" olarak değiştirildi.</translation> -<translation id="5677928146339483299">Engellendi</translation> +<translation id="5677928146339483299">Engelleniyor</translation> <translation id="5679050765726761783">Düşük güçlü bir adaptör bağlandı</translation> <translation id="5682642926269496722">Google Asistan geçerli kullanıcı hesabı için kullanılamaz.</translation> <translation id="5689633613396158040">Gece Işığı, loş ışıkta ekranınızı daha iyi görmenizi ve daha kolay okumanızı sağlar. Gece Işığı'nın ne zaman açılacağını değiştirmek veya tamamen kapatmak için dokunun.</translation>
diff --git a/ash/system/accessibility/select_to_speak_constants.h b/ash/system/accessibility/select_to_speak_constants.h index 89075c9..bc2deaa 100644 --- a/ash/system/accessibility/select_to_speak_constants.h +++ b/ash/system/accessibility/select_to_speak_constants.h
@@ -20,6 +20,8 @@ kSelectToSpeakSpeechRateFaster, }; +const char kSelectToSpeakSpeedBubbleWindowName[] = "SelectToSpeakSpeedBubble"; + } // namespace ash #endif // ASH_SYSTEM_ACCESSIBILITY_SELECT_TO_SPEAK_CONSTANTS_H_ \ No newline at end of file
diff --git a/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc b/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc index f3b4da5e..a41707d 100644 --- a/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc +++ b/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc
@@ -9,6 +9,7 @@ #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/system/accessibility/floating_menu_utils.h" +#include "ash/system/accessibility/select_to_speak_constants.h" #include "ash/system/tray/tray_background_view.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/unified/unified_system_tray_view.h" @@ -111,7 +112,11 @@ views::Widget* gained_widget = views::Widget::GetWidgetForNativeView(gained_active); - if (gained_widget == bubble_widget_ && menu_view_) { + if (gained_widget == bubble_widget_ && menu_view_ && + (!lost_active || + lost_active->GetName() != kSelectToSpeakSpeedBubbleWindowName)) { + // Reset initial focus of the menu view, unless we're coming from the + // reading speed selector. menu_view_->SetInitialFocus(); } } @@ -141,9 +146,10 @@ void SelectToSpeakMenuBubbleController::OnSpeechRateSelected( double speech_rate) { if (speed_bubble_controller_) { + menu_view_->SetSpeedButtonToggled(false); + menu_view_->SetSpeedButtonFocused(); speed_bubble_controller_->Hide(); speed_bubble_controller_.reset(); - menu_view_->SetSpeedButtonToggled(false); } Shell::Get()->accessibility_controller()->OnSelectToSpeakPanelAction( SelectToSpeakPanelAction::kChangeSpeed, /*value=*/speech_rate);
diff --git a/ash/system/accessibility/select_to_speak_menu_view.cc b/ash/system/accessibility/select_to_speak_menu_view.cc index 61bb1d4..5ec0354 100644 --- a/ash/system/accessibility/select_to_speak_menu_view.cc +++ b/ash/system/accessibility/select_to_speak_menu_view.cc
@@ -217,6 +217,10 @@ pause_button_->RequestFocus(); } +void SelectToSpeakMenuView::SetSpeedButtonFocused() { + speed_button_->RequestFocus(); +} + void SelectToSpeakMenuView::SetSpeedButtonToggled(bool toggled) { speed_button_->SetToggled(toggled); }
diff --git a/ash/system/accessibility/select_to_speak_menu_view.h b/ash/system/accessibility/select_to_speak_menu_view.h index 75102cab..b1bbc07c 100644 --- a/ash/system/accessibility/select_to_speak_menu_view.h +++ b/ash/system/accessibility/select_to_speak_menu_view.h
@@ -54,6 +54,8 @@ void SetInitialFocus(); + void SetSpeedButtonFocused(); + // Sets the speech rate that should be selected. void SetInitialSpeechRate(double initial_speech_rate);
diff --git a/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc b/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc index 9f18abc..297d758 100644 --- a/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc +++ b/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc
@@ -9,6 +9,7 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/shell.h" #include "ash/system/accessibility/floating_menu_utils.h" +#include "ash/system/accessibility/select_to_speak_constants.h" #include "ash/system/accessibility/select_to_speak_speed_view.h" #include "ash/system/tray/tray_background_view.h" #include "ash/system/tray/tray_constants.h" @@ -67,6 +68,8 @@ bubble_widget_ = views::BubbleDialogDelegateView::CreateBubble(bubble_view_); + bubble_widget_->GetNativeView()->SetName( + kSelectToSpeakSpeedBubbleWindowName); TrayBackgroundView::InitializeBubbleAnimations(bubble_widget_); bubble_view_->InitializeAndShowBubble(); } else {
diff --git a/ash/system/accessibility/select_to_speak_speed_bubble_controller_unittest.cc b/ash/system/accessibility/select_to_speak_speed_bubble_controller_unittest.cc index 388a54e8..8173abb1 100644 --- a/ash/system/accessibility/select_to_speak_speed_bubble_controller_unittest.cc +++ b/ash/system/accessibility/select_to_speak_speed_bubble_controller_unittest.cc
@@ -174,4 +174,15 @@ EXPECT_EQ(client.last_select_to_speak_panel_action_value(), 6.2); } +TEST_F(SelectToSpeakSpeedBubbleControllerTest, FocusRestoredToSpeedButton) { + ShowSelectToSpeakSpeedBubble(/*rate=*/1.2); + + GetEventGenerator()->GestureTapAt( + GetOption(5)->GetBoundsInScreen().CenterPoint()); + + FloatingMenuButton* speed_button = + GetMenuButton(SelectToSpeakMenuView::ButtonId::kSpeed); + EXPECT_TRUE(speed_button->HasFocus()); +} + } // namespace ash \ No newline at end of file
diff --git a/ash/system/holding_space/holding_space_drag_util.cc b/ash/system/holding_space/holding_space_drag_util.cc index 9a789a1..fc68eb99 100644 --- a/ash/system/holding_space/holding_space_drag_util.cc +++ b/ash/system/holding_space/holding_space_drag_util.cc
@@ -159,8 +159,8 @@ // painting the background outside content bounds as might otherwise occur // due to pixel rounding. Failure to do so could result in white paint // artifacts. - gfx::Rect bounds(GetContentsBounds()); - bounds.Inset(gfx::Insets(1)); + gfx::RectF bounds(GetContentsBounds()); + bounds.Inset(gfx::InsetsF(0.5f)); cc::PaintFlags flags; flags.setAntiAlias(true); @@ -210,7 +210,7 @@ RoundedImageView::Alignment::kCenter)); icon->SetPreferredSize(gfx::Size(kDragImageItemChipViewIconSize, kDragImageItemChipViewIconSize)); - icon->SetImage(item->image().image_skia(), icon->GetPreferredSize()); + icon->SetImage(item->image().GetImageSkia(icon->GetPreferredSize())); // Label. ScopedLightModeAsDefault scoped_light_mode; @@ -246,7 +246,7 @@ auto* image = AddChildView(std::make_unique<RoundedImageView>( kDragImageItemViewCornerRadius, RoundedImageView::Alignment::kCenter)); image->SetPreferredSize(kDragImageItemScreenshotViewPreferredSize); - image->SetImage(item->image().image_skia(), image->GetPreferredSize()); + image->SetImage(item->image().GetImageSkia(image->GetPreferredSize())); } };
diff --git a/ash/system/holding_space/holding_space_item_chip_view.cc b/ash/system/holding_space/holding_space_item_chip_view.cc index 3f06e6b7..ed0fa29 100644 --- a/ash/system/holding_space/holding_space_item_chip_view.cc +++ b/ash/system/holding_space/holding_space_item_chip_view.cc
@@ -4,6 +4,8 @@ #include "ash/system/holding_space/holding_space_item_chip_view.h" +#include <algorithm> + #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_item.h" #include "ash/public/cpp/rounded_image_view.h" @@ -13,13 +15,54 @@ #include "ui/compositor/paint_recorder.h" #include "ui/gfx/skia_paint_util.h" #include "ui/views/background.h" +#include "ui/views/border.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/metadata/metadata_impl_macros.h" +#include "ui/views/painter.h" namespace ash { +// Appearance. +constexpr int kChildSpacing = 8; +constexpr int kLabelMaskGradientWidth = 16; +constexpr gfx::Insets kLabelMargins(0, 0, 0, /*right=*/2); +constexpr gfx::Insets kPadding(8, 8, 8, /*right=*/10); +constexpr int kPreferredHeight = 40; +constexpr int kPreferredWidth = 160; + +// CirclePainter --------------------------------------------------------------- + +class CirclePainter : public views::Painter { + public: + CirclePainter(SkColor color, const gfx::InsetsF& insets) + : color_(color), insets_(insets) {} + CirclePainter(const CirclePainter&) = delete; + CirclePainter& operator=(const CirclePainter&) = delete; + ~CirclePainter() override = default; + + private: + // views::Painter: + gfx::Size GetMinimumSize() const override { return gfx::Size(); } + + void Paint(gfx::Canvas* canvas, const gfx::Size& size) override { + gfx::RectF bounds{gfx::SizeF(size)}; + bounds.Inset(insets_); + + cc::PaintFlags flags; + flags.setAntiAlias(true); + flags.setColor(color_); + + canvas->DrawCircle( + bounds.CenterPoint(), + std::min(bounds.size().width(), bounds.size().height()) / 2.f, flags); + } + + const SkColor color_; + const gfx::InsetsF insets_; +}; + // HoldingSpaceItemChipView::LabelMaskOwner ------------------------------------ class HoldingSpaceItemChipView::LabelMaskLayerOwner : public ui::LayerDelegate { @@ -57,9 +100,8 @@ flags.setAntiAlias(false); gfx::Point gradient_end(size.width() - kHoldingSpaceIconSize, 0); - gfx::Point gradient_start( - gradient_end.x() - kHoldingSpaceChipLabelMaskGradientWidth, - gradient_end.y()); + gfx::Point gradient_start(gradient_end.x() - kLabelMaskGradientWidth, + gradient_end.y()); flags.setShader(gfx::CreateGradientShader( gradient_start, gradient_end, SK_ColorBLACK, SK_ColorTRANSPARENT)); @@ -79,17 +121,20 @@ const HoldingSpaceItem* item) : HoldingSpaceItemView(delegate, item) { auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, - gfx::Insets(kHoldingSpaceChipPadding), kHoldingSpaceChipChildSpacing)); + views::BoxLayout::Orientation::kHorizontal, kPadding, kChildSpacing)); layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kCenter); - SetPreferredSize(gfx::Size(kHoldingSpaceChipWidth, kHoldingSpaceChipHeight)); + SetPreferredSize(gfx::Size(kPreferredWidth, kPreferredHeight)); image_ = AddChildView(std::make_unique<RoundedImageView>( kHoldingSpaceChipIconSize / 2, RoundedImageView::Alignment::kLeading)); - image_->SetBackground(views::CreateRoundedRectBackground( - SK_ColorWHITE, kHoldingSpaceChipIconSize / 2)); + + // Shrink circular background by a single pixel to prevent painting outside of + // the image which may otherwise occur due to pixel rounding. Failure to do so + // could result in white paint artifacts. + image_->SetBackground(views::CreateBackgroundFromPainter( + std::make_unique<CirclePainter>(SK_ColorWHITE, gfx::InsetsF(0.5f)))); // Subscribe to be notified of changes to `item_`'s image. image_subscription_ = @@ -107,6 +152,7 @@ label_ = label_and_pin_button_container_->AddChildView( holding_space_util::CreateLabel(holding_space_util::LabelStyle::kChip)); + label_->SetBorder(views::CreateEmptyBorder(kLabelMargins)); label_->SetElideBehavior(gfx::ELIDE_MIDDLE); label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); label_->SetText(item->text()); @@ -134,6 +180,13 @@ HoldingSpaceItemChipView::~HoldingSpaceItemChipView() = default; +views::View* HoldingSpaceItemChipView::GetTooltipHandlerForPoint( + const gfx::Point& point) { + // Tooltips for this view are handled by `label_`, which will only show + // tooltips if the underlying text has been elided due to insufficient space. + return HitTestPoint(point) ? label_ : nullptr; +} + void HoldingSpaceItemChipView::OnHoldingSpaceItemUpdated( const HoldingSpaceItem* item) { HoldingSpaceItemView::OnHoldingSpaceItemUpdated(item); @@ -153,9 +206,8 @@ } void HoldingSpaceItemChipView::UpdateImage() { - image_->SetImage( - item()->image().image_skia(), - gfx::Size(kHoldingSpaceChipIconSize, kHoldingSpaceChipIconSize)); + image_->SetImage(item()->image().GetImageSkia( + gfx::Size(kHoldingSpaceChipIconSize, kHoldingSpaceChipIconSize))); SchedulePaint(); }
diff --git a/ash/system/holding_space/holding_space_item_chip_view.h b/ash/system/holding_space/holding_space_item_chip_view.h index f5a1343..3877ec6 100644 --- a/ash/system/holding_space/holding_space_item_chip_view.h +++ b/ash/system/holding_space/holding_space_item_chip_view.h
@@ -38,6 +38,7 @@ class LabelMaskLayerOwner; // HoldingSpaceItemView: + views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override; void OnHoldingSpaceItemUpdated(const HoldingSpaceItem* item) override; void OnPinVisiblityChanged(bool pin_visible) override;
diff --git a/ash/system/holding_space/holding_space_item_chips_container.cc b/ash/system/holding_space/holding_space_item_chips_container.cc index d0c0a15..1c3e51d 100644 --- a/ash/system/holding_space/holding_space_item_chips_container.cc +++ b/ash/system/holding_space/holding_space_item_chips_container.cc
@@ -12,6 +12,10 @@ namespace ash { namespace { +// Appearance. +constexpr int kNumberOfChipsPerRow = 2; +constexpr int kSpacing = 8; + // Need a custom grid layout to facilitate removal of views from the grid, // which can change the number of rows required. views::GridLayout makes this // case difficult. @@ -110,8 +114,8 @@ HoldingSpaceItemChipsContainer::HoldingSpaceItemChipsContainer() { SetLayoutManager(std::make_unique<SimpleGridLayout>( - kHoldingSpaceChipsPerRow, kHoldingSpaceColumnSpacing, - kHoldingSpaceRowSpacing)); + kNumberOfChipsPerRow, /*column_spacing=*/kSpacing, + /*row_spacing=*/kSpacing)); } HoldingSpaceItemChipsContainer::~HoldingSpaceItemChipsContainer() = default;
diff --git a/ash/system/holding_space/holding_space_item_screen_capture_view.cc b/ash/system/holding_space/holding_space_item_screen_capture_view.cc index 96630d1..610fa2b 100644 --- a/ash/system/holding_space/holding_space_item_screen_capture_view.cc +++ b/ash/system/holding_space/holding_space_item_screen_capture_view.cc
@@ -66,9 +66,27 @@ HoldingSpaceItemScreenCaptureView::~HoldingSpaceItemScreenCaptureView() = default; +views::View* HoldingSpaceItemScreenCaptureView::GetTooltipHandlerForPoint( + const gfx::Point& point) { + // Tooltip events should be handled top level, not by descendents. + return HitTestPoint(point) ? this : nullptr; +} + +base::string16 HoldingSpaceItemScreenCaptureView::GetTooltipText( + const gfx::Point& point) const { + return item()->text(); +} + +void HoldingSpaceItemScreenCaptureView::OnHoldingSpaceItemUpdated( + const HoldingSpaceItem* item) { + HoldingSpaceItemView::OnHoldingSpaceItemUpdated(item); + if (this->item() == item) + TooltipTextChanged(); +} + void HoldingSpaceItemScreenCaptureView::UpdateImage() { - image_->SetImage(item()->image().image_skia(), - kHoldingSpaceScreenCaptureSize); + image_->SetImage( + item()->image().GetImageSkia(kHoldingSpaceScreenCaptureSize)); SchedulePaint(); }
diff --git a/ash/system/holding_space/holding_space_item_screen_capture_view.h b/ash/system/holding_space/holding_space_item_screen_capture_view.h index 87ddf45d..86dbe49 100644 --- a/ash/system/holding_space/holding_space_item_screen_capture_view.h +++ b/ash/system/holding_space/holding_space_item_screen_capture_view.h
@@ -30,6 +30,11 @@ ~HoldingSpaceItemScreenCaptureView() override; private: + // HoldingSpaceItemView: + views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override; + base::string16 GetTooltipText(const gfx::Point& point) const override; + void OnHoldingSpaceItemUpdated(const HoldingSpaceItem* item) override; + void UpdateImage(); // Overlays a play icon over `image_`.
diff --git a/ash/system/holding_space/holding_space_tray.cc b/ash/system/holding_space/holding_space_tray.cc index 903cac8f..5daa7d15 100644 --- a/ash/system/holding_space/holding_space_tray.cc +++ b/ash/system/holding_space/holding_space_tray.cc
@@ -59,7 +59,6 @@ kHoldingSpaceIcon, kHoldingSpaceTrayIconSize, AshColorProvider::Get()->GetContentLayerColor( AshColorProvider::ContentLayerType::kIconColorPrimary))); - icon->SetTooltipText(l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE)); icon->SetPreferredSize(gfx::Size(kTrayItemSize, kTrayItemSize)); return icon; } @@ -111,11 +110,18 @@ return l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_A11Y_NAME); } +views::View* HoldingSpaceTray::GetTooltipHandlerForPoint( + const gfx::Point& point) { + // Tooltip events should be handled top level, not by descendents. + return HitTestPoint(point) ? this : nullptr; +} + +base::string16 HoldingSpaceTray::GetTooltipText(const gfx::Point& point) const { + return l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE); +} + void HoldingSpaceTray::HandleLocaleChange() { - default_tray_icon_->SetTooltipText( - l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE)); - if (previews_tray_icon_) - previews_tray_icon_->OnLocaleChanged(); + TooltipTextChanged(); } void HoldingSpaceTray::HideBubbleWithView(const TrayBubbleView* bubble_view) {} @@ -195,12 +201,16 @@ } } +void HoldingSpaceTray::FirePreviewsUpdateTimerIfRunningForTesting() { + if (previews_update_.IsRunning()) + previews_update_.FireNow(); +} + void HoldingSpaceTray::UpdateVisibility() { HoldingSpaceModel* model = HoldingSpaceController::Get()->model(); LoginStatus login_status = shelf()->GetStatusAreaWidget()->login_status(); const bool in_active_session = login_status != LoginStatus::NOT_LOGGED_IN && login_status != LoginStatus::LOCKED; - if (!model || !in_active_session) { SetVisiblePreferred(false); return; @@ -378,6 +388,9 @@ DCHECK(previews_tray_icon_); previews_tray_icon_->SetVisible(show_previews); + + if (!show_previews) + previews_update_.Stop(); } void HoldingSpaceTray::SchedulePreviewsIconUpdate() {
diff --git a/ash/system/holding_space/holding_space_tray.h b/ash/system/holding_space/holding_space_tray.h index 2cc03fb..935accb 100644 --- a/ash/system/holding_space/holding_space_tray.h +++ b/ash/system/holding_space/holding_space_tray.h
@@ -58,6 +58,8 @@ // TrayBackgroundView: void ClickedOutsideBubble() override; base::string16 GetAccessibleNameForTray() override; + views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override; + base::string16 GetTooltipText(const gfx::Point& point) const override; void HandleLocaleChange() override; void HideBubbleWithView(const TrayBubbleView* bubble_view) override; void AnchorUpdated() override; @@ -72,6 +74,8 @@ use_zero_previews_update_delay_ = zero_delay; } + void FirePreviewsUpdateTimerIfRunningForTesting(); + private: void UpdateVisibility();
diff --git a/ash/system/holding_space/holding_space_tray_icon.cc b/ash/system/holding_space/holding_space_tray_icon.cc index 4f0c4e6..5370da4 100644 --- a/ash/system/holding_space/holding_space_tray_icon.cc +++ b/ash/system/holding_space/holding_space_tray_icon.cc
@@ -121,15 +121,6 @@ removed_previews_.clear(); } -void HoldingSpaceTrayIcon::OnLocaleChanged() { - TooltipTextChanged(); -} - -base::string16 HoldingSpaceTrayIcon::GetTooltipText( - const gfx::Point& point) const { - return l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_TITLE); -} - int HoldingSpaceTrayIcon::GetHeightForWidth(int width) const { // The parent for this view (`TrayContainer`) uses a `BoxLayout` for its // `LayoutManager`. When the shelf orientation is vertical, the `BoxLayout`
diff --git a/ash/system/holding_space/holding_space_tray_icon.h b/ash/system/holding_space/holding_space_tray_icon.h index e738b488..4a358d6 100644 --- a/ash/system/holding_space/holding_space_tray_icon.h +++ b/ash/system/holding_space/holding_space_tray_icon.h
@@ -43,9 +43,6 @@ // 4. Animate new items in. void UpdatePreviews(const std::vector<const HoldingSpaceItem*> items); - // Invoked when the system locale has changed. - void OnLocaleChanged(); - // Clears the icon. void Clear(); @@ -63,7 +60,6 @@ class ResizeAnimation; // views::View: - base::string16 GetTooltipText(const gfx::Point& point) const override; int GetHeightForWidth(int width) const override; gfx::Size CalculatePreferredSize() const override;
diff --git a/ash/system/holding_space/holding_space_tray_icon_preview.cc b/ash/system/holding_space/holding_space_tray_icon_preview.cc index 9c89059..6f20f1dd 100644 --- a/ash/system/holding_space/holding_space_tray_icon_preview.cc +++ b/ash/system/holding_space/holding_space_tray_icon_preview.cc
@@ -4,6 +4,8 @@ #include "ash/system/holding_space/holding_space_tray_icon_preview.h" +#include <algorithm> + #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_image.h" #include "ash/public/cpp/holding_space/holding_space_item.h" @@ -20,12 +22,16 @@ #include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_skia_source.h" +#include "ui/gfx/shadow_util.h" #include "ui/gfx/skia_paint_util.h" namespace ash { namespace { +// Appearance. +constexpr int kElevation = 1; + // The duration of each of the preview icon bounce animation. constexpr base::TimeDelta kBounceAnimationSegmentDuration = base::TimeDelta::FromMilliseconds(250); @@ -43,7 +49,15 @@ // Returns the preview icon contents size. gfx::Size GetPreviewSize() { - return gfx::Size(kTrayItemSize, kTrayItemSize); + return gfx::Size(kHoldingSpaceTrayIconPreviewSize, + kHoldingSpaceTrayIconPreviewSize); +} + +// Returns the shadow details for painting elevation. +const gfx::ShadowDetails& GetShadowDetails() { + const gfx::Size size(GetPreviewSize()); + const int radius = std::min(size.height(), size.width()) / 2; + return gfx::ShadowDetails::Get(kElevation, radius); } // Returns whether the specified `shelf_alignment` is horizontal. @@ -82,26 +96,12 @@ gfx::ImageSkiaRep GetImageForScale(float scale) override { gfx::ImageSkia image = item_image_; - // Crop to square (if necessary). - gfx::Size square_size = image.size(); - square_size.SetToMin(gfx::Size(square_size.height(), square_size.width())); - if (image.size() != square_size) { - gfx::Rect square_rect(image.size()); - square_rect.ClampToCenteredSize(square_size); - image = gfx::ImageSkiaOperations::ExtractSubset(image, square_rect); - } - - // Resize to contents size (if necessary). - gfx::Size contents_size = GetPreviewSize(); - if (image.size() != contents_size) { - image = gfx::ImageSkiaOperations::CreateResizedImage( - image, skia::ImageOperations::ResizeMethod::RESIZE_BEST, - contents_size); - } + // The `image` should already be sized appropriately. + DCHECK_EQ(image.size(), GetPreviewSize()); // Clip to circle. - // NOTE: Since `image` has already been cropped to a square, the center - // x-coordinate, center y-coordinate, and radius all equal the same value. + // NOTE: Since `image` is a square, the center x-coordinate, center + // y-coordinate, and radius all equal the same value. const int radius = image.width() / 2; gfx::Canvas canvas(image.size(), scale, /*is_opaque=*/false); canvas.ClipPath(SkPath::Circle(/*cx=*/radius, /*cy=*/radius, radius), @@ -122,9 +122,10 @@ views::View* container, const HoldingSpaceItem* item) : shelf_(shelf), container_(container), item_(item) { + const gfx::Size size(GetPreviewSize()); contents_image_ = gfx::ImageSkia( - std::make_unique<ContentsImageSource>(item->image().image_skia()), - GetPreviewSize()); + std::make_unique<ContentsImageSource>(item->image().GetImageSkia(size)), + size); image_subscription_ = item->image().AddImageSkiaChangedCallback(base::BindRepeating( &HoldingSpaceTrayIconPreview::OnHoldingSpaceItemImageChanged, @@ -319,13 +320,16 @@ cc::PaintFlags flags; flags.setAntiAlias(true); flags.setColor(SK_ColorWHITE); + flags.setLooper(gfx::CreateShadowDrawLooper(GetShadowDetails().values)); canvas->DrawCircle( - contents_bounds.CenterPoint(), - std::min(contents_bounds.width(), contents_bounds.height()) / 2 - 1, + gfx::PointF(contents_bounds.CenterPoint()), + std::min(contents_bounds.width(), contents_bounds.height()) / 2 - 0.5, flags); // Contents. + // NOTE: The `contents_image_` should already be resized. if (!contents_image_.isNull()) { + DCHECK_EQ(contents_image_.size(), contents_bounds.size()); canvas->DrawImageInt(contents_image_, contents_bounds.x(), contents_bounds.y()); } @@ -360,9 +364,10 @@ } void HoldingSpaceTrayIconPreview::OnHoldingSpaceItemImageChanged() { + const gfx::Size size(GetPreviewSize()); contents_image_ = gfx::ImageSkia( - std::make_unique<ContentsImageSource>(item_->image().image_skia()), - GetPreviewSize()); + std::make_unique<ContentsImageSource>(item_->image().GetImageSkia(size)), + size); InvalidateLayer(); }
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc index a07debaf..3985105 100644 --- a/ash/system/holding_space/holding_space_tray_unittest.cc +++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -17,6 +17,9 @@ #include "ash/public/cpp/holding_space/holding_space_model.h" #include "ash/public/cpp/holding_space/holding_space_prefs.h" #include "ash/public/cpp/holding_space/holding_space_test_api.h" +#include "ash/shelf/shelf.h" +#include "ash/shelf/shelf_widget.h" +#include "ash/shell.h" #include "ash/system/holding_space/holding_space_item_view.h" #include "ash/test/ash_test_base.h" #include "base/files/file_path.h" @@ -37,6 +40,11 @@ // Helpers --------------------------------------------------------------------- +// A wrapper around `views::View::GetVisible()` with a null check for `view`. +bool IsViewVisible(views::View* view) { + return view && view->GetVisible(); +} + void Click(views::View* view, int flags) { auto* root_window = view->GetWidget()->GetNativeWindow()->GetRootWindow(); ui::test::EventGenerator event_generator(root_window); @@ -55,7 +63,7 @@ HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, /*placeholder=*/gfx::ImageSkia(), + HoldingSpaceImage::GetMaxSizeForType(type), file_path, /*async_bitmap_resolver=*/base::DoNothing()); } @@ -139,6 +147,12 @@ HoldingSpaceItem* AddItem(HoldingSpaceItem::Type type, const base::FilePath& path) { + return AddItemToModel(model(), type, path); + } + + HoldingSpaceItem* AddItemToModel(HoldingSpaceModel* target_model, + HoldingSpaceItem::Type type, + const base::FilePath& path) { GURL file_system_url( base::StrCat({"filesystem:", path.BaseName().value()})); std::unique_ptr<HoldingSpaceItem> item = @@ -146,10 +160,9 @@ type, path, file_system_url, base::BindOnce(&CreateStubHoldingSpaceImage)); HoldingSpaceItem* item_ptr = item.get(); - model()->AddItem(std::move(item)); + target_model->AddItem(std::move(item)); return item_ptr; } - HoldingSpaceItem* AddPartiallyInitializedItem(HoldingSpaceItem::Type type, const base::FilePath& path) { // Create a holding space item, and use it to create a serialized item @@ -195,6 +208,30 @@ GetSessionControllerClient()->GetUserPrefService(user_account)); } + void SwitchToSecondaryUser(const std::string& user_id, + HoldingSpaceClient* client, + HoldingSpaceModel* model) { + AccountId user_account = AccountId::FromUserEmail(user_id); + HoldingSpaceController::Get()->RegisterClientAndModelForUser(user_account, + client, model); + GetSessionControllerClient()->AddUserSession(user_id); + + holding_space_prefs::MarkTimeOfFirstAvailability( + GetSessionControllerClient()->GetUserPrefService(user_account)); + holding_space_prefs::MarkTimeOfFirstAdd( + GetSessionControllerClient()->GetUserPrefService(user_account)); + holding_space_prefs::MarkTimeOfFirstPin( + GetSessionControllerClient()->GetUserPrefService(user_account)); + + GetSessionControllerClient()->SwitchActiveUser(user_account); + } + + void UnregisterModelForUser(const std::string& user_id) { + AccountId user_account = AccountId::FromUserEmail(user_id); + HoldingSpaceController::Get()->RegisterClientAndModelForUser( + user_account, nullptr, nullptr); + } + bool IsPreviewsFeatureEnabled() const { return GetParam(); } HoldingSpaceTestApi* test_api() { return test_api_.get(); } @@ -205,6 +242,13 @@ HoldingSpaceModel* model() { return &holding_space_model_; } + HoldingSpaceTray* GetTray() { + return Shelf::ForWindow(Shell::GetRootWindowForNewWindows()) + ->shelf_widget() + ->status_area_widget() + ->holding_space_tray(); + } + private: std::unique_ptr<HoldingSpaceTestApi> test_api_; testing::NiceMock<MockHoldingSpaceClient> holding_space_client_; @@ -216,6 +260,7 @@ TEST_P(HoldingSpaceTrayTest, ShowTrayButtonOnFirstUse) { StartSession(/*pre_mark_time_of_first_add=*/false); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); // The tray button should *not* be shown for users that have never added // anything to the holding space. @@ -225,7 +270,12 @@ HoldingSpaceItem* item = AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake")); MarkTimeOfFirstAdd(); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); // Show the bubble - both the pinned files and recent files child bubbles // should be shown. @@ -242,6 +292,9 @@ test_api()->Close(); EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_TRUE(IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_FALSE(IsViewVisible(test_api()->GetPreviewsTrayIcon())); + test_api()->Show(); // Add and remove a pinned item. @@ -256,6 +309,92 @@ EXPECT_FALSE(test_api()->IsShowingInShelf()); } +TEST_P(HoldingSpaceTrayTest, HideButtonWhenModelDetached) { + MarkTimeOfFirstPin(); + StartSession(); + + // The tray button should be hidden if the user has previously pinned an item, + // and the holding space is empty. + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + // Add a download item - the button should be shown. + AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_1")); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + + SwitchToSecondaryUser("user@secondary", /*client=*/nullptr, + /*model=*/nullptr); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); + + EXPECT_FALSE(test_api()->IsShowingInShelf()); + UnregisterModelForUser("user@secondary"); +} + +TEST_P(HoldingSpaceTrayTest, HideButtonOnChangeToEmptyModel) { + MarkTimeOfFirstPin(); + StartSession(); + + // The tray button should be hidden if the user has previously pinned an item, + // and the holding space is empty. + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + // Add a download item - the button should be shown. + AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_1")); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + + HoldingSpaceModel secondary_holding_space_model; + SwitchToSecondaryUser("user@secondary", /*client=*/nullptr, + /*model=*/&secondary_holding_space_model); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + AddItemToModel(&secondary_holding_space_model, + HoldingSpaceItem::Type::kDownload, + base::FilePath("/tmp/fake_2")); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + + UnregisterModelForUser("user@secondary"); +} + +TEST_P(HoldingSpaceTrayTest, HideButtonOnChangeToNonEmptyModel) { + MarkTimeOfFirstPin(); + StartSession(); + + // The tray button should be hidden if the user has previously pinned an item, + // and the holding space is empty. + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + HoldingSpaceModel secondary_holding_space_model; + AddItemToModel(&secondary_holding_space_model, + HoldingSpaceItem::Type::kDownload, + base::FilePath("/tmp/fake_2")); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + SwitchToSecondaryUser("user@secondary", /*client=*/nullptr, + /*model=*/&secondary_holding_space_model); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + + UnregisterModelForUser("user@secondary"); +} + TEST_P(HoldingSpaceTrayTest, AddingItemShowsTrayBubble) { MarkTimeOfFirstPin(); StartSession(); @@ -267,25 +406,45 @@ // Add a download item - the button should be shown. HoldingSpaceItem* item_1 = AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_1")); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + // Remove the only item - the button should be hidden. model()->RemoveItem(item_1->id()); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_FALSE(test_api()->IsShowingInShelf()); // Add a screen capture item - the button should be shown. HoldingSpaceItem* item_2 = AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_2")); EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + // Remove the only item - the button should be hidden. model()->RemoveItem(item_2->id()); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_FALSE(test_api()->IsShowingInShelf()); // Add a pinned item - the button should be shown. HoldingSpaceItem* item_3 = AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_3")); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); + // Remove the only item - the button should be hidden. model()->RemoveItem(item_3->id()); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_FALSE(test_api()->IsShowingInShelf()); } @@ -309,15 +468,22 @@ EXPECT_FALSE(test_api()->IsShowingInShelf()); AddPartiallyInitializedItem(HoldingSpaceItem::Type::kPinnedFile, base::FilePath("/tmp/fake_4")); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_FALSE(test_api()->IsShowingInShelf()); // Finalize one item, and verify the tray button gets shown. model()->FinalizeOrRemoveItem(item_2->id(), GURL("filesystem:fake_2")); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_TRUE(test_api()->IsShowingInShelf()); + EXPECT_EQ(!IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetDefaultTrayIcon())); + EXPECT_EQ(IsPreviewsFeatureEnabled(), + IsViewVisible(test_api()->GetPreviewsTrayIcon())); // Remove the finalized item - the shelf button should get hidden. model()->RemoveItem(item_2->id()); + GetTray()->FirePreviewsUpdateTimerIfRunningForTesting(); EXPECT_FALSE(test_api()->IsShowingInShelf()); }
diff --git a/ash/system/network/tray_network_state_model.cc b/ash/system/network/tray_network_state_model.cc index c71254c..7fc789b 100644 --- a/ash/system/network/tray_network_state_model.cc +++ b/ash/system/network/tray_network_state_model.cc
@@ -174,10 +174,10 @@ impl_->SetNetworkTypeEnabledState(type, enabled); } -bool TrayNetworkStateModel::IsBuiltinVpnEnabled() const { +bool TrayNetworkStateModel::IsBuiltinVpnProhibited() const { return TrayNetworkStateModel::GetDeviceState( chromeos::network_config::mojom::NetworkType::kVPN) == - chromeos::network_config::mojom::DeviceStateType::kEnabled; + chromeos::network_config::mojom::DeviceStateType::kProhibited; } chromeos::network_config::mojom::CrosNetworkConfig*
diff --git a/ash/system/network/tray_network_state_model.h b/ash/system/network/tray_network_state_model.h index 80e8f36..48d08064 100644 --- a/ash/system/network/tray_network_state_model.h +++ b/ash/system/network/tray_network_state_model.h
@@ -46,9 +46,9 @@ chromeos::network_config::mojom::NetworkType type, bool enabled); - // Returns true if built-in VPN is enabled. - // Note: Currently only built-in VPNs can be disabled by policy. - bool IsBuiltinVpnEnabled() const; + // Returns true if built-in VPN is prohibited. + // Note: Currently only built-in VPNs can be prohibited by policy. + bool IsBuiltinVpnProhibited() const; // This used to be inlined but now requires details from the Impl class. chromeos::network_config::mojom::CrosNetworkConfig* cros_network_config();
diff --git a/ash/system/network/vpn_feature_pod_controller.cc b/ash/system/network/vpn_feature_pod_controller.cc index d8973fc0..f53e8e3 100644 --- a/ash/system/network/vpn_feature_pod_controller.cc +++ b/ash/system/network/vpn_feature_pod_controller.cc
@@ -36,7 +36,7 @@ return true; // Note: At this point, only built-in VPNs are considered. - return model->IsBuiltinVpnEnabled() && model->has_vpn(); + return !model->IsBuiltinVpnProhibited() && model->has_vpn(); } } // namespace
diff --git a/ash/system/network/vpn_list_view.cc b/ash/system/network/vpn_list_view.cc index 8c70d3a1..1ad37729 100644 --- a/ash/system/network/vpn_list_view.cc +++ b/ash/system/network/vpn_list_view.cc
@@ -440,8 +440,8 @@ views::View* provider_view = nullptr; // Note: Currently only built-in VPNs can be disabled by policy. - bool vpn_enabled = - vpn_provider->type != VpnType::kOpenVPN || model()->IsBuiltinVpnEnabled(); + bool vpn_enabled = vpn_provider->type != VpnType::kOpenVPN || + !model()->IsBuiltinVpnProhibited(); provider_view = new VPNListProviderEntry(vpn_provider, list_empty_, vpn_name, vpn_enabled,
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index 5adfe22c..db25e162 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -3955,7 +3955,7 @@ // Remove the active desk. The visible on all desks windows should be on // |desk_2|. - controller->RemoveDesk(desk_1, DesksCreationRemovalSource::kKeyboard); + RemoveDesk(desk_1); auto desk_2_children = desk_2->GetDeskContainerForRoot(root)->children(); EXPECT_EQ(2u, desk_2_children.size()); EXPECT_TRUE(IsStackedBelow(win0.get(), win1.get()));
diff --git a/ash/wm/window_properties.h b/ash/wm/window_properties.h index b0c9278..4a88316d 100644 --- a/ash/wm/window_properties.h +++ b/ash/wm/window_properties.h
@@ -7,7 +7,6 @@ #include "ash/ash_export.h" #include "ui/base/class_property.h" -#include "ui/base/ui_base_types.h" namespace aura { template <typename T>
diff --git a/base/allocator/allocator_shim.h b/base/allocator/allocator_shim.h index 2cdcfad..9a33d005 100644 --- a/base/allocator/allocator_shim.h +++ b/base/allocator/allocator_shim.h
@@ -8,6 +8,7 @@ #include <stddef.h> #include "base/allocator/buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_features.h" #include "base/base_export.h" #include "build/build_config.h" @@ -163,9 +164,8 @@ BASE_EXPORT void EnablePartitionAllocMemoryReclaimer(); #endif -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN BASE_EXPORT void EnablePCScan(); -BASE_EXPORT void EnablePCScanIfNeeded(); #endif } // namespace allocator
diff --git a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc index 20c07457..d93b4ced 100644 --- a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -278,10 +278,12 @@ AlignedAllocator()); } +#if ALLOW_PCSCAN void EnablePCScan() { Allocator()->EnablePCScan(); AlignedAllocator()->EnablePCScan(); } +#endif #if defined(OS_WIN) // Call this as soon as possible during startup. @@ -293,12 +295,6 @@ } #endif // defined(OS_WIN) -void EnablePCScanIfNeeded() { - if (!features::IsPartitionAllocPCScanEnabled()) - return; - EnablePCScan(); -} - } // namespace allocator } // namespace base
diff --git a/base/allocator/partition_allocator/partition_alloc_features.cc b/base/allocator/partition_allocator/partition_alloc_features.cc index a32aa19..66e834d 100644 --- a/base/allocator/partition_allocator/partition_alloc_features.cc +++ b/base/allocator/partition_allocator/partition_alloc_features.cc
@@ -20,16 +20,18 @@ FEATURE_ENABLED_BY_DEFAULT}; #endif +#if ALLOW_PCSCAN // If enabled, PCScan is turned on by default for all partitions that don't // disable it explicitly. const Feature kPartitionAllocPCScan{"PartitionAllocPCScan", FEATURE_DISABLED_BY_DEFAULT}; +#endif // ALLOW_PCSCAN #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) // If enabled, PCScan is turned on only for the browser's malloc partition. const Feature kPartitionAllocPCScanBrowserOnly{ "PartitionAllocPCScanBrowserOnly", FEATURE_DISABLED_BY_DEFAULT}; -#endif +#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) } // namespace features } // namespace base
diff --git a/base/allocator/partition_allocator/partition_alloc_features.h b/base/allocator/partition_allocator/partition_alloc_features.h index cada8485..ab9ae7e 100644 --- a/base/allocator/partition_allocator/partition_alloc_features.h +++ b/base/allocator/partition_allocator/partition_alloc_features.h
@@ -20,6 +20,12 @@ #include <VersionHelpers.h> #endif +#if defined(PA_HAS_64_BITS_POINTERS) && !ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR +#define ALLOW_PCSCAN 1 +#else +#define ALLOW_PCSCAN 0 +#endif + namespace base { struct Feature; @@ -27,10 +33,13 @@ namespace features { extern const BASE_EXPORT Feature kPartitionAllocGigaCage; + +#if ALLOW_PCSCAN extern const BASE_EXPORT Feature kPartitionAllocPCScan; +#endif // ALLOW_PCSCAN #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) extern const BASE_EXPORT Feature kPartitionAllocPCScanBrowserOnly; -#endif +#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) ALWAYS_INLINE bool IsPartitionAllocGigaCageEnabled() { #if defined(PA_HAS_64_BITS_POINTERS) && defined(OS_WIN) @@ -64,24 +73,6 @@ #endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) } -ALWAYS_INLINE bool IsPartitionAllocPCScanEnabled() { -#if defined(PA_HAS_64_BITS_POINTERS) && !ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR - return FeatureList::IsEnabled(kPartitionAllocPCScan); -#else // PA_HAS_64_BITS_POINTERS - return false; -#endif -} - -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) -ALWAYS_INLINE bool IsPartitionAllocPCScanBrowserOnlyEnabled() { -#if defined(PA_HAS_64_BITS_POINTERS) && !ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR - return FeatureList::IsEnabled(kPartitionAllocPCScanBrowserOnly); -#else // PA_HAS_64_BITS_POINTERS - return false; -#endif -} -#endif - } // namespace features } // namespace base
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index be331b3e..b266ceb 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -4,10 +4,10 @@ #include "base/allocator/partition_allocator/partition_root.h" -#include "base/allocator/partition_allocator/checked_ptr_support.h" #include "base/allocator/partition_allocator/oom.h" #include "base/allocator/partition_allocator/page_allocator.h" #include "base/allocator/partition_allocator/partition_alloc_check.h" +#include "base/allocator/partition_allocator/partition_alloc_features.h" #include "base/allocator/partition_allocator/partition_bucket.h" #include "base/allocator/partition_allocator/partition_cookie.h" #include "base/allocator/partition_allocator/partition_oom.h" @@ -25,10 +25,9 @@ typename PartitionRoot<thread_safe>::PCScanMode PartitionOptionsToPCScanMode( PartitionOptions::PCScan opt) { using Root = PartitionRoot<thread_safe>; - // PCScan is currently only supported on 64-bit systems. - // Mark partitions non-scannable on 32-bit systems unconditionally, so that - // address space for quarantine bitmaps doesn't get reserved. -#if defined(PA_HAS_64_BITS_POINTERS) && !ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR + // Mark partitions non-scannable unconditionally when PCScan isn't allowed, so + // that address space for quarantine bitmaps doesn't get reserved. +#if ALLOW_PCSCAN switch (opt) { case PartitionOptions::PCScan::kAlwaysDisabled: return Root::PCScanMode::kNonScannable;
diff --git a/base/allocator/partition_allocator/pcscan_unittest.cc b/base/allocator/partition_allocator/pcscan_unittest.cc index 16de3e06..05f8dc7 100644 --- a/base/allocator/partition_allocator/pcscan_unittest.cc +++ b/base/allocator/partition_allocator/pcscan_unittest.cc
@@ -4,13 +4,15 @@ #include "base/allocator/partition_allocator/partition_root.h" #if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) -#if defined(PA_HAS_64_BITS_POINTERS) #include "base/allocator/partition_allocator/pcscan.h" #include "base/allocator/partition_allocator/partition_alloc.h" +#include "base/allocator/partition_allocator/partition_alloc_features.h" #include "testing/gtest/include/gtest/gtest.h" +#if ALLOW_PCSCAN + namespace base { namespace internal { @@ -330,5 +332,5 @@ } // namespace internal } // namespace base -#endif // defined(PA_HAS_64_BITS_POINTERS) +#endif // ALLOW_PCSCAN #endif // defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java index b405d92..0f403f9 100644 --- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java +++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -112,7 +112,7 @@ private final Object mNonMainDexLock = new Object(); // Mediates all communication between Linker instances in different processes. - private final MultiProcessMediator mMessageHandler = new MultiProcessMediator(); + private final MultiProcessMediator mMediator = new MultiProcessMediator(); // Guards all the fields below. private final Object mLock = new Object(); @@ -248,7 +248,7 @@ } public final MultiProcessMediator getMediator() { - return mMessageHandler; + return mMediator; } /**
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc index a4de2af9..1368e5b1 100644 --- a/base/files/important_file_writer.cc +++ b/base/files/important_file_writer.cc
@@ -124,12 +124,9 @@ if (tmp_file.IsValid()) { if (tmp_file.DeleteOnClose(true)) return; - // The file was opened with exclusive r/w access, so it would be very odd - // for this to fail. - UmaHistogramExactLinearWithSuffix( - "ImportantFile.DeleteOnCloseError", histogram_suffix, - -File::GetLastFileError(), -File::FILE_ERROR_MAX); - // Go ahead and close the file. The call to DeleteFile below will basically + // The file was opened with exclusive r/w access, so failures are primarily + // due to I/O errors or other phenomena out of the process's control. Go + // ahead and close the file. The call to DeleteFile below will basically // repeat the above, but maybe it will somehow succeed. tmp_file.Close(); }
diff --git a/base/metrics/field_trial_param_associator.cc b/base/metrics/field_trial_param_associator.cc index 8414b524..3dbc5516 100644 --- a/base/metrics/field_trial_param_associator.cc +++ b/base/metrics/field_trial_param_associator.cc
@@ -39,16 +39,13 @@ return true; } -bool FieldTrialParamAssociator::GetFieldTrialParams( - const std::string& trial_name, - FieldTrialParams* params) { - FieldTrial* field_trial = FieldTrialList::Find(trial_name); +bool FieldTrialParamAssociator::GetFieldTrialParams(FieldTrial* field_trial, + FieldTrialParams* params) { if (!field_trial) return false; - // First try the local map, falling back to getting it from shared memory. - if (GetFieldTrialParamsWithoutFallback(trial_name, field_trial->group_name(), - params)) { + if (GetFieldTrialParamsWithoutFallback(field_trial->trial_name(), + field_trial->group_name(), params)) { return true; }
diff --git a/base/metrics/field_trial_param_associator.h b/base/metrics/field_trial_param_associator.h index 27c5904..df507973 100644 --- a/base/metrics/field_trial_param_associator.h +++ b/base/metrics/field_trial_param_associator.h
@@ -33,9 +33,9 @@ const FieldTrialParams& params); // Gets the parameters for a field trial and its chosen group. If not found in - // field_trial_params_, then tries to looks it up in shared memory. - bool GetFieldTrialParams(const std::string& trial_name, - FieldTrialParams* params); + // field_trial_params_, then tries to looks it up in shared memory. Returns + // false if no params are available or the passed |field_trial| is null. + bool GetFieldTrialParams(FieldTrial* field_trial, FieldTrialParams* params); // Gets the parameters for a field trial and its chosen group. Does not // fallback to looking it up in shared memory. This should only be used if you
diff --git a/base/metrics/field_trial_params.cc b/base/metrics/field_trial_params.cc index 2f985c94..608d5d0 100644 --- a/base/metrics/field_trial_params.cc +++ b/base/metrics/field_trial_params.cc
@@ -86,8 +86,9 @@ bool GetFieldTrialParams(const std::string& trial_name, FieldTrialParams* params) { - return FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams( - trial_name, params); + FieldTrial* trial = FieldTrialList::Find(trial_name); + return FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(trial, + params); } bool GetFieldTrialParamsByFeature(const Feature& feature, @@ -96,10 +97,8 @@ return false; FieldTrial* trial = FeatureList::GetFieldTrial(feature); - if (!trial) - return false; - - return GetFieldTrialParams(trial->trial_name(), params); + return FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(trial, + params); } std::string GetFieldTrialParamValue(const std::string& trial_name,
diff --git a/base/metrics/field_trial_unittest.cc b/base/metrics/field_trial_unittest.cc index 6fbddd0..07fbdd2 100644 --- a/base/metrics/field_trial_unittest.cc +++ b/base/metrics/field_trial_unittest.cc
@@ -1275,8 +1275,7 @@ // Check that we fetch the param from shared memory properly. std::map<std::string, std::string> new_params; - FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(trial_name, - &new_params); + GetFieldTrialParams(trial_name, &new_params); EXPECT_EQ("value1", new_params["key1"]); EXPECT_EQ("value2", new_params["key2"]); EXPECT_EQ(2U, new_params.size()); @@ -1315,8 +1314,7 @@ // Check that there are no params associated with the field trial anymore. std::map<std::string, std::string> new_params; - FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(trial_name, - &new_params); + GetFieldTrialParams(trial_name, &new_params); EXPECT_EQ(0U, new_params.size()); // Now duplicate the handle so we can easily check that the trial is still
diff --git a/base/strings/string16.cc b/base/strings/string16.cc index 64a5951..60f26f3 100644 --- a/base/strings/string16.cc +++ b/base/strings/string16.cc
@@ -4,86 +4,28 @@ #include "base/strings/string16.h" -#if defined(WCHAR_T_IS_UTF16) && !defined(_AIX) +#include <string> -#error This file should not be used on 2-byte wchar_t systems -// If this winds up being needed on 2-byte wchar_t systems, either the -// definitions below can be used, or the host system's wide character -// functions like wmemcmp can be wrapped. +#include "base/strings/utf_string_conversions.h" -#elif defined(WCHAR_T_IS_UTF32) - -#include <string.h> - -#include <ostream> - -#include "base/strings/string_piece.h" +#if defined(WCHAR_T_IS_UTF32) +std::ostream& std::operator<<(std::ostream& out, const std::u16string& str16) { + return out << base::UTF16ToUTF8(str16); +} +#endif namespace base { int c16memcmp(const char16* s1, const char16* s2, size_t n) { - // We cannot call memcmp because that changes the semantics. - while (n-- > 0) { - if (*s1 != *s2) { - // We cannot use (*s1 - *s2) because char16 is unsigned. - return ((*s1 < *s2) ? -1 : 1); - } - ++s1; - ++s2; - } - return 0; + return std::char_traits<char16>::compare(s1, s2, n); } size_t c16len(const char16* s) { - const char16 *s_orig = s; - while (*s) { - ++s; - } - return s - s_orig; -} - -const char16* c16memchr(const char16* s, char16 c, size_t n) { - while (n-- > 0) { - if (*s == c) { - return s; - } - ++s; - } - return nullptr; -} - -char16* c16memmove(char16* s1, const char16* s2, size_t n) { - return static_cast<char16*>(memmove(s1, s2, n * sizeof(char16))); + return std::char_traits<char16>::length(s); } char16* c16memcpy(char16* s1, const char16* s2, size_t n) { - return static_cast<char16*>(memcpy(s1, s2, n * sizeof(char16))); + return std::char_traits<char16>::copy(s1, s2, n); } -char16* c16memset(char16* s, char16 c, size_t n) { - char16 *s_orig = s; - while (n-- > 0) { - *s = c; - ++s; - } - return s_orig; -} - -namespace string16_internals { - -std::ostream& operator<<(std::ostream& out, const string16& str) { - return out << base::StringPiece16(str); -} - -void PrintTo(const string16& str, std::ostream* out) { - *out << str; -} - -} // namespace string16_internals - } // namespace base - -template class std:: - basic_string<base::char16, base::string16_internals::string16_char_traits>; - -#endif // WCHAR_T_IS_UTF32
diff --git a/base/strings/string16.h b/base/strings/string16.h index 3cb6c7c..212b01d 100644 --- a/base/strings/string16.h +++ b/base/strings/string16.h
@@ -31,6 +31,7 @@ #include <stdio.h> #include <functional> +#include <ostream> #include <string> #include "base/base_export.h" @@ -42,188 +43,40 @@ // a literal string. This indirection allows for an easier migration of // base::char16 to char16_t on platforms where WCHAR_T_IS_UTF16, as only a one // character change to the macro will be necessary. -// This macro does not exist when WCHAR_T_IS_UTF32, as it is currently not -// possible to create a char array form a literal in this case. // TODO(https://crbug.com/911896): Remove this macro once base::char16 is // char16_t on all platforms. #define STRING16_LITERAL(x) L##x namespace base { - -typedef wchar_t char16; -typedef std::wstring string16; - +using string16 = std::wstring; } // namespace base -#elif defined(WCHAR_T_IS_UTF32) +#else -#include <wchar.h> // for mbstate_t +#define STRING16_LITERAL(x) u##x + +namespace base { +using string16 = std::u16string; +} // namespace base + +// TODO(crbug.com/911896): Move this logging logic to base/logging.h. +namespace std { +BASE_EXPORT std::ostream& operator<<(std::ostream& out, + const std::u16string& str16); +} // namespace std + +#endif // WCHAR_T_IS_UTF16 namespace base { -typedef uint16_t char16; +using char16 = ::base::string16::value_type; -// char16 versions of the functions required by string16_char_traits; these -// are based on the wide character functions of similar names ("w" or "wcs" -// instead of "c16"). +// TODO(crbug.com/911896): Remove these functions in favor of using +// std::char_traits<base::char16> directly. BASE_EXPORT int c16memcmp(const char16* s1, const char16* s2, size_t n); BASE_EXPORT size_t c16len(const char16* s); -BASE_EXPORT const char16* c16memchr(const char16* s, char16 c, size_t n); -BASE_EXPORT char16* c16memmove(char16* s1, const char16* s2, size_t n); BASE_EXPORT char16* c16memcpy(char16* s1, const char16* s2, size_t n); -BASE_EXPORT char16* c16memset(char16* s, char16 c, size_t n); - -// This namespace contains the implementation of base::string16 along with -// things that need to be found via argument-dependent lookup from a -// base::string16. -namespace string16_internals { - -struct string16_char_traits { - typedef char16 char_type; - typedef int int_type; - - // int_type needs to be able to hold each possible value of char_type, and in - // addition, the distinct value of eof(). - static_assert(sizeof(int_type) > sizeof(char_type), - "int must be larger than 16 bits wide"); - - typedef std::streamoff off_type; - typedef mbstate_t state_type; - typedef std::fpos<state_type> pos_type; - - static void assign(char_type& c1, const char_type& c2) { - c1 = c2; - } - - static bool eq(const char_type& c1, const char_type& c2) { - return c1 == c2; - } - static bool lt(const char_type& c1, const char_type& c2) { - return c1 < c2; - } - - static int compare(const char_type* s1, const char_type* s2, size_t n) { - return c16memcmp(s1, s2, n); - } - - static size_t length(const char_type* s) { - return c16len(s); - } - - static const char_type* find(const char_type* s, size_t n, - const char_type& a) { - return c16memchr(s, a, n); - } - - static char_type* move(char_type* s1, const char_type* s2, size_t n) { - return c16memmove(s1, s2, n); - } - - static char_type* copy(char_type* s1, const char_type* s2, size_t n) { - return c16memcpy(s1, s2, n); - } - - static char_type* assign(char_type* s, size_t n, char_type a) { - return c16memset(s, a, n); - } - - static int_type not_eof(const int_type& c) { - return eq_int_type(c, eof()) ? 0 : c; - } - - static char_type to_char_type(const int_type& c) { - return char_type(c); - } - - static int_type to_int_type(const char_type& c) { - return int_type(c); - } - - static bool eq_int_type(const int_type& c1, const int_type& c2) { - return c1 == c2; - } - - static int_type eof() { - return static_cast<int_type>(EOF); - } -}; - -} // namespace string16_internals - -typedef std::basic_string<char16, - base::string16_internals::string16_char_traits> - string16; - -namespace string16_internals { - -BASE_EXPORT extern std::ostream& operator<<(std::ostream& out, - const string16& str); - -// This is required by googletest to print a readable output on test failures. -BASE_EXPORT extern void PrintTo(const string16& str, std::ostream* out); - -} // namespace string16_internals } // namespace base -// The string class will be explicitly instantiated only once, in string16.cc. -// -// std::basic_string<> in GNU libstdc++ contains a static data member, -// _S_empty_rep_storage, to represent empty strings. When an operation such -// as assignment or destruction is performed on a string, causing its existing -// data member to be invalidated, it must not be freed if this static data -// member is being used. Otherwise, it counts as an attempt to free static -// (and not allocated) data, which is a memory error. -// -// Generally, due to C++ template magic, _S_empty_rep_storage will be marked -// as a coalesced symbol, meaning that the linker will combine multiple -// instances into a single one when generating output. -// -// If a string class is used by multiple shared libraries, a problem occurs. -// Each library will get its own copy of _S_empty_rep_storage. When strings -// are passed across a library boundary for alteration or destruction, memory -// errors will result. GNU libstdc++ contains a configuration option, -// --enable-fully-dynamic-string (_GLIBCXX_FULLY_DYNAMIC_STRING), which -// disables the static data member optimization, but it's a good optimization -// and non-STL code is generally at the mercy of the system's STL -// configuration. Fully-dynamic strings are not the default for GNU libstdc++ -// libstdc++ itself or for the libstdc++ installations on the systems we care -// about, such as Mac OS X and relevant flavors of Linux. -// -// See also http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24196 . -// -// To avoid problems, string classes need to be explicitly instantiated only -// once, in exactly one library. All other string users see it via an "extern" -// declaration. This is precisely how GNU libstdc++ handles -// std::basic_string<char> (string) and std::basic_string<wchar_t> (wstring). -// -// This also works around a Mac OS X linker bug in ld64-85.2.1 (Xcode 3.1.2), -// in which the linker does not fully coalesce symbols when dead code -// stripping is enabled. This bug causes the memory errors described above -// to occur even when a std::basic_string<> does not cross shared library -// boundaries, such as in statically-linked executables. -// -// TODO(mark): File this bug with Apple and update this note with a bug number. - -extern template class BASE_EXPORT - std::basic_string<base::char16, - base::string16_internals::string16_char_traits>; - -// Specialize std::hash for base::string16. Although the style guide forbids -// this in general, it is necessary for consistency with WCHAR_T_IS_UTF16 -// platforms, where base::string16 is a type alias for std::wstring. -namespace std { -template <> -struct hash<base::string16> { - std::size_t operator()(const base::string16& s) const { - std::size_t result = 0; - for (base::char16 c : s) - result = (result * 131) + c; - return result; - } -}; -} // namespace std - -#endif // WCHAR_T_IS_UTF32 - #endif // BASE_STRINGS_STRING16_H_
diff --git a/base/strings/string16_unittest.cc b/base/strings/string16_unittest.cc index 0e41864..5c020e2a 100644 --- a/base/strings/string16_unittest.cc +++ b/base/strings/string16_unittest.cc
@@ -13,13 +13,15 @@ namespace base { -#if defined(WCHAR_T_IS_UTF16) TEST(String16Test, String16Literal) { static constexpr char16 kHelloWorld[] = STRING16_LITERAL("Hello, World"); + constexpr StringPiece16 kPiece = kHelloWorld; + static_assert(kHelloWorld == kPiece, ""); + static_assert(kHelloWorld == kPiece.data(), ""); + string16 hello_world = kHelloWorld; EXPECT_EQ(kHelloWorld, hello_world); } -#endif // We define a custom operator<< for string16 so we can use it with logging. // This tests that conversion.
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc index e4c9b00..b85c644 100644 --- a/base/task/sequence_manager/task_queue_impl.cc +++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -1402,36 +1402,44 @@ void TaskQueueImpl::DelayedIncomingQueue::SweepCancelledTasks( SequenceManagerImpl* sequence_manager) { - // Under the hood a std::priority_queue is a heap and usually it's built on - // top of a std::vector. We poke at that vector directly here to filter out - // canceled tasks in place. + pending_high_res_tasks_ -= queue_.SweepCancelledTasks(sequence_manager); +} + +size_t TaskQueueImpl::DelayedIncomingQueue::PQueue::SweepCancelledTasks( + SequenceManagerImpl* sequence_manager) { + // Under the hood a std::priority_queue is a heap implemented top of a + // std::vector. We poke at that vector directly here to filter out canceled + // tasks in place. bool task_deleted = false; - auto it = queue_.c.begin(); - while (!queue_.c.empty() && it != queue_.c.end()) { - // TODO(crbug.com/1155905): Remove after figuring out the cause of the - // crash. - sequence_manager->RecordCrashKeys(*it); - if (it->task.IsCancelled()) { - if (it->is_high_res) - pending_high_res_tasks_--; - *it = std::move(queue_.c.back()); - queue_.c.pop_back(); - task_deleted = true; - // Note: if we just removed the last task in the queue, |it| is now - // invalid and shouldn't be used. - } else { - it++; - } - } + size_t num_high_res_tasks_swept = 0u; + auto is_cancelled = [sequence_manager, &num_high_res_tasks_swept, + &task_deleted](const Task& task) { + // TODO(crbug.com/1155905): Remove after figuring out + // the cause of the crash. + sequence_manager->RecordCrashKeys(task); + if (!task.task.IsCancelled()) + return false; + if (task.is_high_res) + num_high_res_tasks_swept++; + task_deleted = true; + return true; + }; + c.erase(std::remove_if(c.begin(), c.end(), is_cancelled), c.end()); // If we deleted something, re-enforce the heap property. if (task_deleted) - ranges::make_heap(queue_.c, queue_.comp); + ranges::make_heap(c, comp); + return num_high_res_tasks_swept; } Value TaskQueueImpl::DelayedIncomingQueue::AsValue(TimeTicks now) const { + return queue_.AsValue(now); +} + +Value TaskQueueImpl::DelayedIncomingQueue::PQueue::AsValue( + TimeTicks now) const { Value state(Value::Type::LIST); - for (const Task& task : queue_.c) + for (const Task& task : c) state.Append(TaskAsValue(task, now)); return state; }
diff --git a/base/task/sequence_manager/task_queue_impl.h b/base/task/sequence_manager/task_queue_impl.h index 8265ee6..82e5b58 100644 --- a/base/task/sequence_manager/task_queue_impl.h +++ b/base/task/sequence_manager/task_queue_impl.h
@@ -332,9 +332,14 @@ private: struct PQueue : public std::priority_queue<Task> { - // Expose the container and comparator. - using std::priority_queue<Task>::c; - using std::priority_queue<Task>::comp; + // Removes all cancelled tasks from the queue. Returns the number of + // removed high resolution tasks (which could be lower than the total + // number of removed tasks). + // + // TODO(crbug.com/1155905): we pass SequenceManager to be able to record + // crash keys. Remove this parameter after chasing down this crash. + size_t SweepCancelledTasks(SequenceManagerImpl* sequence_manager); + Value AsValue(TimeTicks now) const; }; PQueue queue_;
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h index 116eafeff..4926ea1e 100644 --- a/base/threading/thread_restrictions.h +++ b/base/threading/thread_restrictions.h
@@ -150,13 +150,14 @@ class BrowserTestBase; class CategorizedWorkerPool; class DesktopCaptureDevice; +class EmergencyTraceFinalisationCoordinator; class InProcessUtilityThread; class NestedMessagePumpAndroid; class NetworkServiceInstancePrivate; class PepperPrintSettingsManagerImpl; +class RTCVideoDecoder; class RenderProcessHostImpl; class RenderWidgetHostViewMac; -class RTCVideoDecoder; class SandboxHostLinux; class ScopedAllowWaitForDebugURL; class ServiceWorkerContextClient; @@ -530,6 +531,7 @@ friend class cc::TileTaskManagerImpl; friend class content::CategorizedWorkerPool; friend class content::DesktopCaptureDevice; + friend class content::EmergencyTraceFinalisationCoordinator; friend class content::InProcessUtilityThread; friend class content::RTCVideoDecoder; friend class content::SandboxHostLinux;
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index c5ec1161..b59fa2b 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20210107.3.1 +0.20210109.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index c5ec1161..b59fa2b 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20210107.3.1 +0.20210109.2.1
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc index 01534350..c6b87de 100644 --- a/cc/layers/heads_up_display_layer_impl.cc +++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -1097,10 +1097,11 @@ int top, std::string name, const WebVitalMetrics::MetricsInfo& info, + bool has_value, double value) const { std::string value_str = "-"; SkColor metrics_color = DebugColors::HUDTitleColor(); - if (value >= 0.f) { + if (has_value) { value_str = ToStringTwoDecimalPrecision(value) + info.UnitToString(); if (value < info.green_threshold) metrics_color = SK_ColorGREEN; @@ -1132,25 +1133,27 @@ DrawGraphBackground(canvas, &flags, area); int current_top = top + metrics_sizes.kTopPadding + metrics_sizes.kFontHeight; - double lcp_value = -1; - if (web_vital_metrics_ && - web_vital_metrics_->largest_contentful_paint.has_value()) - lcp_value = web_vital_metrics_->largest_contentful_paint->InSecondsF(); - current_top = DrawSingleMetric(canvas, left, left + width, current_top, - "Largest Contentful Paint", - WebVitalMetrics::lcp_info, lcp_value); + double metric_value = 0.f; + bool has_lcp = web_vital_metrics_ && web_vital_metrics_->has_lcp; + if (has_lcp) + metric_value = web_vital_metrics_->largest_contentful_paint.InSecondsF(); + current_top = DrawSingleMetric( + canvas, left, left + width, current_top, "Largest Contentful Paint", + WebVitalMetrics::lcp_info, has_lcp, metric_value); - double fid_value = -1; - if (web_vital_metrics_ && web_vital_metrics_->first_input_delay.has_value()) - fid_value = web_vital_metrics_->first_input_delay->InMillisecondsF(); + bool has_fid = web_vital_metrics_ && web_vital_metrics_->has_fid; + if (has_fid) + metric_value = web_vital_metrics_->first_input_delay.InMillisecondsF(); current_top = DrawSingleMetric(canvas, left, left + width, current_top, "First Input Delay", WebVitalMetrics::fid_info, - fid_value); + has_fid, metric_value); + bool has_layout_shift = web_vital_metrics_ && web_vital_metrics_->has_cls; + if (has_layout_shift) + metric_value = web_vital_metrics_->layout_shift; current_top = DrawSingleMetric( canvas, left, left + width, current_top, "Cumulative Layout Shift", - WebVitalMetrics::cls_info, - web_vital_metrics_ ? web_vital_metrics_->layout_shift : -1); + WebVitalMetrics::cls_info, has_layout_shift, metric_value); return area; }
diff --git a/cc/layers/heads_up_display_layer_impl.h b/cc/layers/heads_up_display_layer_impl.h index 6e6a08e..6a7e83a5 100644 --- a/cc/layers/heads_up_display_layer_impl.h +++ b/cc/layers/heads_up_display_layer_impl.h
@@ -143,6 +143,7 @@ int top, std::string name, const WebVitalMetrics::MetricsInfo& info, + bool has_value, double value) const; SkRect DrawWebVitalMetrics(PaintCanvas* canvas, int left,
diff --git a/cc/metrics/web_vital_metrics.cc b/cc/metrics/web_vital_metrics.cc index cbc86a79..1bb822d 100644 --- a/cc/metrics/web_vital_metrics.cc +++ b/cc/metrics/web_vital_metrics.cc
@@ -10,21 +10,4 @@ constexpr WebVitalMetrics::MetricsInfo WebVitalMetrics::fid_info; constexpr WebVitalMetrics::MetricsInfo WebVitalMetrics::cls_info; -WebVitalMetrics::WebVitalMetrics() = default; - -WebVitalMetrics::WebVitalMetrics(const WebVitalMetrics& other) = default; - -bool WebVitalMetrics::HasValue() const { - if (largest_contentful_paint.has_value()) - return true; - - if (first_input_delay.has_value()) - return true; - - if (layout_shift > 0.f) - return true; - - return false; -} - } // namespace cc
diff --git a/cc/metrics/web_vital_metrics.h b/cc/metrics/web_vital_metrics.h index d61143b..35b46b4 100644 --- a/cc/metrics/web_vital_metrics.h +++ b/cc/metrics/web_vital_metrics.h
@@ -14,14 +14,17 @@ // Web Vital metrics reported from blink to be displayed with cc's HUD display. struct CC_EXPORT WebVitalMetrics { - base::Optional<base::TimeDelta> largest_contentful_paint; - base::Optional<base::TimeDelta> first_input_delay; + bool has_lcp = false; + base::TimeDelta largest_contentful_paint; + bool has_fid = false; + base::TimeDelta first_input_delay; + bool has_cls = false; double layout_shift = 0.f; - WebVitalMetrics(); - WebVitalMetrics(const WebVitalMetrics& other); + WebVitalMetrics() = default; + WebVitalMetrics(const WebVitalMetrics& other) = default; - bool HasValue() const; + bool HasValue() const { return has_lcp || has_fid || has_cls; } struct MetricsInfo { double green_threshold;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 7b11dac..8ee6279 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -2772,6 +2772,9 @@ frame_trackers_.NotifyBeginImplFrame(args); total_frame_counter_.OnBeginFrame(args); + UMA_HISTOGRAM_CUSTOM_COUNTS("GPU.AcceleratedSurfaceRefreshRate", + 1 / args.interval.InSecondsF(), 0, 121, 122); + if (is_likely_to_require_a_draw_) { // Optimistically schedule a draw. This will let us expect the tile manager // to complete its work so that we can draw new tiles within the impl frame
diff --git a/chrome/VERSION b/chrome/VERSION index e372072..976092f 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=89 MINOR=0 -BUILD=4383 +BUILD=4384 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 0827f3d..5e9796b 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -199,7 +199,6 @@ "//chrome/browser/signin/services/android:java_resources", "//chrome/browser/signin/ui/android:java_resources", "//chrome/browser/ui/android/appmenu:java_resources", - "//chrome/browser/ui/android/default_browser_promo:java_resources", "//chrome/browser/ui/android/favicon:java_resources", "//chrome/browser/ui/android/strings:ui_strings_grd", "//chrome/browser/ui/android/theme:java_resources", @@ -907,6 +906,7 @@ "//components/omnibox/browser:browser_java", "//components/optimization_guide/proto:optimization_guide_proto_java", "//components/page_info/android:java", + "//components/paint_preview/player/android:java", "//components/payments/content/android:java", "//components/payments/content/android:service_java", "//components/payments/mojom:mojom_java", @@ -970,7 +970,7 @@ "//url/mojom:url_mojom_gurl_java", ] - deps += feed_test_deps + deps += chrome_junit_test_java_deps data_deps = [ "//testing/buildbot/filters:chrome_junit_tests_filters" ] @@ -1110,8 +1110,6 @@ "//chrome/browser/thumbnail:javatests", "//chrome/browser/ui/android/appmenu:java", "//chrome/browser/ui/android/appmenu/test:test_support_java", - "//chrome/browser/ui/android/default_browser_promo:java", - "//chrome/browser/ui/android/default_browser_promo:javatests", "//chrome/browser/ui/android/favicon:java", "//chrome/browser/ui/android/layouts:java", "//chrome/browser/ui/android/layouts/third_party/float_property:java",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index c5fd07d..1337737 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1213,7 +1213,6 @@ "java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java", "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java", "java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java", - "java/src/org/chromium/chrome/browser/services/AndroidChildAccountHelper.java", "java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerServiceImpl.java", "java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundServiceImpl.java", "java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundTask.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index d862b63a..3e2c05e 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -44,6 +44,7 @@ "junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureInfobarTest.java", "junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureNotificationTest.java", "junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureSnackbarTest.java", + "junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java", "junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java", "junit/src/org/chromium/chrome/browser/compositor/CompositorViewHolderUnitTest.java", "junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 742ba33..6d313d23 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -347,6 +347,7 @@ "javatests/src/org/chromium/chrome/browser/omnibox/suggestions/tiles/TileSuggestionProcessorUnitTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchConsentUiRenderTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchConsentUiTest.java", + "javatests/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceRenderTest.java", "javatests/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandlerTest.java", "javatests/src/org/chromium/chrome/browser/page_info/ConnectionInfoViewTest.java", "javatests/src/org/chromium/chrome/browser/page_info/CookieControlsViewTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java index 0482f84..cb43959 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java
@@ -382,12 +382,6 @@ return ChromeAccessibilityUtil.get().isAccessibilityEnabled(); } - /** Returns whether the user has seen a trigger script before or not. */ - @CalledByNative - private static boolean isFirstTimeTriggerScriptUser() { - return AutofillAssistantPreferencesUtil.isAutofillAssistantFirstTimeLiteScriptUser(); - } - /** Adds a dynamic action to the given reporter. */ @CalledByNative private void onFetchWebsiteActions(Callback<Boolean> callback, boolean success) {
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java index 7aeca2b..83dc4e5 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiController.java
@@ -384,6 +384,20 @@ return chip; } + /** + * Creates a feedback button button. It shows the feedback form and then *directly* executes + * {@code actionIndex}. + */ + @CalledByNative + private AssistantChip createFeedbackButton(int icon, String text, int actionIndex, + boolean disabled, boolean sticky, boolean visible, + @Nullable String contentDescription) { + AssistantChip chip = AssistantChip.createHairlineAssistantChip( + icon, text, disabled, sticky, visible, contentDescription); + chip.setSelectedListener(() -> safeNativeOnFeedbackButtonClicked(actionIndex)); + return chip; + } + // TODO(arbesser): Remove this and use methods in {@code AssistantChip} instead. @CalledByNative private static void appendChipToList(List<AssistantChip> chips, AssistantChip chip) { @@ -461,6 +475,13 @@ } } + private void safeNativeOnFeedbackButtonClicked(int index) { + if (mNativeUiController != 0) { + AutofillAssistantUiControllerJni.get().onFeedbackButtonClicked( + mNativeUiController, AutofillAssistantUiController.this, index); + } + } + private void safeNativeOnKeyboardVisibilityChanged(boolean visible) { if (mNativeUiController != 0) { AutofillAssistantUiControllerJni.get().onKeyboardVisibilityChanged( @@ -503,6 +524,8 @@ long nativeUiControllerAndroid, AutofillAssistantUiController caller, int index); void onCloseButtonClicked( long nativeUiControllerAndroid, AutofillAssistantUiController caller); + void onFeedbackButtonClicked( + long nativeUiControllerAndroid, AutofillAssistantUiController caller, int index); void onKeyboardVisibilityChanged(long nativeUiControllerAndroid, AutofillAssistantUiController caller, boolean visible); void setVisible(long nativeUiControllerAndroid, AutofillAssistantUiController caller,
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java index 12d5981..9f0c648 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/trigger_scripts/AssistantTriggerScriptBridge.java
@@ -128,6 +128,12 @@ return mContext; } + /** Returns whether the user has seen a trigger script before or not. */ + @CalledByNative + private static boolean isFirstTimeTriggerScriptUser() { + return AutofillAssistantPreferencesUtil.isAutofillAssistantFirstTimeLiteScriptUser(); + } + /** * Used by native to update and show the UI. The header should be created and updated using * {@code createHeaderAndGetModel} prior to calling this function.
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java index 8477890..8111ca3 100644 --- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java +++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
@@ -52,7 +52,7 @@ } /** Returns whether the user has seen a lite script before or not. */ - static boolean isAutofillAssistantFirstTimeLiteScriptUser() { + public static boolean isAutofillAssistantFirstTimeLiteScriptUser() { return SharedPreferencesManager.getInstance().readBoolean( ChromePreferenceKeys.AUTOFILL_ASSISTANT_FIRST_TIME_LITE_SCRIPT_USER, true); }
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index 67b4849..dbca556 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -788,6 +788,7 @@ // clang-format off @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" + "/show_last_active_tab_only/true/show_stack_tab_switcher/true"}) + @DisabledTest(message = "https://crbug.com/1164485") public void testShow_SingleAsTabSwitcher_V2() { // clang-format on if (mImmediateReturn) {
diff --git a/chrome/android/feed/merging.md b/chrome/android/feed/merging.md index a7306bf..d6ce70a 100644 --- a/chrome/android/feed/merging.md +++ b/chrome/android/feed/merging.md
@@ -8,4 +8,4 @@ The hash below represents the last commit from that repo that was reviewed for the potential need to merge here. -Last checked commit ID: 77405b1370937094ae69af4933f3e06109dd53ba +Last checked commit ID: c6eb65cc4e080d96c453c677df9bf58b3abcb9b8
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index deecf8c..0407e32 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -46,9 +46,7 @@ <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> - {% if target_sdk_version|int > 27 or target_sdk_version == "Q" %} - <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> - {% endif %} + <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index e32113a..0330c79 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -151,7 +151,6 @@ import org.chromium.chrome.browser.ui.RootUiCoordinator; import org.chromium.chrome.browser.ui.TabObscuringHandler; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; -import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils; import org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarController; import org.chromium.chrome.browser.usage_stats.UsageStatsService; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; @@ -1704,8 +1703,6 @@ ChromeSurveyController.initialize(mTabModelSelectorImpl); - DefaultBrowserPromoUtils.maybeRecordOutcomeOnStart(); - if (mStartSurfaceSupplier.get() != null && mOverviewShownOnStart) { mStartSurfaceSupplier.get().onOverviewShownAtLaunch(getOnCreateTimestampMs()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index 55f7f88..9ccdb8e7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -135,7 +135,6 @@ import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareDelegateImpl; import org.chromium.chrome.browser.sync.ProfileSyncService; -import org.chromium.chrome.browser.sync.SyncController; import org.chromium.chrome.browser.tab.AccessibilityVisibilityHandler; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabHidingType; @@ -897,11 +896,9 @@ if (!mStarted) return; // Sync state reporting should work only in started state. if (mContextReporter != null || getActivityTab() == null) return; - final SyncController syncController = SyncController.get(); final ProfileSyncService syncService = ProfileSyncService.get(); - if (syncController != null && syncController.isSyncingUrlsWithKeystorePassphrase()) { - assert syncService != null; + if (syncService != null && syncService.isSyncingUrlsWithKeystorePassphrase()) { mContextReporter = AppHooks.get().createGsaHelper().getContextReporter(this); if (mSyncStateChangedListener != null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java b/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java index 891a578d..4a192210 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java
@@ -7,12 +7,14 @@ import android.accounts.Account; import android.app.Activity; -import org.chromium.base.Callback; +import androidx.annotation.MainThread; + import org.chromium.base.ThreadUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; import org.chromium.base.task.PostTask; import org.chromium.components.signin.AccountManagerFacade; +import org.chromium.components.signin.AccountManagerFacade.ChildAccountStatusListener; import org.chromium.components.signin.AccountManagerFacadeProvider; import org.chromium.components.signin.AccountUtils; import org.chromium.components.signin.ChildAccountStatus; @@ -38,19 +40,30 @@ } /** - * Checks for the presence of child accounts on the device. + * Checks the child account status on device. * - * @param callback A callback which will be called with a @ChildAccountStatus.Status value. + * Since child accounts cannot share a device, the listener will be invoked with the status + * {@link ChildAccountStatus#NOT_CHILD} if there are no accounts or more than one account on + * device. If there is a single account on device, the listener will be passed to + * {@link AccountManagerFacade#checkChildAccountStatus} to check the child account status of + * the account. + * + * It should be safe to invoke this method before the native library is initialized (after + * AccountManagerFacade is set). + * + * @param listener The listener is called when the {@link ChildAccountStatus.Status} is ready. */ - public static void checkChildAccountStatus(final Callback<Integer> callback) { + @MainThread + public static void checkChildAccountStatus(ChildAccountStatusListener listener) { ThreadUtils.assertOnUiThread(); - final AccountManagerFacade accountManager = AccountManagerFacadeProvider.getInstance(); - accountManager.tryGetGoogleAccounts(accounts -> { - if (accounts.size() != 1) { + final AccountManagerFacade accountManagerFacade = + AccountManagerFacadeProvider.getInstance(); + accountManagerFacade.tryGetGoogleAccounts(accounts -> { + if (accounts.size() == 1) { // Child accounts can't share a device. - callback.onResult(ChildAccountStatus.NOT_CHILD); + accountManagerFacade.checkChildAccountStatus(accounts.get(0), listener); } else { - accountManager.checkChildAccountStatus(accounts.get(0), callback); + listener.onStatusReady(ChildAccountStatus.NOT_CHILD); } }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java index 1114264..da1b36c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -22,11 +22,11 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.LaunchIntentDispatcher; +import org.chromium.chrome.browser.childaccounts.ChildAccountService; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.services.AndroidChildAccountHelper; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.signin.services.SigninManager; import org.chromium.chrome.browser.vr.VrModuleProvider; @@ -77,15 +77,12 @@ } long childAccountStatusStart = SystemClock.elapsedRealtime(); - new AndroidChildAccountHelper() { - @Override - public void onParametersReady() { - RecordHistogram.recordTimesHistogram("MobileFre.ChildAccountStatusDuration", - SystemClock.elapsedRealtime() - childAccountStatusStart); - initializeSharedState(getChildAccountStatus()); - processFreEnvironmentPreNative(); - } - }.start(); + ChildAccountService.checkChildAccountStatus(status -> { + RecordHistogram.recordTimesHistogram("MobileFre.ChildAccountStatusDuration", + SystemClock.elapsedRealtime() - childAccountStatusStart); + initializeSharedState(status); + processFreEnvironmentPreNative(); + }); } @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java index 75266016..3e0c60f4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
@@ -10,8 +10,8 @@ import org.chromium.base.Log; import org.chromium.chrome.browser.SyncFirstSetupCompleteSource; +import org.chromium.chrome.browser.childaccounts.ChildAccountService; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.services.AndroidChildAccountHelper; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.signin.services.SigninManager; import org.chromium.chrome.browser.sync.ProfileSyncService; @@ -48,16 +48,13 @@ * changes with early exit if an account has already been signed in. */ public static void start(@Nullable final Runnable onComplete) { - new AndroidChildAccountHelper() { - @Override - public void onParametersReady() { - boolean hasChildAccount = ChildAccountStatus.isChild(getChildAccountStatus()); - AccountManagementFragment.setSignOutAllowedPreferenceValue(!hasChildAccount); - if (hasChildAccount) { - processForcedSignIn(onComplete); - } + ChildAccountService.checkChildAccountStatus(status -> { + boolean hasChildAccount = ChildAccountStatus.isChild(status); + AccountManagementFragment.setSignOutAllowedPreferenceValue(!hasChildAccount); + if (hasChildAccount) { + processForcedSignIn(onComplete); } - }.start(); + }); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAState.java b/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAState.java index 3d3df8890..3bfa3860 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAState.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAState.java
@@ -21,6 +21,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.Log; +import org.chromium.base.ObserverList; import org.chromium.base.PackageManagerUtils; import org.chromium.base.PackageUtils; import org.chromium.base.ThreadUtils; @@ -35,9 +36,15 @@ import java.util.List; /** - * A class responsible fore representing the current state of Chrome's integration with GSA. + * A class responsible for representing the current state of Chrome's integration with GSA. */ public class GSAState { + /** Used to observe state changes in the class. */ + public interface Observer { + /** Called when the GSA account name is set. */ + void onSetGsaAccount(); + } + private static final String TAG = "GSAState"; private static final int GSA_VERSION_FOR_DOCUMENT = 300401021; @@ -67,6 +74,7 @@ * The application context to use. */ private final Context mContext; + private final ObserverList<Observer> mObserverList = new ObserverList<>(); /** * Caches the result of a computation on whether GSA is available. @@ -74,10 +82,10 @@ private Boolean mGsaAvailable; /** - * The Google account being used by GSA according to the latest update we have received. - * This may be null. + * The Google account email address being used by GSA according to the latest update we have + * received. */ - private String mGsaAccount; + private @Nullable String mGsaAccount; /** * Returns the singleton instance of GSAState and creates one if necessary. @@ -110,6 +118,10 @@ */ public void setGsaAccount(String gsaAccount) { mGsaAccount = gsaAccount; + + for (Observer observer : mObserverList) { + observer.onSetGsaAccount(); + } } /** @@ -276,4 +288,28 @@ return Boolean.parseBoolean(cursor.getString(0)); } + + /** + * Adds an observer. + * @param observer The observer to add. + */ + public void addObserver(@NonNull Observer observer) { + mObserverList.addObserver(observer); + } + + /** + * Removes an observer. + * @param observer The observer to remove. + */ + public void removeObserver(@NonNull Observer observer) { + mObserverList.removeObserver(observer); + } + + /** + * Sets an instance for testing. + * @param gsaState The instance to set for testing. + */ + public static void setInstanceForTesting(GSAState gsaState) { + sGSAState = gsaState; + } }
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 6a218a2..8c5b659 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
@@ -5,8 +5,6 @@ package org.chromium.chrome.browser.omnibox; import android.content.Context; -import android.content.res.ColorStateList; -import android.graphics.drawable.Drawable; import android.os.Parcelable; import android.text.TextUtils; import android.util.AttributeSet; @@ -169,6 +167,8 @@ mLocationBarDataProvider = locationBarDataProvider; mVoiceRecognitionHandler = voiceRecognitionHandler; mAssistantVoiceSearchServiceSupplier = assistantVoiceSearchSupplier; + mAssistantVoiceSearchServiceSupplier.onAvailable( + (assistantVoiceSearchService) -> onAssistantVoiceSearchServiceChanged()); updateButtonVisibility(); updateShouldAnimateIconChanges(); @@ -315,7 +315,7 @@ /** Updates visuals after the primary color has changed. */ @CallSuper public void onPrimaryColorChanged() { - updateAssistantVoiceSearchColors(); + updateAssistantVoiceSearchDrawableAndColors(); updateUseDarkColors(); } @@ -369,27 +369,18 @@ } /* package */ void onAssistantVoiceSearchServiceChanged() { - AssistantVoiceSearchService assistantVoiceSearchService = - mAssistantVoiceSearchServiceSupplier.get(); - assert assistantVoiceSearchService != null; - Drawable drawable = assistantVoiceSearchService.getCurrentMicDrawable(); - mMicButton.setImageDrawable(drawable); - updateAssistantVoiceSearchColors(); + updateAssistantVoiceSearchDrawableAndColors(); } - private void updateAssistantVoiceSearchColors() { + private void updateAssistantVoiceSearchDrawableAndColors() { AssistantVoiceSearchService assistantVoiceSearchService = mAssistantVoiceSearchServiceSupplier.get(); - ColorStateList colorStateList; - // This will be called between inflation and initialization. For those calls, using a null - // ColorStateList should have no visible impact to the user. - if (assistantVoiceSearchService == null) { - colorStateList = null; - } else { - colorStateList = assistantVoiceSearchService.getMicButtonColorStateList( - getPrimaryBackgroundColor(), getContext()); - } - ApiCompatibilityUtils.setImageTintList(mMicButton, colorStateList); + if (assistantVoiceSearchService == null) return; + + ApiCompatibilityUtils.setImageTintList(mMicButton, + assistantVoiceSearchService.getMicButtonColorStateList( + getPrimaryBackgroundColor(), getContext())); + mMicButton.setImageDrawable(assistantVoiceSearchService.getCurrentMicDrawable()); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService.java index ff02cb1..7a6bd8e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService.java
@@ -30,6 +30,8 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.gsa.GSAState; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.profiles.ProfileManager; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.externalauth.ExternalAuthUtils; import org.chromium.components.search_engines.TemplateUrlService; @@ -42,7 +44,8 @@ * Service for state tracking and event delivery to classes that need to observe the state * of Assistant Voice Search. **/ -public class AssistantVoiceSearchService implements TemplateUrlService.TemplateUrlServiceObserver { +public class AssistantVoiceSearchService implements TemplateUrlService.TemplateUrlServiceObserver, + GSAState.Observer, ProfileManager.Observer { private static final String USER_ELIGIBILITY_HISTOGRAM = "Assistant.VoiceSearch.UserEligibility"; @VisibleForTesting @@ -114,22 +117,16 @@ mSharedPrefsManager = sharedPrefsManager; mObserver = observer; + ProfileManager.addObserver(this); + mGsaState.addObserver(this); mTemplateUrlService.addObserver(this); initializeAssistantVoiceSearchState(); } public void destroy() { mTemplateUrlService.removeObserver(this); - } - - @Override - public void onTemplateURLServiceChanged() { - boolean searchEngineGoogle = mTemplateUrlService.isDefaultSearchEngineGoogle(); - if (mIsDefaultSearchEngineGoogle == searchEngineGoogle) return; - - mIsDefaultSearchEngineGoogle = searchEngineGoogle; - mShouldShowColorfulMic = isColorfulMicEnabled(); - notifyObserver(); + mGsaState.removeObserver(this); + ProfileManager.removeObserver(this); } private void notifyObserver() { @@ -202,6 +199,11 @@ return AppCompatResources.getColorStateList(context, id); } + /** Called from {@link VoiceRecognitionHandler} after the consent flow has completed. */ + public void onAssistantConsentDialogComplete(boolean useAssistant) { + if (useAssistant) updateColorfulMicState(); + } + /** * @return Whether the user has enabled the feature, ensure {@link needsEnabledCheck} is * called first. @@ -222,6 +224,7 @@ sAgsaSupportsAssistantVoiceSearch = mSharedPrefsManager.readBoolean(ASSISTANT_VOICE_SEARCH_SUPPORTED, /* default= */ false); + updateColorfulMicState(); } else { DeferredStartupHandler.getInstance().addDeferredTask(() -> { // Only do this once per browser start. @@ -240,6 +243,7 @@ sAgsaSupportsAssistantVoiceSearch); mSharedPrefsManager.writeString( ASSISTANT_LAST_VERSION, currentAgsaVersion); + updateColorfulMicState(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }); @@ -326,14 +330,61 @@ USER_ELIGIBILITY_HISTOGRAM, canRequestAssistantVoiceSearch()); } + private void updateColorfulMicState() { + final boolean shouldShowColorfulMic = isColorfulMicEnabled(); + // Execute the update/notification in an AsyncTask to prevent re-entrant calls. + new AsyncTask<Boolean>() { + @Override + protected Boolean doInBackground() { + return mShouldShowColorfulMic != shouldShowColorfulMic; + } + @Override + protected void onPostExecute(Boolean notify) { + mShouldShowColorfulMic = shouldShowColorfulMic; + if (notify) notifyObserver(); + } + }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + // TemplateUrlService.TemplateUrlServiceObserver implementation + + @Override + public void onTemplateURLServiceChanged() { + boolean searchEngineGoogle = mTemplateUrlService.isDefaultSearchEngineGoogle(); + if (mIsDefaultSearchEngineGoogle == searchEngineGoogle) return; + + mIsDefaultSearchEngineGoogle = searchEngineGoogle; + mShouldShowColorfulMic = isColorfulMicEnabled(); + notifyObserver(); + } + + // GSAState.Observer implementation + + @Override + public void onSetGsaAccount() { + updateColorfulMicState(); + } + + // ProfileManager.Observer implementation + + @Override + public void onProfileAdded(Profile profile) { + updateColorfulMicState(); + } + + @Override + public void onProfileDestroyed(Profile profile) {} + + // Test-only methods + /** Enable the colorful mic for testing purposes. */ void setColorfulMicEnabledForTesting(boolean enabled) { mIsColorfulMicEnabled = enabled; mShouldShowColorfulMic = enabled; } - // Allows testing the NULL case for Boolean. - static void setAgsaSupportsAssistantVoiceSearchForTesting(Boolean value) { + /** Allows skipping the cross-app check for testing. */ + public static void setAgsaSupportsAssistantVoiceSearchForTesting(Boolean value) { sAgsaSupportsAssistantVoiceSearch = value; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java index 9658dd3..cabf0620 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java
@@ -590,6 +590,9 @@ AssistantVoiceSearchConsentUi.show(windowAndroid, SharedPreferencesManager.getInstance(), new SettingsLauncherImpl(), (useAssistant) -> { + // Notify the service about the consent completion. + assistantVoiceSearchService.onAssistantConsentDialogComplete(useAssistant); + if (useAssistant) { if (!startAGSAForAssistantVoiceSearch( activity, windowAndroid, source)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java index 8a43c46..26784502 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ChromePaymentRequestService.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.payments; +import android.app.Activity; import android.content.Context; import android.text.TextUtils; @@ -11,9 +12,14 @@ import androidx.collection.ArrayMap; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.autofill.PersonalDataManager; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.payments.ui.PaymentUiService; +import org.chromium.chrome.browser.tabmodel.TabModel; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.components.autofill.EditableOption; import org.chromium.components.payments.AbortReason; import org.chromium.components.payments.AndroidPaymentApp; @@ -123,15 +129,15 @@ } /** - * Looks up the Chrome activity of the given web contents. This can be null. Should never be - * cached, because web contents can change activities, e.g., when user selects "Open in + * Looks up the Android Activity of the given web contents. This can be null. Should never + * be cached, because web contents can change activities, e.g., when user selects "Open in * Chrome" menu item. * - * @param webContents The web contents for which to lookup the Chrome activity. - * @return Possibly null Chrome activity that should never be cached. + * @param webContents The web contents for which to lookup the Android activity. + * @return Possibly null Android activity that should never be cached. */ @Nullable - default ChromeActivity getChromeActivity(WebContents webContents) { + default Activity getActivity(WebContents webContents) { return ChromeActivity.fromWebContents(webContents); } @@ -189,6 +195,50 @@ WebContents webContents, PaymentRequestUpdateEventListener listener) { return new PaymentHandlerHost(webContents, listener); } + + /** + * @param webContents Any WebContents. + * @return The TabModelSelector of the given WebContents. + */ + @Nullable + default TabModelSelector getTabModelSelector(WebContents webContents) { + ChromeActivity activity = ChromeActivity.fromWebContents(webContents); + return activity == null ? null : activity.getTabModelSelector(); + } + + /** + * @param webContents Any WebContents. + * @return The TabModel of the given WebContents. + */ + @Nullable + default TabModel getTabModel(WebContents webContents) { + ChromeActivity activity = ChromeActivity.fromWebContents(webContents); + return activity == null ? null : activity.getCurrentTabModel(); + } + + /** + * @param webContents Any WebContents. + * @return The OverviewModeBehavior of the given WebContents. + */ + @Nullable + default OverviewModeBehavior getOverviewModeBehavior(WebContents webContents) { + ChromeActivity activity = ChromeActivity.fromWebContents(webContents); + if (activity == null) return null; + if (!(activity instanceof ChromeTabbedActivity)) return null; + return ((ChromeTabbedActivity) activity).getOverviewModeBehaviorSupplier().get(); + } + + /** + * @param webContents Any WebContents. + * @return The ActivityLifecycleDispatcher of the ChromeActivity that contains the given + * WebContents. + */ + @Nullable + default ActivityLifecycleDispatcher getActivityLifecycleDispatcher( + WebContents webContents) { + ChromeActivity activity = ChromeActivity.fromWebContents(webContents); + return activity == null ? null : activity.getLifecycleDispatcher(); + } } /** @@ -317,11 +367,15 @@ @Override public String showOrSkipAppSelector(boolean isShowWaitingForUpdatedDetails, PaymentItem total, boolean shouldSkipAppSelector) { - ChromeActivity chromeActivity = mDelegate.getChromeActivity(mWebContents); - if (chromeActivity == null) return ErrorStrings.ACTIVITY_NOT_FOUND; - String error = mPaymentUiService.buildPaymentRequestUI(chromeActivity, - /*isWebContentsActive=*/mDelegate.isWebContentsActive(mRenderFrameHost), - /*isShowWaitingForUpdatedDetails=*/isShowWaitingForUpdatedDetails); + Activity activity = mDelegate.getActivity(mWebContents); + if (activity == null) return ErrorStrings.ACTIVITY_NOT_FOUND; + TabModelSelector tabModelSelector = mDelegate.getTabModelSelector(mWebContents); + if (tabModelSelector == null) return ErrorStrings.TAB_NOT_FOUND; + TabModel tabModel = mDelegate.getTabModel(mWebContents); + if (tabModel == null) return ErrorStrings.TAB_NOT_FOUND; + String error = mPaymentUiService.buildPaymentRequestUI( + /*isWebContentsActive=*/mDelegate.isWebContentsActive(mRenderFrameHost), activity, + tabModelSelector, tabModel, mDelegate.getOverviewModeBehavior(mWebContents)); if (error != null) return error; // Calculate skip ui and build ui only after all payment apps are ready and // request.show() is called. @@ -771,4 +825,11 @@ public Context getContext() { return mDelegate.getContext(mRenderFrameHost); } + + // Implement PaymentUiService.Delegate: + @Override + @Nullable + public ActivityLifecycleDispatcher getActivityLifecycleDispatcher() { + return mDelegate.getActivityLifecycleDispatcher(mWebContents); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java index f06c24c..97f3911 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.payments.ui; +import android.app.Activity; import android.content.Context; import android.os.Handler; import android.text.TextUtils; @@ -14,8 +15,6 @@ import org.chromium.base.Callback; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeTabbedActivity; -import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; @@ -23,6 +22,7 @@ import org.chromium.chrome.browser.compositor.layouts.EmptyOverviewModeObserver; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.payments.AddressEditor; import org.chromium.chrome.browser.payments.AutofillAddress; import org.chromium.chrome.browser.payments.AutofillContact; @@ -221,6 +221,10 @@ */ @Nullable Context getContext(); + + /** @return The ActivityLifecycleDispatcher of the current ChromeActivity. */ + @Nullable + ActivityLifecycleDispatcher getActivityLifecycleDispatcher(); } /** @@ -1196,15 +1200,17 @@ /** * Build the PaymentRequest UI. - * @param activity The ChromeActivity for the payment request, cannot be null. * @param isWebContentsActive Whether the merchant's WebContents is active. - * @param isShowWaitingForUpdatedDetails Whether showing payment app or the app selector is - * blocked on the updated payment details. + * @param activity The activity of the current tab. + * @param tabModelSelector The tab model selector of the current tab. + * @param tabModel The tab model of the current tab. + * @param overviewModeBehavior The overview model behaviour of the current tab, can be null. * @return The error message if built unsuccessfully; null otherwise. */ @Nullable - public String buildPaymentRequestUI(ChromeActivity activity, boolean isWebContentsActive, - boolean isShowWaitingForUpdatedDetails) { + public String buildPaymentRequestUI(boolean isWebContentsActive, Activity activity, + TabModelSelector tabModelSelector, TabModel tabModel, + @Nullable OverviewModeBehavior overviewModeBehavior) { // Payment methods section must be ready before building the rest of the UI. This is because // shipping and contact sections (when requested by merchant) are populated depending on // whether or not the selected payment app (if such exists) can provide the required @@ -1212,6 +1218,9 @@ assert mPaymentMethodsSection != null; assert activity != null; + assert tabModelSelector != null; + assert tabModel != null; + assert overviewModeBehavior != null; // Only the currently selected tab is allowed to show the payment UI. if (!isWebContentsActive) return ErrorStrings.CANNOT_SHOW_IN_BACKGROUND_TAB; @@ -1223,21 +1232,20 @@ if (mObservedTabModelSelector != null) { mObservedTabModelSelector.removeObserver(mSelectorObserver); } - mObservedTabModelSelector = activity.getTabModelSelector(); + mObservedTabModelSelector = tabModelSelector; mObservedTabModelSelector.addObserver(mSelectorObserver); if (mObservedTabModel != null) { mObservedTabModel.removeObserver(mTabModelObserver); } - mObservedTabModel = activity.getCurrentTabModel(); + mObservedTabModel = tabModel; mObservedTabModel.addObserver(mTabModelObserver); // Catch any time the user enters the overview mode and dismiss the payment UI. - if (activity instanceof ChromeTabbedActivity) { + if (overviewModeBehavior != null) { if (mOverviewModeBehavior != null) { mOverviewModeBehavior.removeOverviewModeObserver(mOverviewModeObserver); } - mOverviewModeBehavior = - ((ChromeTabbedActivity) activity).getOverviewModeBehaviorSupplier().get(); + mOverviewModeBehavior = overviewModeBehavior; assert mOverviewModeBehavior != null; if (mOverviewModeBehavior.overviewVisible()) return ErrorStrings.TAB_OVERVIEW_MODE; @@ -1255,8 +1263,10 @@ SecurityStateModel.getSecurityLevelForWebContents(mWebContents), new ShippingStrings(mParams.getPaymentOptions().shippingType), mPaymentUisShowStateReconciler, Profile.fromWebContents(mWebContents)); - activity.getLifecycleDispatcher().register( - mPaymentRequestUI); // registered as a PauseResumeWithNativeObserver + ActivityLifecycleDispatcher dispatcher = mDelegate.getActivityLifecycleDispatcher(); + if (dispatcher != null) { + dispatcher.register(mPaymentRequestUI); // registered as a PauseResumeWithNativeObserver + } final FaviconHelper faviconHelper = new FaviconHelper(); faviconHelper.getLocalFaviconImageForURL(Profile.fromWebContents(mWebContents), @@ -1688,9 +1698,9 @@ if (mPaymentRequestUI != null) { mPaymentRequestUI.close(); - ChromeActivity activity = ChromeActivity.fromWebContents(mWebContents); - if (activity != null) { - activity.getLifecycleDispatcher().unregister(mPaymentRequestUI); + ActivityLifecycleDispatcher dispatcher = mDelegate.getActivityLifecycleDispatcher(); + if (dispatcher != null) { + dispatcher.unregister(mPaymentRequestUI); } mPaymentRequestUI = null; mPaymentUisShowStateReconciler.onPaymentRequestUiClosed();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/AndroidChildAccountHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/services/AndroidChildAccountHelper.java deleted file mode 100644 index 6f6c62a1..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/services/AndroidChildAccountHelper.java +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.services; - -import org.chromium.base.Callback; -import org.chromium.chrome.browser.childaccounts.ChildAccountService; -import org.chromium.components.signin.ChildAccountStatus; - -/** - * A helper for child account checks. - * Usage: - * new AndroidChildAccountHelper() { override onParametersReady() }.start(appContext). - */ -public abstract class AndroidChildAccountHelper implements Callback<Integer> { - private @ChildAccountStatus.Status Integer mChildAccountStatus; - - /** The callback called when child account parameters are known. */ - public abstract void onParametersReady(); - - /** @return The status of the device regarding child accounts. */ - protected @ChildAccountStatus.Status int getChildAccountStatus() { - return mChildAccountStatus; - } - - /** - * Starts fetching the child accounts information. - * Calls onParametersReady() once the information is fetched. - */ - public void start() { - ChildAccountService.checkChildAccountStatus(this); - } - - // Callback<Integer>: - @Override - public void onResult(@ChildAccountStatus.Status Integer status) { - mChildAccountStatus = status; - if (mChildAccountStatus != null) { - onParametersReady(); - } - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java index e194e0d..a672af6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
@@ -13,6 +13,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.NativeMethods; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.components.signin.base.GoogleServiceAuthError; import org.chromium.components.sync.KeyRetrievalTriggerForUMA; import org.chromium.components.sync.ModelType; @@ -567,6 +568,20 @@ mNativeProfileSyncServiceAndroid, ProfileSyncService.this, keyRetrievalTrigger); } + /** + * @return Whether sync is enabled to sync urls or open tabs with a non custom passphrase. + */ + public boolean isSyncingUrlsWithKeystorePassphrase() { + if (ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)) { + return isEngineInitialized() && getActiveDataTypes().contains(ModelType.TYPED_URLS) + && (getPassphraseType() == PassphraseType.KEYSTORE_PASSPHRASE + || getPassphraseType() == PassphraseType.TRUSTED_VAULT_PASSPHRASE); + } + return isEngineInitialized() && getPreferredDataTypes().contains(ModelType.TYPED_URLS) + && (getPassphraseType() == PassphraseType.KEYSTORE_PASSPHRASE + || getPassphraseType() == PassphraseType.TRUSTED_VAULT_PASSPHRASE); + } + @VisibleForTesting public long getNativeProfileSyncServiceForTest() { return ProfileSyncServiceJni.get().getProfileSyncServiceForTest(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncController.java index 1684438..9db80c9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncController.java
@@ -12,12 +12,9 @@ import org.chromium.base.Log; import org.chromium.base.ThreadUtils; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.uid.UniqueIdentificationGenerator; import org.chromium.chrome.browser.uid.UniqueIdentificationGeneratorFactory; -import org.chromium.components.sync.ModelType; -import org.chromium.components.sync.PassphraseType; import org.chromium.components.sync.StopSource; /** @@ -165,19 +162,7 @@ * @return Whether sync is enabled to sync urls or open tabs with a non custom passphrase. */ public boolean isSyncingUrlsWithKeystorePassphrase() { - if (ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)) { - return mProfileSyncService.isEngineInitialized() - && mProfileSyncService.getActiveDataTypes().contains(ModelType.TYPED_URLS) - && (mProfileSyncService.getPassphraseType() - == PassphraseType.KEYSTORE_PASSPHRASE - || mProfileSyncService.getPassphraseType() - == PassphraseType.TRUSTED_VAULT_PASSPHRASE); - } - return mProfileSyncService.isEngineInitialized() - && mProfileSyncService.getPreferredDataTypes().contains(ModelType.TYPED_URLS) - && (mProfileSyncService.getPassphraseType() == PassphraseType.KEYSTORE_PASSPHRASE - || mProfileSyncService.getPassphraseType() - == PassphraseType.TRUSTED_VAULT_PASSPHRASE); + return mProfileSyncService.isSyncingUrlsWithKeystorePassphrase(); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java index f8e5b805..e0f2d91 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeExperimentsUtil.java
@@ -147,16 +147,16 @@ */ public static boolean willHandleLoadUrlFromStartSurface(String url, @PageTransition int transition, @Nullable Boolean incognito, @Nullable Tab parentTab) { + LoadUrlParams params = new LoadUrlParams(url, transition); return willHandleLoadUrlWithPostDataFromStartSurface( - url, transition, null, null, incognito, parentTab); + params, null, null, incognito, parentTab); } /** * Check if we should handle the navigation. If so, create a new tab and load the URL with POST * data. * - * @param url The URL to load. - * @param transition The page transition type. + * @param params The LoadUrlParams to load. * @param postDataType postData type. * @param postData POST data to include in the tab URL's request body, ex. bitmap when * image search. @@ -165,9 +165,10 @@ * @param parentTab The parent tab used to create a new tab if needed. * @return true if we have handled the navigation, false otherwise. */ - public static boolean willHandleLoadUrlWithPostDataFromStartSurface(String url, - @PageTransition int transition, @Nullable String postDataType, - @Nullable byte[] postData, @Nullable Boolean incognito, @Nullable Tab parentTab) { + public static boolean willHandleLoadUrlWithPostDataFromStartSurface(LoadUrlParams params, + @Nullable String postDataType, @Nullable byte[] postData, @Nullable Boolean incognito, + @Nullable Tab parentTab) { + String url = params.getUrl(); ChromeActivity chromeActivity = getActivityPresentingOverviewWithOmnibox(url); if (chromeActivity == null) return false; @@ -179,9 +180,6 @@ incognitoParam = incognito; } - LoadUrlParams params = new LoadUrlParams(url); - // TODO(https://crbug.com/1134187): This may no longer accurate. - params.setTransitionType(transition | PageTransition.FROM_ADDRESS_BAR); if (!TextUtils.isEmpty(postDataType) && postData != null && postData.length != 0) { params.setVerbatimHeaders("Content-Type: " + postDataType); params.setPostData(ResourceRequestBody.createFromBytes(postData)); @@ -190,14 +188,15 @@ chromeActivity.getTabCreator(incognitoParam) .createNewTab(params, TabLaunchType.FROM_START_SURFACE, parentTab); - if (transition == PageTransition.AUTO_BOOKMARK) { + if (params.getTransitionType() == PageTransition.AUTO_BOOKMARK) { RecordUserAction.record("Suggestions.Tile.Tapped.GridTabSwitcher"); } else { RecordUserAction.record("MobileOmniboxUse.GridTabSwitcher"); // These are duplicated here but would have been recorded by LocationBarLayout#loadUrl. RecordUserAction.record("MobileOmniboxUse"); - LocaleManager.getInstance().recordLocaleBasedSearchMetrics(false, url, transition); + LocaleManager.getInstance().recordLocaleBasedSearchMetrics( + false, url, params.getTransitionType()); } return true;
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 e6e43e2..012e3a7 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
@@ -137,6 +137,7 @@ import org.chromium.content_public.browser.WebContents; import org.chromium.net.NetError; import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.util.TokenHolder; @@ -463,8 +464,8 @@ OverrideUrlLoadingDelegate overrideUrlLoadingDelegate = (url, transition, postDataType, postData, incognito) -> ReturnToChromeExperimentsUtil.willHandleLoadUrlWithPostDataFromStartSurface( - url, transition, postDataType, postData, incognito, - startSurfaceParentTabSupplier.get()); + new LoadUrlParams(url, transition | PageTransition.FROM_ADDRESS_BAR), + postDataType, postData, incognito, startSurfaceParentTabSupplier.get()); LocationBarCoordinator locationBarCoordinator = new LocationBarCoordinator( mActivity.findViewById(R.id.location_bar), toolbarLayout, profileSupplier, mLocationBarModel, mActionModeController.getActionModeCallback(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java index f485b3c..2b05aa3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java
@@ -12,6 +12,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -33,6 +34,7 @@ * The {@link #showForAppMenu} method is used to show the add-to-homescreen UI when the user * chooses the "Add to Home screen" option from the app menu. */ +@JNINamespace("webapps") public class AddToHomescreenCoordinator { @VisibleForTesting Context mActivityContext;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java index b2d77c8e..c13faf3d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java
@@ -10,6 +10,7 @@ import androidx.annotation.StringRes; import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.browser.banners.AppData; import org.chromium.chrome.browser.webapps.AddToHomescreenProperties; @@ -28,6 +29,7 @@ * information about the app is available. These methods modify the model that lives on the Java * side. */ +@JNINamespace("webapps") class AddToHomescreenMediator implements AddToHomescreenViewDelegate { private long mNativeAddToHomescreenMediator; private PropertyModel mModel;
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index b5a8a66..01620861 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -41,6 +41,8 @@ chrome_test_java_sources += tab_management_test_java_sources chrome_test_java_sources += share_test_java_sources chrome_junit_test_java_sources += share_junit_test_java_sources +chrome_junit_test_java_deps = share_junit_test_java_deps +chrome_junit_test_java_deps += feed_test_deps if (enable_arcore) { chrome_java_sources += [
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java index a5918444..13a5326 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
@@ -564,8 +564,11 @@ @Test @LargeTest @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_NON_LOW_END_DEVICE}) + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1164443", + sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) @Feature({"Android-TabSwitcher"}) - public void testTabSwitcherLandscapeCloseButton() { + public void + testTabSwitcherLandscapeCloseButton() { mActivityTestRule.getActivity().setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // Hard-coded coordinates of the close button on the bottom left of the screen.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/RunningInChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/RunningInChromeTest.java index 78627989..44745dd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/RunningInChromeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/RunningInChromeTest.java
@@ -34,6 +34,7 @@ import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeApplication; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; @@ -127,6 +128,7 @@ @Test @MediumTest + @FlakyTest(message = "https://crbug.com/1164424") public void showsNewRunningInChrome() throws TimeoutException { launch(createTrustedWebActivityIntent(mTestPage));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index 8d04f49e..60791fa4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -433,6 +433,7 @@ @Test @SmallTest + @DisabledTest(message = "https://crbug.com/1164414") public void testRedirectionFromIntentCold() throws Exception { Context context = ContextUtils.getApplicationContext(); Intent intent = new Intent(Intent.ACTION_VIEW,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceRenderTest.java new file mode 100644 index 0000000..49f1988cde --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceRenderTest.java
@@ -0,0 +1,110 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.omnibox.voice; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.matcher.ViewMatchers.withId; + +import static org.mockito.ArgumentMatchers.anyObject; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; + +import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.ASSISTANT_VOICE_SEARCH_ENABLED; +import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.ASSISTANT_VOICE_SEARCH_SUPPORTED; + +import android.support.test.filters.MediumTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Feature; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.browser.gsa.GSAState; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.util.ChromeRenderTestRule; +import org.chromium.components.embedder_support.util.UrlConstants; +import org.chromium.components.externalauth.ExternalAuthUtils; + +import java.io.IOException; + +/** Tests for AssistantVoiceSearchService */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, + "enable-features=" + ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH + "<Study", + "force-fieldtrials=Study/Group"}) +public class AssistantVoiceSearchServiceRenderTest { + @Rule + public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + @Rule + public ChromeRenderTestRule mRenderTestRule = + ChromeRenderTestRule.Builder.withPublicCorpus().build(); + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Mock + GSAState mGsaState; + + @Before + public void setUp() { + AssistantVoiceSearchService.setAgsaSupportsAssistantVoiceSearchForTesting(true); + SharedPreferencesManager.getInstance().writeBoolean(ASSISTANT_VOICE_SEARCH_ENABLED, true); + SharedPreferencesManager.getInstance().writeBoolean(ASSISTANT_VOICE_SEARCH_SUPPORTED, true); + + GSAState gsaState = Mockito.mock(GSAState.class); + doReturn(false).when(gsaState).isAgsaVersionBelowMinimum(anyString(), anyString()); + doReturn(true).when(gsaState).doesGsaAccountMatchChrome(); + doReturn(true).when(gsaState).canAgsaHandleIntent(anyObject()); + GSAState.setInstanceForTesting(gsaState); + + ExternalAuthUtils externalAuthUtils = Mockito.mock(ExternalAuthUtils.class); + doReturn(true).when(externalAuthUtils).isGoogleSigned(anyString()); + doReturn(true).when(externalAuthUtils).isChromeGoogleSigned(); + ExternalAuthUtils.setInstanceForTesting(externalAuthUtils); + + mActivityTestRule.startMainActivityOnBlankPage(); + } + + @Test + @MediumTest + @CommandLineFlags.Add({"force-fieldtrial-params=Study.Group:colorful_mic/true"}) + @Feature({"RenderTest"}) + public void testAssistantColorfulMic() throws IOException { + mActivityTestRule.loadUrlInNewTab(UrlConstants.NTP_URL, /* incognito= */ false); + + mRenderTestRule.render(mActivityTestRule.getActivity().findViewById(R.id.ntp_content), + "avs_colorful_mic_unfocused_ntp"); + + onView(withId(R.id.search_box)).perform(click()); + mRenderTestRule.render(mActivityTestRule.getActivity().findViewById(R.id.toolbar), + "avs_colorful_mic_focused"); + } + + @Test + @MediumTest + @CommandLineFlags.Add({"force-fieldtrial-params=Study.Group:colorful_mic/false"}) + @Feature({"RenderTest"}) + public void testAssistantMic() throws IOException { + mActivityTestRule.loadUrlInNewTab(UrlConstants.NTP_URL, /* incognito= */ false); + + mRenderTestRule.render(mActivityTestRule.getActivity().findViewById(R.id.ntp_content), + "avs__mic_unfocused_ntp"); + + onView(withId(R.id.search_box)).perform(click()); + mRenderTestRule.render( + mActivityTestRule.getActivity().findViewById(R.id.toolbar), "avs_mic_focused"); + } +} \ No newline at end of file
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java new file mode 100644 index 0000000..18240c5 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/childaccounts/ChildAccountServiceTest.java
@@ -0,0 +1,98 @@ +// Copyright 2021 The Chromium 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.childaccounts; + +import static org.mockito.Mockito.verify; + +import android.accounts.Account; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule; +import org.chromium.components.signin.AccountManagerFacade.ChildAccountStatusListener; +import org.chromium.components.signin.AccountUtils; +import org.chromium.components.signin.ChildAccountStatus; +import org.chromium.components.signin.test.util.FakeAccountManagerFacade; + +/** + * Unit tests for {@link ChildAccountService}. + */ +@RunWith(BaseRobolectricTestRunner.class) +public class ChildAccountServiceTest { + private static final Account CHILD_ACCOUNT = + AccountUtils.createAccountFromName("child.account@gmail.com"); + + private final FakeAccountManagerFacade mFakeFacade = new FakeAccountManagerFacade(null) { + @Override + public void checkChildAccountStatus(Account account, ChildAccountStatusListener listener) { + listener.onStatusReady(account.name.startsWith("child") + ? ChildAccountStatus.REGULAR_CHILD + : ChildAccountStatus.NOT_CHILD); + } + }; + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Rule + public final AccountManagerTestRule mAccountManagerTestRule = + new AccountManagerTestRule(mFakeFacade); + + @Mock + private ChildAccountStatusListener mListenerMock; + + @Test + public void testChildAccountStatusWhenNoAccountsOnDevice() { + ChildAccountService.checkChildAccountStatus(mListenerMock); + verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD); + } + + @Test + public void testChildAccountStatusWhenTwoChildAccountsOnDevice() { + // For product reason, child account cannot share device, so as long + // as more than one account detected on device, the child account status + // on device should be NOT_CHILD. + mAccountManagerTestRule.addAccount(CHILD_ACCOUNT); + mAccountManagerTestRule.addAccount("child.account2@gmail.com"); + ChildAccountService.checkChildAccountStatus(mListenerMock); + verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD); + } + + @Test + public void testChildAccountStatusWhenOneChildAndOneAdultAccountsOnDevice() { + mAccountManagerTestRule.addAccount(CHILD_ACCOUNT); + mAccountManagerTestRule.addAccount("adult.account@gmail.com"); + ChildAccountService.checkChildAccountStatus(mListenerMock); + verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD); + } + + @Test + public void testChildAccountStatusWhenTwoAdultAccountsOnDevice() { + mAccountManagerTestRule.addAccount("adult.account1@gmail.com"); + mAccountManagerTestRule.addAccount("adult.account2@gmail.com"); + ChildAccountService.checkChildAccountStatus(mListenerMock); + verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD); + } + + @Test + public void testChildAccountStatusWhenOnlyOneAdultAccountOnDevice() { + mAccountManagerTestRule.addAccount("adult.account1@gmail.com"); + ChildAccountService.checkChildAccountStatus(mListenerMock); + verify(mListenerMock).onStatusReady(ChildAccountStatus.NOT_CHILD); + } + + @Test + public void testChildAccountStatusWhenOnlyOneChildAccountOnDevice() { + mAccountManagerTestRule.addAccount(CHILD_ACCOUNT); + ChildAccountService.checkChildAccountStatus(mListenerMock); + verify(mListenerMock).onStatusReady(ChildAccountStatus.REGULAR_CHILD); + } +} \ No newline at end of file
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java index 4fd4222..fc85aa4 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java
@@ -189,6 +189,25 @@ @Test @Feature("OmniboxAssistantVoiceSearch") + public void testStartVoiceRecognition_StartsAssistantVoiceSearch_TemporaryAccountMismatch() { + doReturn(false).when(mGsaState).doesGsaAccountMatchChrome(); + + Assert.assertFalse(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch()); + Assert.assertEquals(1, + ShadowRecordHistogram.getHistogramValueCountForTesting( + AssistantVoiceSearchService.USER_ELIGIBILITY_FAILURE_REASON_HISTOGRAM, + AssistantVoiceSearchService.EligibilityFailureReason.ACCOUNT_MISMATCH)); + + doReturn(true).when(mGsaState).doesGsaAccountMatchChrome(); + Assert.assertTrue(mAssistantVoiceSearchService.shouldRequestAssistantVoiceSearch()); + Assert.assertEquals(1, + ShadowRecordHistogram.getHistogramValueCountForTesting( + AssistantVoiceSearchService.USER_ELIGIBILITY_FAILURE_REASON_HISTOGRAM, + AssistantVoiceSearchService.EligibilityFailureReason.ACCOUNT_MISMATCH)); + } + + @Test + @Feature("OmniboxAssistantVoiceSearch") public void testAssistantEligibility_VersionTooLow() { doReturn(true).when(mGsaState).isAgsaVersionBelowMinimum(any(), any());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/payments/MockPaymentUiServiceBuilder.java b/chrome/android/junit/src/org/chromium/chrome/browser/payments/MockPaymentUiServiceBuilder.java index d8c87f5a..6cb45a2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/payments/MockPaymentUiServiceBuilder.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/payments/MockPaymentUiServiceBuilder.java
@@ -24,7 +24,8 @@ mPaymentUiService = Mockito.mock(PaymentUiService.class); Mockito.doReturn(null) .when(mPaymentUiService) - .buildPaymentRequestUI(Mockito.any(), Mockito.anyBoolean(), Mockito.anyBoolean()); + .buildPaymentRequestUI(Mockito.anyBoolean(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.any()); Mockito.doReturn(true).when(mPaymentUiService).hasAvailableApps(); List<PaymentApp> apps = new ArrayList<>(); apps.add(app); @@ -35,7 +36,8 @@ /* package */ MockPaymentUiServiceBuilder setBuildPaymentRequestUIResult(String result) { Mockito.doReturn(result) .when(mPaymentUiService) - .buildPaymentRequestUI(Mockito.any(), Mockito.anyBoolean(), Mockito.anyBoolean()); + .buildPaymentRequestUI(Mockito.anyBoolean(), Mockito.any(), Mockito.any(), + Mockito.any(), Mockito.any()); return this; }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/payments/PaymentRequestParamsBuilder.java b/chrome/android/junit/src/org/chromium/chrome/browser/payments/PaymentRequestParamsBuilder.java index 85edd280..a0a87f7 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/payments/PaymentRequestParamsBuilder.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/payments/PaymentRequestParamsBuilder.java
@@ -4,14 +4,19 @@ package org.chromium.chrome.browser.payments; +import android.app.Activity; import android.content.Context; +import android.content.res.Resources; import androidx.annotation.Nullable; import org.mockito.Mockito; -import org.chromium.chrome.browser.app.ChromeActivity; +import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.payments.ui.PaymentUiService; +import org.chromium.chrome.browser.tabmodel.TabModel; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.components.payments.BrowserPaymentRequest; import org.chromium.components.payments.JourneyLogger; import org.chromium.components.payments.MojoPaymentRequestGateKeeper; @@ -48,7 +53,6 @@ private final WebContents mWebContents; private final JourneyLogger mJourneyLogger; private final PaymentRequestSpec mSpec; - private final ChromeActivity mActivity; private final PaymentUiService mPaymentUiService; private final boolean mGoogleBridgeEligible; private final PaymentOptions mOptions; @@ -63,7 +67,6 @@ mClient = client; mDelegate = this; mPaymentUiService = paymentUiService; - mActivity = Mockito.mock(ChromeActivity.class); mJourneyLogger = Mockito.mock(JourneyLogger.class); mWebContents = Mockito.mock(WebContents.class); Mockito.doReturn("https://top.level.origin").when(mWebContents).getLastCommittedUrl(); @@ -184,8 +187,35 @@ } @Override - public ChromeActivity getChromeActivity(WebContents webContents) { - return mActivity; + public Activity getActivity(WebContents webContents) { + Activity activity = Mockito.mock(Activity.class); + Resources resources = Mockito.mock(Resources.class); + Mockito.doReturn(resources).when(activity).getResources(); + return activity; + } + + @Nullable + @Override + public TabModelSelector getTabModelSelector(WebContents webContents) { + return Mockito.mock(TabModelSelector.class); + } + + @Nullable + @Override + public TabModel getTabModel(WebContents webContents) { + return Mockito.mock(TabModel.class); + } + + @Nullable + @Override + public OverviewModeBehavior getOverviewModeBehavior(WebContents webContents) { + return Mockito.mock(OverviewModeBehavior.class); + } + + @Nullable + @Override + public ActivityLifecycleDispatcher getActivityLifecycleDispatcher(WebContents webContents) { + return Mockito.mock(ActivityLifecycleDispatcher.class); } @Override
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java index 9903ddb..7e71670 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
@@ -59,8 +59,9 @@ @Rule public final Features.JUnitProcessor processor = new Features.JUnitProcessor(); - private static final AccountInfo ACCOUNT_INFO = new AccountInfo( - new CoreAccountId("gaia-id-user"), "user@domain.com", "gaia-id-user", null); + private static final AccountInfo ACCOUNT_INFO = + new AccountInfo(new CoreAccountId("gaia-id-user"), "user@domain.com", "gaia-id-user", + "full name", "given name", null); private final SigninManagerImpl.Natives mNativeMock = mock(SigninManagerImpl.Natives.class); private final AccountTrackerService mAccountTrackerService = mock(AccountTrackerService.class); @@ -335,7 +336,7 @@ @Test public void callbackNotifiedOnSignin() { AccountInfo account = new AccountInfo(new CoreAccountId("test_at_gmail.com"), - "test@gmail.com", "test_at_gmail.com", null); + "test@gmail.com", "test_at_gmail.com", "full name", "given name", null); // No need to seed accounts to the native code. doReturn(true).when(mAccountTrackerService).checkAndSeedSystemAccounts(); @@ -370,7 +371,7 @@ @Test(expected = AssertionError.class) public void failIfAlreadySignedin() { AccountInfo account = new AccountInfo(new CoreAccountId("test_at_gmail.com"), - "test@gmail.com", "test_at_gmail.com", null); + "test@gmail.com", "test_at_gmail.com", "full name", "given name", null); // No need to seed accounts to the native code. doReturn(true).when(mAccountTrackerService).checkAndSeedSystemAccounts();
diff --git a/chrome/android/modules/buildflags.gni b/chrome/android/modules/buildflags.gni index b578193..bf9325c3 100644 --- a/chrome/android/modules/buildflags.gni +++ b/chrome/android/modules/buildflags.gni
@@ -13,8 +13,7 @@ # other DFMs. # TODO(crbug.com/1126301): The binary size tools need to be updated to include # DFM code before this can be enabled on stable. - enable_chrome_module = android_channel == "default" || - android_channel == "canary" || android_channel == "dev" + enable_chrome_module = false # Whether to enable DFMs which depend on the chrome DFM. These will be split # out of the chrome DFM using DexSplitter.
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 354f4a3..944e278 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc
@@ -578,6 +578,10 @@ #if defined(OS_ANDROID) UmaSessionStats::OnStartup(); #endif + +#if defined(OS_MAC) + chrome::CacheChannelInfo(); +#endif } bool ChromeMainDelegate::ShouldCreateFeatureList() {
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 7b663f10..b26d6013 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -360,6 +360,12 @@ <message name="IDS_CELLULAR_SETUP_CLOSE_EID_POPUP_BUTTON_LABEL" desc="A11y and tooltip label for EID and QR code popup close button when viewing EID and QR code popup"> Close EID and QR code popup </message> + <message name="IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_MESSAGE" desc="Message, prompting the user to enter the confirmation code to activate an eSIM profile."> + Please enter your confirmation code for <ph name="PROFILE_NAME">$1<ex>Google Fi</ex></ph>. + </message> + <message name="IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_INPUT" desc="Label for the input used to enter the confirmation code to activate an eSIM profile."> + Confirmation code + </message> <!-- Upgrade notifications --> <message name="IDS_RELAUNCH_REQUIRED_TITLE_DAYS" desc="The title of a dialog that tells users the device must be restarted within two or more days."> @@ -5859,12 +5865,18 @@ <message name="IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON" desc="The restore button label of the notification for the user to select restore apps and pages on startup."> Restore </message> + <message name="IDS_SET_RESTORE_NOTIFICATION_BUTTON" desc="The button label of the notification for the user to set restore by default."> + Settings + </message> <message name="IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON" desc="The cancel button label of the notification for the user to select not restore on startup."> Cancel </message> <message name="IDS_RESTORE_NOTIFICATION_TITLE" desc="This is the title of the notification for the user to select restore or not on startup."> Restore apps & pages? </message> + <message name="IDS_SET_RESTORE_NOTIFICATION_TITLE" desc="This is the title of the notification for the user to set restore by default."> + Restore apps & pages by default? + </message> <message name="IDS_RESTORE_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to select restore or not on startup if the 'restore_apps_and_pages' setting is 'Ask every time', and the system is not crashed before reboot."> Continue where you left off. </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_INPUT.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_INPUT.png.sha1 new file mode 100644 index 0000000..51e7421 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_INPUT.png.sha1
@@ -0,0 +1 @@ +010932e9ce938b6970f3c0c11b363376d1168b0d \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_MESSAGE.png.sha1 new file mode 100644 index 0000000..51e7421 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_MESSAGE.png.sha1
@@ -0,0 +1 @@ +010932e9ce938b6970f3c0c11b363376d1168b0d \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_SET_RESTORE_NOTIFICATION_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_SET_RESTORE_NOTIFICATION_BUTTON.png.sha1 new file mode 100644 index 0000000..921f727 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_SET_RESTORE_NOTIFICATION_BUTTON.png.sha1
@@ -0,0 +1 @@ +857fd7008ecb96b8ff900f229cb53803df36fcc2 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_SET_RESTORE_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_SET_RESTORE_NOTIFICATION_TITLE.png.sha1 new file mode 100644 index 0000000..921f727 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_SET_RESTORE_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@ +857fd7008ecb96b8ff900f229cb53803df36fcc2 \ No newline at end of file
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index 2ba5ec3..7cdf325 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -1227,7 +1227,15 @@ <message name="IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to select restore or not on startup after crash."> Chromium OS didn't shut down correctly. </message> + <message name="IDS_SET_RESTORE_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to set restore by default."> + Chromium OS can always restore your apps & pages after reboot without asking every time. + </message> </if> + + <!-- ChromeBeta bubble --> + <message name="IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE" desc="Text that shows in the footer of the Chrome Beta bubble when relaunch is needed for changes to take effect."> + Your changes will take effect the next time you relaunch Chromium. + </message> </messages> </release> </grit>
diff --git a/chrome/app/chromium_strings_grd/IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE.png.sha1 new file mode 100644 index 0000000..51fd860 --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE.png.sha1
@@ -0,0 +1 @@ +9fe5fe3f47d4059771289e9db8419e8e86cf26cc \ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_SET_RESTORE_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_SET_RESTORE_NOTIFICATION_MESSAGE.png.sha1 new file mode 100644 index 0000000..b22c33b3 --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_SET_RESTORE_NOTIFICATION_MESSAGE.png.sha1
@@ -0,0 +1 @@ +b0d1616fde28e22e3e6a58bcc3249e4d60135ba2 \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 2c075d95..362410e 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -11103,6 +11103,12 @@ desc="Menu item to launch the Chrome watch feature"> Watch </message> + + <!-- ChromeBeta bubble --> + <message name="IDS_CHROMEBETA_RELAUNCH_BUTTON_LABEL" + desc="Label on the button in the footer of the Chrome Beta bubble which will relaunch the browser."> + Relaunch + </message> </messages> </release> </grit>
diff --git a/chrome/app/generated_resources_grd/IDS_CHROMEBETA_RELAUNCH_BUTTON_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_CHROMEBETA_RELAUNCH_BUTTON_LABEL.png.sha1 new file mode 100644 index 0000000..895df59 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_CHROMEBETA_RELAUNCH_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@ +5d829aaebb289b5e55b0c4e88dc0e5ca9c8549c3 \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index a5a69f8..490f486 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -1243,7 +1243,15 @@ <message name="IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to select restore or not on startup after crash."> Chrome OS didn't shut down correctly. </message> + <message name="IDS_SET_RESTORE_NOTIFICATION_MESSAGE" desc="This is the text message of the notification for the user to set restore by default."> + Chrome OS can always restore your apps & pages after reboot without asking every time. + </message> </if> + + <!-- ChromeBeta bubble --> + <message name="IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE" desc="Text that shows in the footer of the Chrome Beta bubble when relaunch is needed for changes to take effect."> + Your changes will take effect the next time you relaunch Google Chrome. + </message> </messages> </release> </grit>
diff --git a/chrome/app/google_chrome_strings_grd/IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE.png.sha1 new file mode 100644 index 0000000..51fd860 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE.png.sha1
@@ -0,0 +1 @@ +9fe5fe3f47d4059771289e9db8419e8e86cf26cc \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_SET_RESTORE_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_SET_RESTORE_NOTIFICATION_MESSAGE.png.sha1 new file mode 100644 index 0000000..921f727 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_SET_RESTORE_NOTIFICATION_MESSAGE.png.sha1
@@ -0,0 +1 @@ +857fd7008ecb96b8ff900f229cb53803df36fcc2 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index 68b872e..06b76986 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -981,6 +981,18 @@ <message name="IDS_SETTINGS_ASSIGN_PREVIOUS_SWITCH_LABEL" desc="Label for the setting to assign a switch to the action 'Previous', which moves focus to the previous element."> Previous </message> + <message name="IDS_SETTINGS_SWITCH_ACCESS_INTERNAL_DEVICE_TYPE_LABEL" desc="Label to apply to a switch key from the built-in keyboard. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> + Built-in Keyboard + </message> + <message name="IDS_SETTINGS_SWITCH_ACCESS_USB_DEVICE_TYPE_LABEL" desc="Label to apply to a switch key from a USB device. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> + USB + </message> + <message name="IDS_SETTINGS_SWITCH_ACCESS_BLUETOOTH_DEVICE_TYPE_LABEL" desc="Label to apply to a switch key from a Bluetooth device. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> + Bluetooth + </message> + <message name="IDS_SETTINGS_SWITCH_ACCESS_UNKNOWN_DEVICE_TYPE_LABEL" desc="Label to apply to a switch key from an unknown device. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> + Unknown + </message> <message name="IDS_SETTINGS_SWITCH_ACCESS_AUTO_SCAN_HEADING" desc="Heading for the settings section containing preferences around Switch Access automatically scanning between elements."> Auto-scan </message> @@ -1018,6 +1030,9 @@ <message name="IDS_SETTINGS_SWITCH_ACCESS_ACTION_ASSIGNMENT_DIALOG_WARN_CANNOT_REMOVE_LAST_SELECT_SWITCH" desc="A message warning the user that they cannot remove the last switch for the Select action. The text for the 'Select' action should be the same as the text from IDS_SETTINGS_ASSIGN_SELECT_SWITCH_LABEL. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> Can’t remove the only switch assigned to Select. Press any key to exit. </message> + <message name="IDS_SETTINGS_SWITCH_AND_DEVICE_TYPE" desc="Label describing a switch key and the type of device where the switch key exists. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> + <ph name="SWITCH">$1<ex>backspace</ex></ph> (<ph name="DEVICE_TYPE">$2<ex>USB</ex></ph>) + </message> <message name="IDS_SETTINGS_ASSIGN_SWITCH_SUB_LABEL_0_SWITCHES" desc="A sub-label for the link that brings up a dialog to assign a switch key to an action. Mentions zero switches assigned. Switch Access is an alternative input method designed for users with limited mobility, where the user has as little as one switch (for example, a button) to control the computer."> 0 switches assigned </message>
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_BLUETOOTH_DEVICE_TYPE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_BLUETOOTH_DEVICE_TYPE_LABEL.png.sha1 new file mode 100644 index 0000000..612df65c --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_BLUETOOTH_DEVICE_TYPE_LABEL.png.sha1
@@ -0,0 +1 @@ +78fd8642607158a85cccfdae2f9010d31159557a \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_INTERNAL_DEVICE_TYPE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_INTERNAL_DEVICE_TYPE_LABEL.png.sha1 new file mode 100644 index 0000000..34ebcc7 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_INTERNAL_DEVICE_TYPE_LABEL.png.sha1
@@ -0,0 +1 @@ +8f25638a049f853967bb36884a5268cc1a6bb900 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_UNKNOWN_DEVICE_TYPE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_UNKNOWN_DEVICE_TYPE_LABEL.png.sha1 new file mode 100644 index 0000000..7e33db8 --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_UNKNOWN_DEVICE_TYPE_LABEL.png.sha1
@@ -0,0 +1 @@ +68520afc794c4bbe462225083e5ffd4260609c21 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_USB_DEVICE_TYPE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_USB_DEVICE_TYPE_LABEL.png.sha1 new file mode 100644 index 0000000..aab660e --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_ACCESS_USB_DEVICE_TYPE_LABEL.png.sha1
@@ -0,0 +1 @@ +89ff98103ccc56bed9c14266bb14d98f21e95062 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_AND_DEVICE_TYPE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_AND_DEVICE_TYPE.png.sha1 new file mode 100644 index 0000000..900b226e --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_SWITCH_AND_DEVICE_TYPE.png.sha1
@@ -0,0 +1 @@ +b68015e4ec78c3b22610a284e6180f8bcaa676d1 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 0777be34..8773cd2f 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">የሆነው ሆኖ ከChromium ይወጣ?</translation> <translation id="4415566066719264597">Chromium በበስተጀርባ ላይ ያሂድ</translation> <translation id="4423735387467980091">Chromiumን ያብጁ እና ይቆጣጠሩ</translation> +<translation id="452711251841752011">እንኳን ወደ Chromium በደህና መጡ፤ አዲስ የአሳሽ መስኮት ተከፍቷል</translation> <translation id="4544142686420020088">Chromium አልተዘመነም፣ የሆነ ችግር ተፈጥሯል። <ph name="BEGIN_LINK" />የChrome ዝማኔ ችግሮችን እና ያልተሳኩ ዝማኔዎችን ያስተካክሉ።<ph name="END_LINK" /></translation> <translation id="4567424176335768812">እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ገብተዋል። አሁን የእርስዎን ዕልባቶች፣ ታሪክ እና ሌሎች ቅንብሮች በመለያ በገቡ ሁሉም መሣሪያዎችዎ ላይ መድረስ ይችላሉ።</translation> <translation id="459535195905078186">የChromium መተግበሪያዎች</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Chromium ነባሪውን አሳሽ ያድርጉ።</translation> <translation id="6266342355635466082">Chromium ዝማኔዎችን መፈተሽ አይችልም። የበይነመረብ ግንኙነትዎን ለመፈተሽ ይሞክሩ።</translation> <translation id="6268381023930128611">ከChromium ተዘግቶ ይውጣ?</translation> +<translation id="6281746429495226318">የChromium መገለጫዎን ያብጁ</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> አደገኛ ሊሆን ስለሚችል Chromium አግዶታል።</translation> <translation id="6309712487085796862">Chromium ካሜራዎን እየተጠቀመ ነው።</translation> <translation id="6333502561965082103">ሌላ ሥርዓተ ክወና በChromium ላይ በሂደት ላይ ነው። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index a8a2156..10de440 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -263,7 +263,7 @@ <translation id="9019929317751753759">لجعل Chromium أكثر أمنًا، أوقفنا الإضافة التالية التي لم تُدرج في <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> وربما تكون قد أضيفت بدون علمك.</translation> <translation id="9089354809943900324">إصدار Chromium قديم</translation> <translation id="9093206154853821181">{0,plural, =1{ستتم إعادة تشغيل Chromium في غضون ساعة واحدة}zero{ستتم إعادة تشغيل Chromium في غضون # ساعة}two{ستتم إعادة تشغيل Chromium في غضون ساعتين}few{ستتم إعادة تشغيل Chromium في غضون # ساعات}many{ستتم إعادة تشغيل Chromium في غضون # ساعةً}other{ستتم إعادة تشغيل Chromium في غضون # ساعة}}</translation> -<translation id="9107750757953039239">إذا كانت لديك حسابات متعددة في Google، يمكنك إضافتها على جهاز <ph name="DEVICE_TYPE" />. وستكون حساباتك متوفّرة في متصفِّح Chromium و"متجر Play"، بالإضافة إلى خدمات مثل Gmail وDrive وYouTube. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> +<translation id="9107750757953039239">إذا كانت لديك حسابات متعددة على Google، يمكنك إضافتها إلى جهاز <ph name="DEVICE_TYPE" />. وستكون حساباتك متوفّرة في متصفِّح Chromium و"متجر Play"، بالإضافة إلى خدمات مثل Gmail وDrive وYouTube. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="91086099826398415">فتح الرابط في علامة تبويب جديدة في Chromium</translation> <translation id="911206726377975832">هل تريد أيضًا حذف بيانات التصفح؟</translation> <translation id="9158494823179993217">ضَبَط مشرف النظام Chromium لفتح متصفِّح بديل للوصول إلى <ph name="TARGET_URL_HOSTNAME" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 4edc2510..e349dc4 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Усё роўна выйсці з Chromium?</translation> <translation id="4415566066719264597">Дазволіць браўзеру Chromium працаваць у фоне</translation> <translation id="4423735387467980091">Наладка і кіраванне Chromium</translation> +<translation id="452711251841752011">Вітаем у Chromium! Адкрыта новае акно браўзера</translation> <translation id="4544142686420020088">Chromium не абнавіўся. Нешта пайшло не так. <ph name="BEGIN_LINK" />Выправіце праблемы з абнаўленнем Chromium і памылкі абнаўлення.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Вы ўвайшлі як <ph name="USER_EMAIL_ADDRESS" /> і цяпер маеце доступ да закладак, гісторыі і іншых налад на ўсіх прыладах, дзе выкананы ўваход.</translation> <translation id="459535195905078186">Праграмы Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Зрабіць Chromium стандартным браўзерам</translation> <translation id="6266342355635466082">Браўзеру Chromium не ўдаецца праверыць наяўнасць абнаўленняў. Паспрабуйце праверыць падключэнне да інтэрнэту.</translation> <translation id="6268381023930128611">Выйсці з уліковага запісу ў браўзеры Chromium?</translation> +<translation id="6281746429495226318">Наладзьце свой профіль Chromium</translation> <translation id="6295779123002464101">Файл "<ph name="FILE_NAME" />" можа быць небяспечным, таму Chromium заблакіраваў яго.</translation> <translation id="6309712487085796862">Chromium выкарыстоўвае камеру.</translation> <translation id="6333502561965082103">У Chromium выконваецца іншая аперацыя. Паўтарыце спробу пазней.</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 3f854488..bd2ebc3 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -99,6 +99,7 @@ <translation id="4407044323746248786">তা স্বত্তেও Chromium ছেড়ে যাবেন?</translation> <translation id="4415566066719264597">Chromium-কে ব্যাকগ্রাউন্ডে চলতে দিন</translation> <translation id="4423735387467980091">Chromium কাস্টমাইজ ও নিয়ন্ত্রণ করুন</translation> +<translation id="452711251841752011">Chromium-এ স্বাগতম; নতুন ব্রাউজার উইন্ডো খোলা হয়েছে</translation> <translation id="4544142686420020088">Chromium আপডেট করা যায়নি, কোনও সমস্যা হয়েছে। <ph name="BEGIN_LINK" />Chromium আপডেট করতে না পারার সমস্যা ও আপডেট করা যায়নি এমন সমস্যার সমাধান করুন।<ph name="END_LINK" /></translation> <translation id="4567424176335768812">আপনি <ph name="USER_EMAIL_ADDRESS" /> হিসেবে সাইন-ইন করেছেন৷ এখন আপনি আপনার সমস্ত সাইন-ইন করা ডিভাইসে আপনার বুকমার্ক, ইতিহাস এবং অন্যান্য সেটিংস অ্যাক্সেস করতে পারেন৷</translation> <translation id="459535195905078186">Chromium অ্যাপ্লিকেশানগুলি</translation> @@ -158,6 +159,7 @@ <translation id="6248213926982192922">Chromium-কে ডিফল্ট ব্রাউজার করুন</translation> <translation id="6266342355635466082">কোনও আপডেট আছে কিনা, Chromium তা চেক করে দেখতে পারছে না। আপনার ইন্টারনেট কানেকশন চেক করে দেখে নিন।</translation> <translation id="6268381023930128611">Chromium থেকে সাইন-আউট করবেন?</translation> +<translation id="6281746429495226318">আপনার Chromium প্রোফাইল কাস্টমাইজ করুন</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> বিপজ্জনক হতে পারে, তাই Chromium এটিকে অবরুদ্ধ করেছে।</translation> <translation id="6309712487085796862">Chromium আপনার ক্যামেরা ব্যবহার করছে৷</translation> <translation id="6333502561965082103">Chromium এ আরেকটি ক্রিয়াকলাপ প্রক্রিয়ায় আছে। অনুগ্রহ করে পরে আবার চেষ্টা করুন।</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index 2571259..de8ef1e 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -99,6 +99,7 @@ <translation id="4407044323746248786">Vols sortir de Chromium igualment?</translation> <translation id="4415566066719264597">Permet que Chromium s'executi en segon pla</translation> <translation id="4423735387467980091">Personalitza i controla Chromium</translation> +<translation id="452711251841752011">Et donem la benvinguda a Chromium; s'ha obert una altra finestra del navegador</translation> <translation id="4544142686420020088">No s'ha actualitzat Chromium. S'ha produït un error. <ph name="BEGIN_LINK" />Soluciona els problemes i errors d'actualització de Chromium<ph name="END_LINK" />.</translation> <translation id="4567424176335768812">Heu iniciat la sessió com a <ph name="USER_EMAIL_ADDRESS" />. Ja podeu accedir a les vostres adreces d'interès, al vostre historial i a altres paràmetres en tots els dispositius en què teniu la sessió iniciada.</translation> <translation id="459535195905078186">Aplicacions de Chromium</translation> @@ -158,6 +159,7 @@ <translation id="6248213926982192922">Estableix Chromium com a navegador predeterminat</translation> <translation id="6266342355635466082">Chromium no pot cercar actualitzacions. Comprova la connexió a Internet.</translation> <translation id="6268381023930128611">Voleu tancar la sessió de Chromium?</translation> +<translation id="6281746429495226318">Personalitza el teu perfil de Chromium</translation> <translation id="6295779123002464101">Chromium ha bloquejat <ph name="FILE_NAME" /> perquè pot ser perillós.</translation> <translation id="6309712487085796862">Chromium està utilitzant la càmera.</translation> <translation id="6333502561965082103">Hi ha una altra operació en curs a Chromium. Torna-ho a provar més tard.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index 2611f41..a4d8ce43 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Přesto Chromium ukončit?</translation> <translation id="4415566066719264597">Nechat Chromium běžet na pozadí</translation> <translation id="4423735387467980091">Přizpůsobit a ovládat Chromium</translation> +<translation id="452711251841752011">Vítá vás Chromium; bylo otevřeno nové okno prohlížeče</translation> <translation id="4544142686420020088">Prohlížeč Chromium se neaktualizoval, něco se pokazilo. <ph name="BEGIN_LINK" />Vyřešte problémy se stahováním aktualizací prohlížeče Chromium a neúspěšnými aktualizacemi.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Jste přihlášeni pomocí účtu <ph name="USER_EMAIL_ADDRESS" />. Nyní můžete přistupovat ke všem svým záložkám, historii a dalším nastavením ve všech přihlášených zařízeních.</translation> <translation id="459535195905078186">Aplikace Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Nastavit Chromium jako výchozí prohlížeč</translation> <translation id="6266342355635466082">Chromium nemůže vyhledat dostupné aktualizace. Zkuste zkontrolovat připojení k internetu.</translation> <translation id="6268381023930128611">Odhlásit se z prohlížeče Chromium?</translation> +<translation id="6281746429495226318">Upravit profil Chromium</translation> <translation id="6295779123002464101">Soubor <ph name="FILE_NAME" /> může být nebezpečný, proto jej prohlížeč Chromium zablokoval.</translation> <translation id="6309712487085796862">Chromium používá vaši kameru.</translation> <translation id="6333502561965082103">V prohlížeči Chromium právě probíhá jiná operace. Zkuste to znovu později.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index fea4f4f..29d983a 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Chromium-etik irten nahi duzu hala ere?</translation> <translation id="4415566066719264597">Onartu Chromium atzeko planoan abiaraztea</translation> <translation id="4423735387467980091">Pertsonalizatu eta kontrolatu Chromium</translation> +<translation id="452711251841752011">Ongi etorri Chromium-era; beste leiho bat ireki da arakatzailean</translation> <translation id="4544142686420020088">Chromium ez da eguneratu arazoren bat izan delako. <ph name="BEGIN_LINK" />Konpondu Chromium eguneratzeko arazoak eta huts egindako eguneratzeak.<ph name="END_LINK" /></translation> <translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> gisa hasi duzu saioa. Laster-markak, historia eta bestelako ezarpenak atzi ditzakezu saioa hasita daukaten gailu guztien bidez.</translation> <translation id="459535195905078186">Chromium aplikazioak</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Ezarri Chromium arakatzaile lehenetsi gisa</translation> <translation id="6266342355635466082">Chromium-ek ezin du egiaztatu eguneratzerik dagoen. Egiaztatu Internetera konektatuta zaudela.</translation> <translation id="6268381023930128611">Chromium-eko saioa amaitu?</translation> +<translation id="6281746429495226318">Pertsonalizatu Chromium-eko profila</translation> <translation id="6295779123002464101">Baliteke <ph name="FILE_NAME" /> arriskutsua izatea; horregatik, blokeatu egin du Chromium-ek.</translation> <translation id="6309712487085796862">Chromium zure kamera erabiltzen ari da.</translation> <translation id="6333502561965082103">Beste eragiketa bat egiten ari da Chromium. Saiatu berriro geroago.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index 1ed42d8..b9af03e 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -98,6 +98,7 @@ <translation id="4407044323746248786">درهرصورت از Chromium خارج میشوید؟</translation> <translation id="4415566066719264597">اجازه به Chromium برای اجرا در پسزمینه</translation> <translation id="4423735387467980091">سفارشی کردن و کنترل Chromium</translation> +<translation id="452711251841752011">به Chromium خوشآمدید؛ پنجره مرورگر جدید راهاندازی شد</translation> <translation id="4544142686420020088">Chromium بهروزرسانی نشد؛ مشکلی پیش آمد. <ph name="BEGIN_LINK" />مشکلات بهروزرسانی Chromium و بهروزرسانیهای ناموفق را برطرف کنید.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">با حساب <ph name="USER_EMAIL_ADDRESS" /> وارد سیستم شدهاید. اکنون در همه دستگاههایی که با آنها به سیستم وارد شدهاید میتوانید به نشانکها، سابقه و دیگر تنظیماتتان دسترسی داشته باشید.</translation> <translation id="459535195905078186">برنامههای Chromium</translation> @@ -157,6 +158,7 @@ <translation id="6248213926982192922">Chromium مرورگر پیشفرض شود</translation> <translation id="6266342355635466082">Chromium نمیتواند بهروزرسانیها را بررسی کند. اتصال اینترنت را بررسی کنید.</translation> <translation id="6268381023930128611">از Chromium خارج میشوید؟</translation> +<translation id="6281746429495226318">سفارشی کردن نمایه Chromium</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> ممکن است خطرناک باشد، بنابراین Chromium آن را مسدود کرده است.</translation> <translation id="6309712487085796862">Chromium درحال استفاده از دوربین شما است.</translation> <translation id="6333502561965082103">عملیات دیگری در Chromium درحال انجام است. لطفاً بعداً دوباره امتحان کنید.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 4dd01e6..c7d9a99df 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -99,6 +99,7 @@ <translation id="4407044323746248786">Suljetaanko Chromium silti?</translation> <translation id="4415566066719264597">Jätä Chromium käyntiin taustalle</translation> <translation id="4423735387467980091">Chromiumin muokkaus ja hallinta</translation> +<translation id="452711251841752011">Tervetuloa Chromiumiin, uusi selainikkuna avattu</translation> <translation id="4544142686420020088">Chromiumia ei päivitetty, vaan jotain meni pieleen. <ph name="BEGIN_LINK" />Korjaa Chromiumin päivitysongelmat ja epäonnistuneet päivitykset<ph name="END_LINK" />.</translation> <translation id="4567424176335768812">Olet kirjautunut Chromeen tilillä <ph name="USER_EMAIL_ADDRESS" />. Nyt voit käyttää kirjanmerkkejäsi, historiaa ja muita asetuksia kaikilla laitteilla, joihin olet kirjautunut.</translation> <translation id="459535195905078186">Chromium-sovellukset</translation> @@ -158,6 +159,7 @@ <translation id="6248213926982192922">Tee Chromiumista oletusselain</translation> <translation id="6266342355635466082">Chromium ei voi tarkistaa päivityksiä. Tarkista internetyhteytesi.</translation> <translation id="6268381023930128611">Kirjaudutaanko ulos?</translation> +<translation id="6281746429495226318">Muokkaa Chromium-profiiliasi</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> voi olla vaarallinen, joten Chromium on estänyt sen.</translation> <translation id="6309712487085796862">Chromium käyttää kameraasi.</translation> <translation id="6333502561965082103">Toinen Chromium-prosessi on jo käynnissä. Yritä myöhemmin uudelleen.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb index 2940e4f..c6920b0 100644 --- a/chrome/app/resources/chromium_strings_fr-CA.xtb +++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Quitter Chromium quand même?</translation> <translation id="4415566066719264597">Laisser Chromium s'exécuter en arrière-plan</translation> <translation id="4423735387467980091">Personnaliser et commander Chrome</translation> +<translation id="452711251841752011">Bienvenue à Chromium, une nouvelle fenêtre de navigateur a été ouverte</translation> <translation id="4544142686420020088">La mise à jour de Chromium n'a pas été installée. Une erreur s'est produite. <ph name="BEGIN_LINK" />Découvrez comment résoudre les problèmes de mise à jour de Chromium.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Vous êtes connecté avec l'adresse de courriel <ph name="USER_EMAIL_ADDRESS" />. Vous pouvez maintenant accéder à vos favoris, à votre historique et à vos paramètres sur tous les appareils sur lesquels vous êtes connecté.</translation> <translation id="459535195905078186">Applications de Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Faire de Chromium le navigateur par défaut</translation> <translation id="6266342355635466082">Chromium ne peut pas vérifier la présence de mises à jour. Essayez de vérifier votre connexion Internet.</translation> <translation id="6268381023930128611">Se déconnecter de Chromium?</translation> +<translation id="6281746429495226318">Personnaliser votre profil Chromium</translation> <translation id="6295779123002464101">Chromium a bloqué le fichier <ph name="FILE_NAME" />, car il peut être dangereux.</translation> <translation id="6309712487085796862">Chromium utilise votre caméra.</translation> <translation id="6333502561965082103">Une autre opération est en cours sur Chromium. Veuillez réessayer plus tard.</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index 12ac4ae9..f326598 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Queres saír de Chromium de todas formas?</translation> <translation id="4415566066719264597">Deixar que Chromium se execute en segundo plano</translation> <translation id="4423735387467980091">Personaliza e controla Chromium</translation> +<translation id="452711251841752011">Dámosche a benvida a Chromium. Abriuse unha nova ventá do navegador</translation> <translation id="4544142686420020088">Chromium non se actualizou, xa que se produciu un erro. <ph name="BEGIN_LINK" />Soluciona os problemas de actualización de Chromium e as actualizacións que non se puidesen realizar<ph name="END_LINK" />.</translation> <translation id="4567424176335768812">Iniciaches sesión como <ph name="USER_EMAIL_ADDRESS" />. Agora podes acceder aos teus marcadores, historial e outras configuracións en todos os dispositivos en que iniciaches sesión.</translation> <translation id="459535195905078186">Aplicacións de Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Establecer Chromium como navegador predeterminado</translation> <translation id="6266342355635466082">Chromium non puido buscar actualizacións. Verifica a conexión a Internet.</translation> <translation id="6268381023930128611">Pechar sesión en Chromium?</translation> +<translation id="6281746429495226318">Personalizar o teu perfil de Chromium</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> pode ser perigoso, así que Chromium bloqueouno.</translation> <translation id="6309712487085796862">Chromium está utilizando a túa cámara.</translation> <translation id="6333502561965082103">Hai outra operación en Chromium que está en progreso. Téntao de novo máis tarde.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index 7b4577cc..67e4bec4 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Փակե՞լ Chromium-ը։</translation> <translation id="4415566066719264597">Թույլատրել Chromium-ին աշխատել ֆոնային ռեժիմում</translation> <translation id="4423735387467980091">Հարմարեցնել և վերահսկել Chromium-ը</translation> +<translation id="452711251841752011">Բարի գալուստ Chromium․ բացված է դիտարկիչի նոր պատուհան</translation> <translation id="4544142686420020088">Անհայտ սխալի պատճառով չհաջողվեց թարմացնել Chromium-ը։ <ph name="BEGIN_LINK" />Շտկել Chromium-ի թարմացման հետ կապված խնդիրները<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Դուք մուտք եք գործել որպես <ph name="USER_EMAIL_ADDRESS" />: Այժմ կարող եք օգտագործել ձեր էջանիշները, պատմությունը և այլ կարգավորումները ձեր բոլոր մուտք գործած սարքերում:</translation> <translation id="459535195905078186">Chromium հավելվածներ</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Դարձնել Chromium-ը կանխադրված դիտարկիչ</translation> <translation id="6266342355635466082">Chromium-ը չի կարող ստուգել թարմացումների առկայությունը։ Ստուգեք ինտերնետ կապը։</translation> <translation id="6268381023930128611">Դուրս գա՞լ Chromium-ից:</translation> +<translation id="6281746429495226318">Անհատականացնել Chromium-ի պրոֆիլը</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> ֆայլը կարող է վտանգավոր լինել, և Chromium-ն արգելափակել է այն։</translation> <translation id="6309712487085796862">Chromium-ն օգտագործում է ձեր տեսախցիկը:</translation> <translation id="6333502561965082103">Chromium-ում տեղադրման մեկ այլ գործողություն ընթացքի մեջ է: Փորձեք ավելի ուշ:</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index b05b3ddc..5831470 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Vis tiek išeiti iš „Chromium“?</translation> <translation id="4415566066719264597">„Chromium“ leidimas fone</translation> <translation id="4423735387467980091">Tinkinkite ir valdykite „Chromium“</translation> +<translation id="452711251841752011">Sveiki, tai – „Chromium“; atidarytas naujas naršyklės langas</translation> <translation id="4544142686420020088">Nepavyko atnaujinti „Chromium“, įvyko klaida. <ph name="BEGIN_LINK" />Pašalinkite „Chromium“ naujinimo problemas ir naujinių klaidas.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Esate prisijungę kaip <ph name="USER_EMAIL_ADDRESS" />. Dabar galite pasiekti savo žymes, istoriją ir kitus nustatymus visuose įrenginiuose, kuriuose esate prisijungę.</translation> <translation id="459535195905078186">„Chromium“ programos</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Padaryti „Chromium“ numatytąja naršykle</translation> <translation id="6266342355635466082">„Chromium“ negali tikrinti naujinių. Pabandykite patikrinti interneto ryšį.</translation> <translation id="6268381023930128611">Atsijungti nuo „Chromium“?</translation> +<translation id="6281746429495226318">Tinkinti „Chromium“ profilį</translation> <translation id="6295779123002464101">Failas „<ph name="FILE_NAME" />“ gali būti pavojingas, todėl „Chromium“ jį užblokavo.</translation> <translation id="6309712487085796862">„Chromium“ naudoja jūsų fotoaparatą.</translation> <translation id="6333502561965082103">Vykdoma kita „Chromium“ operacija. Vėliau bandykite dar kartą.</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index 74f64588..71a3544 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Сепак да се излезе од Chromium?</translation> <translation id="4415566066719264597">Остави го Chromium да работи во заднина</translation> <translation id="4423735387467980091">Приспособи го и контролирај го Chromium</translation> +<translation id="452711251841752011">Добре дојдовте на Chromium; отворен е нов прозорец во прелистувачот</translation> <translation id="4544142686420020088">Chromium не се ажурираше, нешто тргна наопаку. <ph name="BEGIN_LINK" />Поправете ги проблемите со ажурирањето на Chromium и со неуспешните ажурирања.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Најавени сте како <ph name="USER_EMAIL_ADDRESS" />. Сега може да пристапувате кон вашите обележувачи, историја и други поставки на сите најавени уреди.</translation> <translation id="459535195905078186">Апликации на Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Постави го Chromium за стандарден прелистувач</translation> <translation id="6266342355635466082">Chromium не може да провери дали се достапни ажурирања. Проверете ја интернет-врската.</translation> <translation id="6268381023930128611">Ќе се одјавите од Chromium?</translation> +<translation id="6281746429495226318">Приспособете го вашиот профил на Chromium</translation> <translation id="6295779123002464101">Датотеката <ph name="FILE_NAME" /> може да биде опасна, па затоа Chromium ја блокираше.</translation> <translation id="6309712487085796862">Chromium ја користи камерата.</translation> <translation id="6333502561965082103">Во тек е друга операција на Chromium. Обидете се повторно подоцна.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index e2c78dad..ed11ac89 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">എന്തായാലും Chromium-ത്തിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="4415566066719264597">Chromium-ത്തെ പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കാൻ അനുവദിക്കുക</translation> <translation id="4423735387467980091">Chromium ഇഷ്ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക</translation> +<translation id="452711251841752011">Chromium-ലേക്ക് സ്വാഗതം; പുതിയ ബ്രൗസർ വിൻഡോ തുറന്നു</translation> <translation id="4544142686420020088">Chromium അപ്ഡേറ്റ് ചെയ്തില്ല, എന്തോ കുഴപ്പമുണ്ടായി. <ph name="BEGIN_LINK" />Chromium അപ്ഡേറ്റ് സംബന്ധിച്ച പ്രശ്നങ്ങളും പരാജയപ്പെട്ട അപ്ഡേറ്റുകളും പരിഹരിക്കുക.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">നിങ്ങൾ <ph name="USER_EMAIL_ADDRESS" /> ആയി സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു. സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകളും ചരിത്രവും മറ്റ് ക്രമീകരണങ്ങളും ആക്സസ് ചെയ്യാൻ ഇപ്പോൾ നിങ്ങൾക്കാകും.</translation> <translation id="459535195905078186">Chromium അപ്ലിക്കേഷനുകൾ</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Chromium ഡിഫോൾട്ട് ബ്രൗസറാക്കൂ</translation> <translation id="6266342355635466082">Chromium-ന് അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കാനാവില്ല. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക.</translation> <translation id="6268381023930128611">Chromium-ത്തിൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> +<translation id="6281746429495226318">നിങ്ങളുടെ Chromium പ്രൊഫൈൽ ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ, Chromium ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="6309712487085796862">Chromium നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു.</translation> <translation id="6333502561965082103">Chromium-ത്തിൽ മറ്റൊരു പ്രവർത്തനം പുരോഗമിക്കുകയാണ്. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index c9a9362..c97561b 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -99,6 +99,7 @@ <translation id="4407044323746248786">Ieși din Chromium oricum?</translation> <translation id="4415566066719264597">Permite Chromium să ruleze în fundal</translation> <translation id="4423735387467980091">Personalizați și controlați Chromium</translation> +<translation id="452711251841752011">Bun venit la Chromium; fereastră de browser nouă deschisă</translation> <translation id="4544142686420020088">Chromium nu s-a actualizat. A apărut o eroare. <ph name="BEGIN_LINK" />Remediază problemele de actualizare și actualizările nereușite în Chromium.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">V-ați conectat ca <ph name="USER_EMAIL_ADDRESS" />. Acum vă puteți accesa marcajele, istoricul și alte setări de pe toate dispozitivele pe care v-ați conectat.</translation> <translation id="459535195905078186">Aplicații Chromium</translation> @@ -158,6 +159,7 @@ <translation id="6248213926982192922">Setați Chromium ca browser prestabilit</translation> <translation id="6266342355635466082">Chromium nu poate căuta actualizări. Verifică-ți conexiunea la internet.</translation> <translation id="6268381023930128611">Te deconectezi de la Chromium?</translation> +<translation id="6281746429495226318">Personalizează-ți profilul Chromium</translation> <translation id="6295779123002464101">Este posibil ca <ph name="FILE_NAME" /> să fie periculos, așadar Chromium l-a blocat.</translation> <translation id="6309712487085796862">Chromium utilizează camera foto.</translation> <translation id="6333502561965082103">O altă operație din Chromium este în curs de desfășurare. Încearcă din nou mai târziu.</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index ef36786f..d5ddc00 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">කෙසේ වුවත් Chromium වෙතින් ඉවත් වන්න ද?</translation> <translation id="4415566066719264597">Chromium හට පසුබිම ධාවනය වීමට ඉඩ දෙන්න</translation> <translation id="4423735387467980091">Chromium පාලනය හා රුචිකරණය</translation> +<translation id="452711251841752011">Chromium වෙත සාදරයෙන් පිළිගනිමු; නව බ්රවුසර කවුළුවක් විවෘත කරන ලදි</translation> <translation id="4544142686420020088">Chromium යාවත්කාලීන නොවිය, යම් දෙයක් වැරදිණි. <ph name="BEGIN_LINK" />Chromium යාවත්කාලීන ගැටලු සහ අසමත් වූ යාවත්කාලීන නිරාකරණ කරන්න.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">ඔබ <ph name="USER_EMAIL_ADDRESS" /> ලෙස සයින් ඉන් වී තිබේ. ඔබට දැන් ඔබේ පිටු සලකුණු, ඉතිහාසය, සහ අනෙක් පසුතල වෙත ඔබේ අත්සන් කළ උපාංගයෙන් පිවිසිය හැකිය.</translation> <translation id="459535195905078186">Chromium යෙදුම්</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Chromium පෙරනිමි බ්රව්සරය බවට පත් කරන්න</translation> <translation id="6266342355635466082">Chromium හට යාවත්කාලීන පරීක්ෂා කළ නොහැක. ඔබේ අන්තර්ජාල සම්බන්ධතාව පරීක්ෂා කිරීමට උත්සාහ කරන්න.</translation> <translation id="6268381023930128611">Chromium වෙතින් වරන්නද?</translation> +<translation id="6281746429495226318">ඔබගේ Chromium පැතිකඩ අභිරුචිකරණය කරන්න</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> අනතුරුදායක විය හැකිය, එම නිසා Chromium එය අවහිර කර ඇත.</translation> <translation id="6309712487085796862">Chromium ඔබේ කැමරාව භාවිතා කරයි.</translation> <translation id="6333502561965082103">Chromium මත තවත් මෙහෙයුමක් ක්රියාත්මක වෙමින් පවතී. පසුව නැවත උත්සාහ කරන්න.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index f65d71f5..c26503e 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Chcete Chromium napriek tomu ukončiť?</translation> <translation id="4415566066719264597">Povoliť prehliadaču Chromium spustenie na pozadí</translation> <translation id="4423735387467980091">Prispôsobiť a spravovať Chromium</translation> +<translation id="452711251841752011">Vitajte v prehliadači Chromium, otvorilo sa nové okno prehliadača</translation> <translation id="4544142686420020088">Chromium sa neaktualizoval. Vyskytol sa problém. <ph name="BEGIN_LINK" />Vyriešiť problémy so sťahovaním aktualizácií prehliadača Chromium a neúspešnými aktualizáciami<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Ste prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS" />. Teraz môžete na všetkých zariadeniach, kde ste prihlásený/-á, pristupovať k svojim záložkám, histórii a ďalším nastaveniam.</translation> <translation id="459535195905078186">Aplikácie Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Nastavte Chromium ako svoj predvolený prehliadač</translation> <translation id="6266342355635466082">Chromium nemôže skontrolovať dostupnosť aktualizácií. Skontrolujte internetové pripojenie.</translation> <translation id="6268381023930128611">Odhlásiť sa z prehliadača Chromium?</translation> +<translation id="6281746429495226318">Prispôsobiť profil prehliadača Chromium</translation> <translation id="6295779123002464101">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný, a preto ho prehliadač Chromium zablokoval.</translation> <translation id="6309712487085796862">Chromium používa vašu kameru.</translation> <translation id="6333502561965082103">V prehliadači Chromium práve prebieha iná operácia. Skúste to neskôr.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index e00a465f..5cd5a25 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -101,6 +101,7 @@ <translation id="4407044323746248786">Dëshiron të dalësh nga Chromium gjithsesi?</translation> <translation id="4415566066719264597">Lejo që Chromium të ekzekutohet në sfond</translation> <translation id="4423735387467980091">Personalizo dhe kontrollo Chromium</translation> +<translation id="452711251841752011">Mirë se erdhe në Chromium. U hap një dritare e re e shfletuesit</translation> <translation id="4544142686420020088">Chromium nuk u përditësua. Ndodhi një gabim. <ph name="BEGIN_LINK" />Rregullo problemet e përditësimit të Chromium dhe përditësimet e dështuara.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Je identifikuar si <ph name="USER_EMAIL_ADDRESS" />. Tani mund të qasesh te faqeshënuesit, historiku dhe cilësime të tjera në të gjitha pajisjet ku je identifikuar.</translation> <translation id="459535195905078186">Aplikacionet Chromium</translation> @@ -160,6 +161,7 @@ <translation id="6248213926982192922">Bëje Chromium, shfletuesin tënd të parazgjedhur</translation> <translation id="6266342355635466082">Chromium nuk mund të kontrollojë për përditësime. Provo të kontrollosh lidhjen e internetit.</translation> <translation id="6268381023930128611">Dëshiron të dalësh nga Chromium?</translation> +<translation id="6281746429495226318">Personalizo profilin tënd të Chromium</translation> <translation id="6295779123002464101"><ph name="FILE_NAME" /> mund të jetë i rrezikshëm, prandaj Chromium e ka bllokuar.</translation> <translation id="6309712487085796862">Chromium po përdor kamerën tënde.</translation> <translation id="6333502561965082103">Një veprim tjetër në Chromium është në vazhdim. Provo përsëri më vonë.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 293f57e..2597b2e 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">SIM-kaart is gesluit</translation> <translation id="2618797463720777311">Stel Nabydeling op</translation> <translation id="2619761439309613843">Herlaai daagliks</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> kan nie veilig afgelaai word nie.</translation> <translation id="2620436844016719705">Stelsel</translation> <translation id="262154978979441594">Lei Google Assistent-stemmodel op</translation> <translation id="2621713457727696555">Beveilig</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Soek tans na muis …</translation> <translation id="7052237160939977163">Stuur prestasienasporingdata</translation> <translation id="7053983685419859001">Blokkeer</translation> -<translation id="705508001219706572">Installeer <ph name="APP_NAME" /> om vinnig hierheen terug te kom</translation> <translation id="7055152154916055070">Herleiding is geblokkeer:</translation> <translation id="7055451306017383754">Kon nie ontdeel nie want 'n program gebruik tans hierdie vouer. Die vouer sal ontdeel word wanneer Parallels Dekstop weer afgeskakel word.</translation> <translation id="7056526158851679338">Ondersoek toestelle</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">Gaan tans die Linux-houer se opstelling na</translation> <translation id="9209689095351280025">Werwe kan nie webkoekies gebruik wat jou oral op die web naspoor nie</translation> <translation id="9211177926627870898">Opdatering vereis</translation> +<translation id="9211490828691860325">Alle lessenaars</translation> <translation id="9214520840402538427">Oeps! Die inwyding van die installeringtydeienskappe het uitgetel. Kontak asseblief jou steundiensverteenwoordiger.</translation> <translation id="9214695392875603905">Kolwyntjie</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" is bygevoeg</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 073fd19..9883cc0 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -802,6 +802,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> ጭነትዎን ለማጠናቀቅ ዝግጁ ነው</translation> <translation id="1868193363684582383">«Ok Google»</translation> <translation id="1868553836791672080">የይለፍ ቃል ፍተሻ በChromium ውስጥ አይገኝም</translation> +<translation id="1869433484041798909">የዕልባት አዝራር</translation> <translation id="187145082678092583">ያነሱ መተግበሪያዎች</translation> <translation id="1871534214638631766">ቀኝ ጠቅ ሲያደርጉ ወይም በይዘት ላይ ለረዥም ጊዜ ሲጫኑ ተዛማጅ መረጃን አሳይ</translation> <translation id="1871615898038944731">የእርስዎ <ph name="DEVICE_TYPE" /> የተዘመነ ነው</translation> @@ -833,6 +834,7 @@ <translation id="1900305421498694955">ከGoogle Play የመጡ መተግበሪያዎች በውጫዊ የማከማቻ መሣሪያዎች ላይ ፋይሎችን ለማንበብ እና ለመጻፍ ሙሉ የፋይል ሥርዓት መዳረሻ ሊያስፈልጋቸው ይችላሉ። በዚህ መሣሪያ ላይ የተፈጠሩ ፋይሎች እና አቃፊዎች ውጫዊውን አንጻፊ ለሚጠቀሙ ለማናቸውም ሰዎች የሚታዩ ናቸው። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&ሁሉንም ምረጥ</translation> <translation id="1901396183631570154">Chrome እነዚህን የይለፍ ቃላት በእርስዎ የGoogle መለያ ውስጥ ሊያስቀምጣቸው አልቻለም። አሁንም በዚህ መሣሪያ ላይ እነሱን ማስቀመጥ ይችላሉ።</translation> +<translation id="1903995858055162096">የእርስዎ መሣሪያ አይደለም? <ph name="BEGIN_LINK" />የእንግዳ ሁነታ<ph name="END_LINK" />ን ይጠቀሙ።</translation> <translation id="1905375423839394163">የChromebook መሣሪያ ስም</translation> <translation id="1906181697255754968">ጣቢያዎች እንደ ስራዎን በራስ-ሰር ማስቀመጥ ያሉ ባህሪያትን ለማግኘት አብዛኛውን ጊዜ በመሣሪያዎ ላይ ያሉትን ፋይሎች እና አቃፊዎች ይደርሳሉ።</translation> <translation id="1906828677882361942">ማናቸውም ጣቢያዎች ተከታታይ ወደቦችን እንዲደርሱ አይፍቀዱ</translation> @@ -1449,6 +1451,7 @@ <translation id="2617342710774726426">ሲም ካርድ ተዘግቷል</translation> <translation id="2618797463720777311">የአቅራቢያ ማጋሪያን ያቀናብሩ</translation> <translation id="2619761439309613843">ዕለታዊ ዕድሳት</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ደህንነቱ በተጠበቀ ሁኔታ ሊወርድ አይችልም።</translation> <translation id="2620436844016719705">ስርዓት</translation> <translation id="262154978979441594">የGoogle ረዳት የድምፅ ሞዴልን ያሠለጥኑ</translation> <translation id="2621713457727696555">ደህንነቱ ተጠብቋል</translation> @@ -5261,7 +5264,6 @@ <translation id="7051943809462976355">መዳፊትን በመፈለግ ላይ...</translation> <translation id="7052237160939977163">አፈጻጸም መከታተያ ውሂብ ይላኩ</translation> <translation id="7053983685419859001">አግድ</translation> -<translation id="705508001219706572">በፍጥነት ወደዚህ ለመመለስ <ph name="APP_NAME" />ን ይጫኑ</translation> <translation id="7055152154916055070">አቅጣጫ ማዞር ታግዷል፦</translation> <translation id="7055451306017383754">አንድ መተግበሪያ ይህን አቃፊ እየተጠቀመበት ስለሆነ አለማጋራት አልተቻለም። ትይዩዎች ዴስክቶፕ በሚዘጋበት ቀጣዩ ጊዜ ላይ አቃፊው እንዳይጋራ ይደረጋል።</translation> <translation id="7056526158851679338">&መሣሪያዎችን መርምር</translation> @@ -5434,6 +5436,7 @@ <translation id="7251346854160851420">ነባሪ ልጣፍ</translation> <translation id="7253521419891527137">&ተጨማሪ ይወቁ</translation> <translation id="7254951428499890870">እርግጠኛ ነዎት «<ph name="APP_NAME" />»ን በምርመራ ሁነታ ማስጀመር ይፈልጋሉ?</translation> +<translation id="725497546968438223">የዕልባት አቃፊ አዝራር</translation> <translation id="7255002516883565667">አሁን ላይ በዚህ መሣሪያ ላይ ጥቅም ላይ ሊውል የሚችል አንድ መሣሪያ ብቻ አልዎት</translation> <translation id="7255935316994522020">ተግብር</translation> <translation id="7256069762010468647">ጣቢያ የእርስዎን ካሜራ እየተጠቀመ ነው</translation> @@ -5695,6 +5698,7 @@ <translation id="7564847347806291057">ሂደቱን ግታ</translation> <translation id="7566118625369982896">የPlay መተግበሪያ አገናኞችን ያቀናብሩ</translation> <translation id="756809126120519699">የChrome ውሂብ ጸድቷል</translation> +<translation id="756876171895853918">አምሳያን አብጅ</translation> <translation id="7568790562536448087">በማዘመን ላይ</translation> <translation id="7569983096843329377">ጥቁር</translation> <translation id="7571643774869182231">ለዝማኔ የሚሆን በቂ ቦታ የለውም</translation> @@ -7166,6 +7170,7 @@ <translation id="9209563766569767417">የLinux መያዣ ቅንብሩን በመፈተሽ ላይ</translation> <translation id="9209689095351280025">ጣቢያዎች እርስዎን በመላ ድር ላይ የሚከታተሉ ኩኪዎችን መጠቀም አይችሉም</translation> <translation id="9211177926627870898">ዝማኔ ያስፈልጋል</translation> +<translation id="9211490828691860325">ሁሉም ዴስኮች</translation> <translation id="9214520840402538427">ውይ! የጭነት ጊዜ መገለጫ ባህሪያት ጊዜ አልፎባቸዋል። እባክዎ የድጋፍ ተወካይዎን ያግኙ።</translation> <translation id="9214695392875603905">ዘቢብ ኬክ</translation> <translation id="9215293857209265904">«<ph name="EXTENSION_NAME" />» ታክሏል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index fdc4084..4b106b3 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1455,6 +1455,7 @@ <translation id="2617342710774726426">تم قفل شريحة SIM</translation> <translation id="2618797463720777311">إعداد ميزة "المشاركة عن قرب"</translation> <translation id="2619761439309613843">إعادة التحميل يوميًا</translation> +<translation id="2620215283731032047">لا يمكن تنزيل <ph name="FILE_NAME" /> بشكل آمن.</translation> <translation id="2620436844016719705">النظام</translation> <translation id="262154978979441594">تمرين النموذج الصوتي الخاص بـ "مساعد Google"</translation> <translation id="2621713457727696555">مؤمّنة</translation> @@ -5270,7 +5271,6 @@ <translation id="7051943809462976355">جارٍ البحث عن الماوس...</translation> <translation id="7052237160939977163">إرسال بيانات تتبع مستوى الأداء</translation> <translation id="7053983685419859001">حظر</translation> -<translation id="705508001219706572">للرجوع إلى هذا الموقع الإلكتروني بشكل أسرع، يُرجى تثبيت تطبيق <ph name="APP_NAME" />.</translation> <translation id="7055152154916055070">تم حظر إعادة توجيه:</translation> <translation id="7055451306017383754">تعذّر إلغاء المشاركة بسبب استخدام تطبيق لهذا المجلد. سيتم إلغاء مشاركة المجلد عند إيقاف تشغيل نظام Parallels Desktop.</translation> <translation id="7056526158851679338">&فحص الأجهزة</translation> @@ -7176,6 +7176,7 @@ <translation id="9209563766569767417">جارٍ التحقُّق من إعداد حاوية نظام التشغيل Linux</translation> <translation id="9209689095351280025">لا يمكن للمواقع الإلكترونية استخدام ملفات تعريف الارتباط لتتبّع نشاط تصفحّك على الإنترنت.</translation> <translation id="9211177926627870898">التحديث مطلوب</translation> +<translation id="9211490828691860325">جميع أجهزة سطح المكتب</translation> <translation id="9214520840402538427">عفوًا! لقد انتهت مهلة بدء تشغيل سمات وقت التثبيت. يُرجى الاتصال بممثل الدعم.</translation> <translation id="9214695392875603905">كب كيك</translation> <translation id="9215293857209265904">تمت إضافة "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index f5cfa689e..9a789f05 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">ছিম কাৰ্ড লক কৰা হৈছে</translation> <translation id="2618797463720777311">নিকটৱৰ্তী শ্বেয়াৰ কৰাৰ সুবিধাটো ছেট আপ কৰক</translation> <translation id="2619761439309613843">দৈনিক নতুন ৱালপেপাৰ</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" />ক সুৰক্ষিতভাৱে ডাউনল’ড কৰিব নোৱাৰি।</translation> <translation id="2620436844016719705">ছিষ্টেম</translation> <translation id="262154978979441594">Google Assistant ভইচ মডেলক প্ৰশিক্ষণ দিয়ক</translation> <translation id="2621713457727696555">সুৰক্ষিত</translation> @@ -5254,7 +5255,6 @@ <translation id="7051943809462976355">মাউছৰ সন্ধান কৰি থকা হৈছে…</translation> <translation id="7052237160939977163">কাৰ্যদক্ষতাৰ ট্রে'চ ডেটা পঠিয়াওক</translation> <translation id="7053983685419859001">অৱৰোধ কৰক</translation> -<translation id="705508001219706572">ইয়ালৈ দ্ৰুতভাৱে উভতি আহিবলৈ <ph name="APP_NAME" /> ইনষ্টল কৰক</translation> <translation id="7055152154916055070">পুনৰ নির্দেশ কৰাটো অৱৰোধ কৰা হৈছে</translation> <translation id="7055451306017383754">এটা এপ্লিকেশ্বনে এই ফ’ল্ডাৰটো ব্যৱহাৰ কৰি থকা কাৰণে শ্বেয়াৰ কৰাটো বাতিল কৰিব পৰা নগ’ল। পাছৰবাৰ Parallels Desktop বন্ধ হ’লে ফ’ল্ডাৰটো শ্বেয়াৰ কৰাটো বাতিল কৰা হ’ব।</translation> <translation id="7056526158851679338">ডিভাইচ &নিৰীক্ষণ কৰক</translation> @@ -7152,6 +7152,7 @@ <translation id="9209563766569767417">Linux কণ্টেইনাৰৰ ছেটআপ পৰীক্ষা কৰি থকা হৈছে</translation> <translation id="9209689095351280025">ছাইটসমূহে আপোনাক সমগ্ৰ ৱেবত ট্ৰেক কৰা কুকিসমূহ ব্যৱহাৰ কৰিব নোৱাৰে</translation> <translation id="9211177926627870898">আপডে'টৰ প্ৰয়োজন</translation> +<translation id="9211490828691860325">আটাইবোৰ ডেস্ক</translation> <translation id="9214520840402538427">আমি দুঃখিত! ইনষ্টল কৰা সময়ৰ এট্রিবিউট আৰম্ভ কৰাৰ সময় সমাপ্ত হ’ল। আপোনাৰ সহায়ক প্ৰতিনিধিৰ সৈতে যোগাযোগ কৰক।</translation> <translation id="9214695392875603905">কাপকে’ক</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" যোগ কৰা হ’ল</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 5246039..ad5f72d 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1446,6 +1446,7 @@ <translation id="2617342710774726426">SIM kart kilidlənib</translation> <translation id="2618797463720777311">Yaxınlıqda Paylaşımı ayarlayın</translation> <translation id="2619761439309613843">Gündəlik Yenilənmə</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> faylını təhlükəsiz şəkildə endirmək mümkün deyil.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Google Assistentə səs modelini tanımağı öyrədin</translation> <translation id="2621713457727696555">Güvənli</translation> @@ -5256,7 +5257,6 @@ <translation id="7051943809462976355">Maus axtarılır...</translation> <translation id="7052237160939977163">Performans izləmə datasını göndərin</translation> <translation id="7053983685419859001">Bloklayın</translation> -<translation id="705508001219706572">Buraya yenidən daxil olmağı tezləşdirmək üçün <ph name="APP_NAME" /> quraşdırın</translation> <translation id="7055152154916055070">Yönləndirmə blok edildi:</translation> <translation id="7055451306017383754">Tətbiq bu qovluqdan istifadə etdiyi üçün paylaşımı silmək mümkün olmadı. Parallels Desktop növbəti dəfə bağlandıqda qovluğun paylaşımı silinəcək.</translation> <translation id="7056526158851679338">&Cihazları yoxlayın</translation> @@ -7154,6 +7154,7 @@ <translation id="9209563766569767417">Linux konteynerinin quraşdırılması yoxlanılır</translation> <translation id="9209689095351280025">Saytlar vebdə sizi izləyən kukilərdən istifadə edə bilmir</translation> <translation id="9211177926627870898">Güncəlləmə tələb olunur</translation> +<translation id="9211490828691860325">Bütün masalar</translation> <translation id="9214520840402538427">Heheey! Quraşdırma vaxtı atributlarının işəsalınma vaxtı keçdi. Dəstək təmsilçinizlə əlaqə saxlayın.</translation> <translation id="9214695392875603905">Kapkeyk</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" əlavə edildi</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index b6741e8..b0d7f5b 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -804,6 +804,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> гатовы завяршыць усталяванне</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">Праверка пароляў у браўзеры Chromium недаступная</translation> +<translation id="1869433484041798909">Кнопка закладкі</translation> <translation id="187145082678092583">Менш праграм</translation> <translation id="1871534214638631766">Паказваць інфармацыю пра змесціва пры доўгім націсканні на яго або націсканні правай кнопкай мышы</translation> <translation id="1871615898038944731">Абнаўленне прылады <ph name="DEVICE_TYPE" /> не патрабуецца</translation> @@ -835,6 +836,7 @@ <translation id="1900305421498694955">Праграмы з Google Play могуць патрабаваць поўнага доступу да файлавай сістэмы – каб чытаць і запісваць файлы на знешніх прыладах сховішча. Створаныя на прыладзе файлы і папкі бачныя ўсім, хто выкарыстоўвае знешні дыск. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Выбраць &усё</translation> <translation id="1901396183631570154">Браўзеру Chrome не ўдалося захаваць гэтыя паролі ва Уліковым запісе Google. Можна захаваць іх на гэтай прыладзе.</translation> +<translation id="1903995858055162096">Не ваша прылада? Выкарыстайце <ph name="BEGIN_LINK" />Гасцявы рэжым<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Назва прылады Chromebook</translation> <translation id="1906181697255754968">Сайты звычайна атрымліваюць доступ да файлаў і папак на прыладзе для работы такіх функцый, як аўтаматычнае захаванне зробленага</translation> <translation id="1906828677882361942">Не дазваляць сайтам доступ да паслядоўных партоў</translation> @@ -1452,6 +1454,7 @@ <translation id="2617342710774726426">SIM-карта заблакіравана</translation> <translation id="2618797463720777311">Наладжванне функцыі "Абагульванне паблізу"</translation> <translation id="2619761439309613843">Штодзённае абнаўленне</translation> +<translation id="2620215283731032047">Бяспечна спампаваць файл "<ph name="FILE_NAME" />" нельга.</translation> <translation id="2620436844016719705">Сістэма</translation> <translation id="262154978979441594">Навучыце Памочніка Google распазнаваць узор голасу</translation> <translation id="2621713457727696555">Абаронена</translation> @@ -5266,7 +5269,6 @@ <translation id="7051943809462976355">Ідзе пошук мышы...</translation> <translation id="7052237160939977163">Адпраўляць даныя трасіроўкі прадукцыйнасці</translation> <translation id="7053983685419859001">Заблакіраваць</translation> -<translation id="705508001219706572">Каб хутка вяртацца сюды, усталюйце праграму "<ph name="APP_NAME" />"</translation> <translation id="7055152154916055070">Перанакіраванне заблакіравана:</translation> <translation id="7055451306017383754">Не ўдалося скасаваць абагульванне, бо гэту папку выкарыстоўвае праграма. Абагульванне папкі будзе скасавана пасля наступнага завяршэння працы Parallels Desktop.</translation> <translation id="7056526158851679338">&Праверыць прылады</translation> @@ -5439,6 +5441,7 @@ <translation id="7251346854160851420">Стандартныя шпалеры</translation> <translation id="7253521419891527137">&Даведацца больш</translation> <translation id="7254951428499890870">Сапраўды запусціць у рэжыме дыягностыкі праграму "<ph name="APP_NAME" />"?</translation> +<translation id="725497546968438223">Кнопка папкі з закладкамі</translation> <translation id="7255002516883565667">Зараз у вас ёсць адна картка, якая можа выкарыстоўвацца толькі на гэтай прыладзе</translation> <translation id="7255935316994522020">Ужыць</translation> <translation id="7256069762010468647">Сайт выкарыстоўвае камеру</translation> @@ -5700,6 +5703,7 @@ <translation id="7564847347806291057">Завяршыць працэс</translation> <translation id="7566118625369982896">Кіраванне спасылкамі праграмы Play</translation> <translation id="756809126120519699">Даныя Chrome выдалены</translation> +<translation id="756876171895853918">Наладзіць аватар</translation> <translation id="7568790562536448087">Ідзе абнаўленне</translation> <translation id="7569983096843329377">Чорны</translation> <translation id="7571643774869182231">Недастаткова памяці для абнаўлення</translation> @@ -7168,6 +7172,7 @@ <translation id="9209563766569767417">Ідзе праверка налад кантэйнера Linux</translation> <translation id="9209689095351280025">Сайты не могуць выкарыстоўваць файлы cookie для адсочвання вас у інтэрнэце</translation> <translation id="9211177926627870898">Патрабуецца абнаўленне</translation> +<translation id="9211490828691860325">Усе працоўныя сталы</translation> <translation id="9214520840402538427">Памылка! Была пратэрмінавана ініцыялізацыя атрыбутаў installation-time ("усталяванне-час"). Звярніцеся ў службу падтрымкі.</translation> <translation id="9214695392875603905">Кекс</translation> <translation id="9215293857209265904">Дададзена пашырэнне "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 8f96609..acaadb8 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">SIM картата е заключена</translation> <translation id="2618797463720777311">Настройване на функцията „Споделяне наблизо“</translation> <translation id="2619761439309613843">Ежедневно опресняване</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> не може да се изтегли по сигурен начин.</translation> <translation id="2620436844016719705">Система</translation> <translation id="262154978979441594">Обучаване на гласовия модел на Google Асистент</translation> <translation id="2621713457727696555">защитена</translation> @@ -5264,7 +5265,6 @@ <translation id="7051943809462976355">Търси се мишка...</translation> <translation id="7052237160939977163">Да се изпратят данните от проследяването на ефективността</translation> <translation id="7053983685419859001">Блокиране</translation> -<translation id="705508001219706572">За да можете да се връщате тук бързо, инсталирайте <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Блокирано бе пренасочване:</translation> <translation id="7055451306017383754">Прекратяването на споделянето не бе успешно, защото тази папка се използва от приложение. Споделянето ѝ ще бъде прекратено при следващото изключване на Parallels Desktop.</translation> <translation id="7056526158851679338">&Инспектиране на устройствата</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">Настройките на контейнера за Linux се проверяват</translation> <translation id="9209689095351280025">Сайтовете не могат да използват „бисквитки“, които ви следят в мрежата</translation> <translation id="9211177926627870898">Изисква се актуализация</translation> +<translation id="9211490828691860325">Всички работни кътове</translation> <translation id="9214520840402538427">Ами сега! Времето за изчакване на инициализирането на атрибутите за времето за инсталиране изтече. Моля, свържете се с представител на екипа си за поддръжка.</translation> <translation id="9214695392875603905">Кексче</translation> <translation id="9215293857209265904"><ph name="EXTENSION_NAME" /> се добави</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index a1feda6..68df1965 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -802,6 +802,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> আপনার ইনস্টেলশন সম্পূর্ণ করার জন্য প্রস্তুত</translation> <translation id="1868193363684582383">"হ্যালো Google"</translation> <translation id="1868553836791672080">Chromium-এ পাসওয়ার্ড পরীক্ষা করার ফিচারটি উপলভ্য নয়</translation> +<translation id="1869433484041798909">'বুকমার্ক' বোতাম</translation> <translation id="187145082678092583">কয়েকটি অ্যাপ</translation> <translation id="1871534214638631766">কন্টেন্টের উপর মাউস রেখে ডানদিকে ক্লিক করলে বা দীর্ঘক্ষণ প্রেস করে ধরে রাখলে এর সংশ্লিষ্ট তথ্য দেখানো হয়</translation> <translation id="1871615898038944731">আপনার <ph name="DEVICE_TYPE" /> আপ-টু-ডেট আছে</translation> @@ -833,6 +834,7 @@ <translation id="1900305421498694955">এক্সটার্নাল স্টোরেজ ডিভাইসে ফাইল পড়তে এবং সেভ করতে Google Play থেকে ডাউনলোড করা অ্যাপের সম্পূর্ণ ফাইল সিস্টেমে অ্যাক্সেসের প্রয়োজন হতে পারে। ডিভাইসে তৈরি করা ফাইল এবং ফোল্ডার এক্সটার্নাল ড্রাইভ ব্যবহারকারীরা দেখতে পারবেন। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&সকল বেছে নিন</translation> <translation id="1901396183631570154">আপনার Google অ্যাকাউন্টে Chrome এই পাসওয়ার্ডগুলি সেভ করতে পারেনি। যদিও আপনি এখনও এগুলিকে এই ডিভাইসে সেভ করে রাখতে পারেন।</translation> +<translation id="1903995858055162096">এটি আপনার ডিভাইস নয়? <ph name="BEGIN_LINK" />গেস্ট মোড<ph name="END_LINK" /> ব্যবহার করুন।</translation> <translation id="1905375423839394163">Chromebook ডিভাইসের নাম</translation> <translation id="1906181697255754968">আপনার কাজ অটোমেটিক সেভ করার মতো ফিচারের জন্য সাইট সাধারণত আপনার ডিভাইসের ফাইল ও ফোল্ডারগুলি অ্যাক্সেস করে</translation> <translation id="1906828677882361942">কোনও সাইটকে সিরিয়াল পোর্ট অ্যাক্সেস করার অনুমতি দেবেন না</translation> @@ -1449,6 +1451,7 @@ <translation id="2617342710774726426">সিম কার্ড লক করা আছে</translation> <translation id="2618797463720777311">'নিয়ারবাই শেয়ার' ফিচার সেট আপ করুন</translation> <translation id="2619761439309613843">প্রতিদিন রিফ্রেশ করা হবে</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ফাইলটি নিরাপদে ডাউনলোড করা যাচ্ছে না।</translation> <translation id="2620436844016719705">সিস্টেম</translation> <translation id="262154978979441594">Google Assistant-এর ভয়েস মডেলকে প্রশিক্ষণ দিন</translation> <translation id="2621713457727696555">সুরক্ষিত</translation> @@ -5264,7 +5267,6 @@ <translation id="7051943809462976355">মাউসের জন্য সার্চ করা হচ্ছে...</translation> <translation id="7052237160939977163">কার্য-সম্পাদনা ট্রেস ডেটা পাঠান</translation> <translation id="7053983685419859001">ব্লক করুন</translation> -<translation id="705508001219706572">এখানে তাড়াতাড়ি ফিরে আসতে <ph name="APP_NAME" /> ইনস্টল করুন</translation> <translation id="7055152154916055070">রিডাইরেক্ট ব্লক করা হয়েছে:</translation> <translation id="7055451306017383754">ফোল্ডারটির শেয়ারিং বন্ধ করা যাচ্ছে না, কারণ এখন একটি অ্যাপ্লিকেশন এটি ব্যবহার করছে। পরবর্তী সময়ে Parallels Desktop বন্ধ করা হলে, তবেই ফোল্ডারটির শেয়ারিং বন্ধ করা যাবে।</translation> <translation id="7056526158851679338">এবং ডিভাইসগুলি পরিদর্শন</translation> @@ -5437,6 +5439,7 @@ <translation id="7251346854160851420">ডিফল্ট ওয়ালপেপার</translation> <translation id="7253521419891527137">এবং আরও জানুন</translation> <translation id="7254951428499890870">আপনি কি ডায়গনিস্টিক মোডে "<ph name="APP_NAME" />" লঞ্চ করার বিষয়ে নিশ্চিত?</translation> +<translation id="725497546968438223">'বুকমার্ক ফোল্ডার' বোতাম</translation> <translation id="7255002516883565667">এই মুহূর্তে, আপনার কাছে একটি কার্ড রয়েছে যা শুধুমাত্র এই ডিভাইসে ব্যবহার করা যেতে পারে</translation> <translation id="7255935316994522020">প্রয়োগ করুন</translation> <translation id="7256069762010468647">সাইটটি আপনার ক্যামেরা ব্যবহার করছে</translation> @@ -5698,6 +5701,7 @@ <translation id="7564847347806291057">সমাপ্তি প্রক্রিয়া</translation> <translation id="7566118625369982896">Play অ্যাপের লিঙ্ক পরিচালনা করুন</translation> <translation id="756809126120519699">Chrome ডেটা সাফ হয়েছে</translation> +<translation id="756876171895853918">অবতার কাস্টমাইজ করুন</translation> <translation id="7568790562536448087">আপডেট হচ্ছে</translation> <translation id="7569983096843329377">কালো</translation> <translation id="7571643774869182231">আপডেটের জন্য যথেষ্ট জায়গা নেই</translation> @@ -7163,6 +7167,7 @@ <translation id="9209563766569767417">Linux কন্টেনারের সেট-আপ চেক করে দেখা হচ্ছে</translation> <translation id="9209689095351280025">যেসব কুকি ওয়েব জুড়ে আপনার অ্যাক্টিভিটি ট্র্যাক করে, সাইট সেগুলি ব্যবহার করতে পারবে না</translation> <translation id="9211177926627870898">আপডেট করা প্রয়োজন</translation> +<translation id="9211490828691860325">সব ডেক্স</translation> <translation id="9214520840402538427">ওহো! প্রারম্ভিক ইনস্টলেশন-সময়ের বৈশিষ্ট্যাবলীর সময় ফুরিয়েছে৷ দয়া করে আপনার সহায়ক প্রতিনিধির সঙ্গে যোগাযোগ করুন৷</translation> <translation id="9214695392875603905">কাপ কেক</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" জোড়া হয়েছে</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 8929373..fd431b6 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1453,6 +1453,7 @@ <translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2618797463720777311">Postavite Dijeljenje u blizini</translation> <translation id="2619761439309613843">Dnevno osvježavanje</translation> +<translation id="2620215283731032047">Nije moguće sigurno preuzeti fajl <ph name="FILE_NAME" />.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Naučite Google Asistenta model glasa</translation> <translation id="2621713457727696555">Osigurano</translation> @@ -5267,7 +5268,6 @@ <translation id="7051943809462976355">Traženje miša...</translation> <translation id="7052237160939977163">Pošalji podatke o praćenju performansi</translation> <translation id="7053983685419859001">Blokiraj</translation> -<translation id="705508001219706572">Da se brzo vratite ovdje, instalirajte aplikaciju <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Preusmjeravanje je blokirano:</translation> <translation id="7055451306017383754">Poništavanje dijeljenja nije uspjelo jer neka aplikacija koristi ovaj folder. Dijeljenje foldera će se poništiti nakon sljedećeg isključivanja Parallels Desktopa.</translation> <translation id="7056526158851679338">&Pregledaj uređaje</translation> @@ -7171,6 +7171,7 @@ <translation id="9209563766569767417">Provjeravanje postavljanja Linux spremnika</translation> <translation id="9209689095351280025">Web lokacije ne mogu koristiti kolačiće koji vas prate na webu</translation> <translation id="9211177926627870898">Potrebno je ažuriranje</translation> +<translation id="9211490828691860325">Sve radne površine</translation> <translation id="9214520840402538427">Ups! Pokretanje atributa za vrijeme instalacije je isteklo. Obratite se predstavniku za podršku.</translation> <translation id="9214695392875603905">Kolačić</translation> <translation id="9215293857209265904">Dodana je ekstenzija "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 12e27a86..0cdaf0d 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -801,6 +801,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> està llest per completar la instal·lació</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">La comprovació de contrasenyes no està disponible a Chromium</translation> +<translation id="1869433484041798909">Botó d'adreça d'interès</translation> <translation id="187145082678092583">Menys aplicacions</translation> <translation id="1871534214638631766">Mostra informació relacionada amb el contingut en mantenir-lo premut o fer-hi clic amb el botó dret</translation> <translation id="1871615898038944731">El dispositiu <ph name="DEVICE_TYPE" /> està actualitzat</translation> @@ -832,6 +833,7 @@ <translation id="1900305421498694955">Pot ser que les aplicacions de Google Play requereixin accés complet al sistema de fitxers per llegir i escriure fitxers en dispositius d'emmagatzematge externs. Qualsevol persona que faci servir la unitat externa podrà veure les carpetes i els fitxers creats al dispositiu. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Selecciona-ho &tot</translation> <translation id="1901396183631570154">Chrome no ha pogut desar aquestes contrasenyes al teu Compte de Google. Pots continuar desant-les en aquest dispositiu.</translation> +<translation id="1903995858055162096">No és el teu dispositiu? Fes servir el <ph name="BEGIN_LINK" />mode de convidat<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Nom del dispositiu Chromebook</translation> <translation id="1906181697255754968">Els llocs web solen accedir als fitxers i a les carpetes del dispositiu per a funcions com ara desar automàticament la teva feina</translation> <translation id="1906828677882361942">No permetis que cap lloc web accedeixi als ports en sèrie</translation> @@ -1448,6 +1450,7 @@ <translation id="2617342710774726426">La targeta SIM està bloquejada</translation> <translation id="2618797463720777311">Configura la funció Compartició Nearby</translation> <translation id="2619761439309613843">Actualització diària</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> no es pot baixar de manera segura.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Entrena el model de veu de l'Assistent de Google</translation> <translation id="2621713457727696555">Segura</translation> @@ -5263,7 +5266,6 @@ <translation id="7051943809462976355">S'està cercant el ratolí...</translation> <translation id="7052237160939977163">Envia dades de traça del rendiment</translation> <translation id="7053983685419859001">Bloqueja</translation> -<translation id="705508001219706572">Per tornar aquí ràpidament, instal·la <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">S'ha bloquejat la redirecció:</translation> <translation id="7055451306017383754">No s'ha pogut deixar de compartir aquesta carpeta perquè una aplicació l'està utilitzant. Es deixarà de compartir la propera vegada que Parallels Desktop s'apagui.</translation> <translation id="7056526158851679338">&Inspecciona els dispositius</translation> @@ -5436,6 +5438,7 @@ <translation id="7251346854160851420">Fons de pantalla predeterminat</translation> <translation id="7253521419891527137">&Més informació</translation> <translation id="7254951428499890870">Confirmes que vols iniciar "<ph name="APP_NAME" />" en mode de diagnòstic?</translation> +<translation id="725497546968438223">Botó de carpetes d'adreces d'interès</translation> <translation id="7255002516883565667">En aquest moment tens una targeta que només es pot utilitzar en aquest dispositiu</translation> <translation id="7255935316994522020">Aplica</translation> <translation id="7256069762010468647">El lloc web està utilitzant la càmera</translation> @@ -5697,6 +5700,7 @@ <translation id="7564847347806291057">Finalitza el procés</translation> <translation id="7566118625369982896">Gestiona els enllaços d'aplicacions de Play</translation> <translation id="756809126120519699">S'han esborrat les dades de Chrome</translation> +<translation id="756876171895853918">Personalitza l'avatar</translation> <translation id="7568790562536448087">Actualització</translation> <translation id="7569983096843329377">Negre</translation> <translation id="7571643774869182231">No hi ha prou espai d'emmagatzematge per fer l'actualització</translation> @@ -7163,6 +7167,7 @@ <translation id="9209563766569767417">S'està comprovant la configuració del contenidor de Linux</translation> <translation id="9209689095351280025">Els llocs web no poden utilitzar galetes que facin un seguiment de la teva activitat al web</translation> <translation id="9211177926627870898">Es necessita una actualització</translation> +<translation id="9211490828691860325">Tots els escriptoris</translation> <translation id="9214520840402538427">La inicialització dels atributs en temps d'instal·lació ha esgotat el temps d'espera. Contacteu amb el representant d'assistència.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">S'ha afegit "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index fdc19b959..6be3225 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -803,6 +803,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> je připraven dokončit instalaci.</translation> <translation id="1868193363684582383">„Ok Google“</translation> <translation id="1868553836791672080">V prohlížeči Chromium není kontrola hesel k dispozici</translation> +<translation id="1869433484041798909">Tlačítko záložky</translation> <translation id="187145082678092583">Méně aplikací</translation> <translation id="1871534214638631766">Zobrazovat související informace, když na obsah kliknete pravým tlačítkem nebo ho dlouze stisknete</translation> <translation id="1871615898038944731">Vaše zařízení <ph name="DEVICE_TYPE" /> je aktuální</translation> @@ -834,6 +835,7 @@ <translation id="1900305421498694955">Aplikace z Google Play mohou vyžadovat úplný přístup k systému souborů, aby mohly číst a zapisovat soubory na externích úložných zařízeních. Soubory a složky vytvořené na zařízení jsou viditelné pro každého, kdo daný externí disk používá. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Vybrat vše</translation> <translation id="1901396183631570154">Chrome tato hesla nemohl uložit do vašeho účtu Google. Můžete si je však uložit na tomto zařízení.</translation> +<translation id="1903995858055162096">Není to vaše zařízení? Použijte <ph name="BEGIN_LINK" />režim hosta<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Název Chromebooku</translation> <translation id="1906181697255754968">Weby obvykle využívají přístup k souborům a složkám v zařízení k funkcím, jako je automatické ukládání práce</translation> <translation id="1906828677882361942">Nepovolovat žádným webům přístup k sériovým portům</translation> @@ -1450,6 +1452,7 @@ <translation id="2617342710774726426">SIM karta je uzamčena</translation> <translation id="2618797463720777311">Nastavení sdílení nablízko</translation> <translation id="2619761439309613843">Denní obnovení</translation> +<translation id="2620215283731032047">Soubor <ph name="FILE_NAME" /> nelze bezpečně stáhnout.</translation> <translation id="2620436844016719705">Systém</translation> <translation id="262154978979441594">Nastavit hlasový model Asistenta Google</translation> <translation id="2621713457727696555">Zabezpečeno</translation> @@ -5263,7 +5266,6 @@ <translation id="7051943809462976355">Vyhledávání myši...</translation> <translation id="7052237160939977163">Odesílat údaje sledování výkonu</translation> <translation id="7053983685419859001">Blokovat</translation> -<translation id="705508001219706572">Chcete-li se sem rychle vrátit, nainstalujte si aplikaci <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Bylo zablokováno přesměrování:</translation> <translation id="7055451306017383754">Sdílení se nepodařilo zrušit, protože tuto složku používá nějaká aplikace. Sdílení složky bude zrušeno při příštím vypnutí systému Parallels Desktop.</translation> <translation id="7056526158851679338">&Zkontrolovat zařízení</translation> @@ -5436,6 +5438,7 @@ <translation id="7251346854160851420">Výchozí tapeta</translation> <translation id="7253521419891527137">&Další informace</translation> <translation id="7254951428499890870">Opravdu chcete aplikaci <ph name="APP_NAME" /> spustit v diagnostickém režimu?</translation> +<translation id="725497546968438223">Tlačítko složky záložek</translation> <translation id="7255002516883565667">V současné době máte jednu kartu, kterou lze používat jen na tomto zařízení.</translation> <translation id="7255935316994522020">Použít</translation> <translation id="7256069762010468647">Web používá kameru</translation> @@ -5697,6 +5700,7 @@ <translation id="7564847347806291057">Ukončit proces</translation> <translation id="7566118625369982896">Spravovat odkazy na aplikace ve službě Play</translation> <translation id="756809126120519699">Vymazání údajů Chromu</translation> +<translation id="756876171895853918">Upravit avatar</translation> <translation id="7568790562536448087">Aktualizace</translation> <translation id="7569983096843329377">Černá</translation> <translation id="7571643774869182231">Na aktualizaci nemáte dostatek místa</translation> @@ -7164,6 +7168,7 @@ <translation id="9209563766569767417">Kontrola nastavení kontejneru systému Linux</translation> <translation id="9209689095351280025">Weby vás nemohou na internetu sledovat pomocí souborů cookie</translation> <translation id="9211177926627870898">Je nutná aktualizace</translation> +<translation id="9211490828691860325">Všechny plochy</translation> <translation id="9214520840402538427">Jejda! Vypršel časový limit inicializace atributů doby instalace. Kontaktujte zástupce podpory.</translation> <translation id="9214695392875603905">Sladký košíček</translation> <translation id="9215293857209265904">Bylo přidáno rozšíření <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index e2d6325..e72744d9 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">SIM-kortet er låst</translation> <translation id="2618797463720777311">Konfigurer "Deling tæt på"</translation> <translation id="2619761439309613843">Nyt hver dag</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> kan ikke downloades sikkert.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Anvend en stemmemodel i Google Assistent</translation> <translation id="2621713457727696555">Beskyttet</translation> @@ -5267,7 +5268,6 @@ <translation id="7051943809462976355">Søger efter mus...</translation> <translation id="7052237160939977163">Send data om ydeevne</translation> <translation id="7053983685419859001">Bloker</translation> -<translation id="705508001219706572">Installer <ph name="APP_NAME" /> for hurtigt at vende tilbage hertil</translation> <translation id="7055152154916055070">Omdirigeringen blev blokeret:</translation> <translation id="7055451306017383754">Delingen kunne ikke ophæves, fordi mappen stadig anvendes af en app. Delingen af mappen ophæves, næste gang Parallels Desktop lukkes.</translation> <translation id="7056526158851679338">&Inspicer enheder</translation> @@ -7170,6 +7170,7 @@ <translation id="9209563766569767417">Tjekker konfigurationen af Linux-containeren</translation> <translation id="9209689095351280025">Websites kan ikke bruge cookies, der sporer din aktivitet på nettet</translation> <translation id="9211177926627870898">Opdatering er påkrævet</translation> +<translation id="9211490828691860325">Alle skriveborde</translation> <translation id="9214520840402538427">Ups! Initialiseringen af installationstidens attributter har fået timeout. Kontakt en supportmedarbejder.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" er tilføjet</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 441362f..a420fea6 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1445,6 +1445,7 @@ <translation id="2617342710774726426">SIM-Karte ist gesperrt</translation> <translation id="2618797463720777311">Nearby Share einrichten</translation> <translation id="2619761439309613843">Tägliche Aktualisierung</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> kann nicht sicher heruntergeladen werden.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Sprachmodell von Google Assistant trainieren</translation> <translation id="2621713457727696555">Gesichert</translation> @@ -5259,7 +5260,6 @@ <translation id="7051943809462976355">Suche nach Maus läuft...</translation> <translation id="7052237160939977163">Daten der Leistungsnachverfolgung senden</translation> <translation id="7053983685419859001">Blockieren</translation> -<translation id="705508001219706572">Installieren Sie <ph name="APP_NAME" />, um schnell hierher zurückzukehren</translation> <translation id="7055152154916055070">Weiterleitung blockiert:</translation> <translation id="7055451306017383754">Die Aufhebung der Freigabe ist nicht möglich, weil eine Anwendung diesen Ordner verwendet. Die Freigabe des Ordners wird beim nächsten Herunterfahren von Parallels Desktop aufgehoben.</translation> <translation id="7056526158851679338">&Geräte untersuchen</translation> @@ -7158,6 +7158,7 @@ <translation id="9209563766569767417">Einrichtung des Linux-Containers wird geprüft</translation> <translation id="9209689095351280025">Websites können keine Cookies nutzen, die Sie durch das Web verfolgen</translation> <translation id="9211177926627870898">Aktualisierung erforderlich</translation> +<translation id="9211490828691860325">Alle Desktops</translation> <translation id="9214520840402538427">Hoppla! Bei der Initialisierung der Installationszeit-Attribute ist eine Zeitüberschreitung aufgetreten. Bitte wenden Sie sich an Ihren Support-Mitarbeiter.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" hinzugefügt</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 2525cfaa..ee088d6 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">Η κάρτα SIM είναι κλειδωμένη</translation> <translation id="2618797463720777311">Ρύθμιση λειτουργίας Κοινοποίηση κοντά</translation> <translation id="2619761439309613843">Ημερήσια ανανέωση</translation> +<translation id="2620215283731032047">Δεν είναι δυνατή η λήψη του αρχείου <ph name="FILE_NAME" /> με ασφάλεια.</translation> <translation id="2620436844016719705">Σύστημα</translation> <translation id="262154978979441594">Εκπαίδευση φωνητικού μοντέλου Βοηθού Google</translation> <translation id="2621713457727696555">Unsecured</translation> @@ -5266,7 +5267,6 @@ <translation id="7051943809462976355">Αναζήτηση για το ποντίκι…</translation> <translation id="7052237160939977163">Αποστολή δεδομένων εντοπισμού απόδοσης</translation> <translation id="7053983685419859001">Αποκλεισμός</translation> -<translation id="705508001219706572">Για να επιστρέψετε εδώ γρήγορα, εγκαταστήστε την εφαρμογή <ph name="APP_NAME" />.</translation> <translation id="7055152154916055070">Αποκλεισμένη ανακατεύθυνση:</translation> <translation id="7055451306017383754">Η κατάργηση κοινοποίησης δεν ήταν δυνατή, επειδή μια εφαρμογή χρησιμοποιεί αυτόν τον φάκελο. Η κοινοποίηση του φακέλου θα καταργηθεί κατά τον επόμενο τερματισμό λειτουργίας του Parallels Desktop.</translation> <translation id="7056526158851679338">&Επιθεώρηση συσκευών</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">Έλεγχος της ρύθμισης του κοντέινερ Linux</translation> <translation id="9209689095351280025">Οι ιστότοποι δεν μπορούν να χρησιμοποιήσουν cookie που σας παρακολουθούν στον ιστό.</translation> <translation id="9211177926627870898">Απαιτείται ενημέρωση</translation> +<translation id="9211490828691860325">Όλα τα γραφεία</translation> <translation id="9214520840402538427">Ωχ! Η περίοδος προετοιμασίας των ιδιοτήτων χρόνου εγκατάστασης έχει λήξει. Επικοινωνήστε με τον αντιπρόσωπό σας υποστήριξης.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">Προστέθηκε η επέκταση "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index b9430e32..9009102b 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -50,7 +50,7 @@ <translation id="1049743911850919806">Incognito</translation> <translation id="1049795001945932310">&Language settings</translation> <translation id="1054048317165655285">Complete setup on your phone</translation> -<translation id="1054153489933238809">Open Original Image in New Tab</translation> +<translation id="1054153489933238809">Open original image in new tab</translation> <translation id="1055274863771110134">{NUM_WEEKS,plural, =1{Update <ph name="DEVICE_TYPE" /> within 1 week}other{Update <ph name="DEVICE_TYPE" /> within {NUM_WEEKS} weeks}}</translation> <translation id="1055806300943943258">Searching for Bluetooth and USB devices...</translation> <translation id="1056466516655540509">Updated <ph name="MINUTES" /> min ago</translation> @@ -477,7 +477,7 @@ <translation id="1520689915144573455">{COUNT,plural, =1{1 app}other{# apps}}</translation> <translation id="1521442365706402292">Manage certificates</translation> <translation id="1521774566618522728">Active today</translation> -<translation id="152234381334907219">Never Saved</translation> +<translation id="152234381334907219">Never saved</translation> <translation id="1523978563989812243">Text-to-speech engines</translation> <translation id="1524430321211440688">Keyboard</translation> <translation id="1524563461097350801">No, thanks</translation> @@ -718,7 +718,7 @@ <translation id="1779468444204342338">Minimum</translation> <translation id="1779652936965200207">Please enter this passkey on "<ph name="DEVICE_NAME" />":</translation> <translation id="177989070088644880"><ph name="ANDROID_PACKAGE_NAME" />, app</translation> -<translation id="1780152987505130652">Close Group</translation> +<translation id="1780152987505130652">Close group</translation> <translation id="1781291988450150470">Current PIN</translation> <translation id="1781398670452016618"><ph name="DOMAIN" /> requires you to connect to Wi-Fi now and download an update.</translation> <translation id="1781502536226964113">Open the New Tab page</translation> @@ -943,7 +943,7 @@ You can manage this account’s settings by installing the Family Link app on your device. We sent you instructions in an email.</translation> <translation id="2040460856718599782">Oops! Something went wrong when trying to authenticate you. Please double-check your sign-in credentials and try again.</translation> <translation id="2040859730880153754">{COUNT,plural, =1{You have 1 compromised password}other{You have # compromised passwords}}</translation> -<translation id="204497730941176055">Microsoft Certificate Template Name</translation> +<translation id="204497730941176055">Microsoft certificate template name</translation> <translation id="2045117674524495717">Keyboard Shortcut Helper</translation> <translation id="2045969484888636535">Continue blocking cookies</translation> <translation id="204622017488417136">Your device will be returned to the previously installed version of Chrome. All user accounts and local data will be removed. This cannot be undone.</translation> @@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">SIM card is locked</translation> <translation id="2618797463720777311">Set up Nearby Share</translation> <translation id="2619761439309613843">Daily Refresh</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> can't be downloaded securely.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Train Google Assistant voice model</translation> <translation id="2621713457727696555">Secured</translation> @@ -2556,7 +2557,7 @@ <translation id="3854967233147778866">Offer to translate websites in other languages</translation> <translation id="3854976556788175030">Output tray is full</translation> <translation id="3855441664322950881">Pack extension</translation> -<translation id="3855676282923585394">Import Bookmarks and Settings...</translation> +<translation id="3855676282923585394">Import bookmarks and settings...</translation> <translation id="3856096718352044181">Please verify that this is a valid provider or try again later</translation> <translation id="3856800405688283469">Select Time Zone</translation> <translation id="3857807444929313943">Lift, then touch again</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Searching for mouse...</translation> <translation id="7052237160939977163">Send performance trace data</translation> <translation id="7053983685419859001">Block</translation> -<translation id="705508001219706572">To get back here quickly, install <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Redirect blocked:</translation> <translation id="7055451306017383754">Couldn't unshare because an application is using this folder. The folder will be unshared when Parallels Desktop is next shut down.</translation> <translation id="7056526158851679338">&Inspect Devices</translation> @@ -6871,7 +6871,7 @@ <translation id="8870413625673593573">Recently Closed</translation> <translation id="8871551568777368300">Pinned by administrator</translation> <translation id="8871696467337989339">You are using an unsupported command-line flag: <ph name="BAD_FLAG" />. Stability and security will suffer.</translation> -<translation id="8871974300055371298">Content Settings ...</translation> +<translation id="8871974300055371298">Content settings</translation> <translation id="8872155268274985541">Invalid Kiosk external update manifest file found. Failed to update Kiosk app. Please remove the USB stick.</translation> <translation id="8872777911145321141">Ask when a site wants to use your virtual reality devices and data (recommended)</translation> <translation id="8874184842967597500">Not connected</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Checking the Linux container setup</translation> <translation id="9209689095351280025">Sites can't use cookies that track you across the web</translation> <translation id="9211177926627870898">Update required</translation> +<translation id="9211490828691860325">All desks</translation> <translation id="9214520840402538427">Oops! The initialisation of the installation-time attributes has timed out. Please contact your support representative.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" added</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index d97b1a0..9f8beb5 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1446,6 +1446,7 @@ <translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation> <translation id="2618797463720777311">Configura Compartir con Nearby</translation> <translation id="2619761439309613843">Cambiar diario</translation> +<translation id="2620215283731032047">No se puede descargar el archivo <ph name="FILE_NAME" /> de forma segura.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Entrenar el modelo de voz del Asistente de Google</translation> <translation id="2621713457727696555">Segura</translation> @@ -5260,7 +5261,6 @@ <translation id="7051943809462976355">Buscando mouse…</translation> <translation id="7052237160939977163">Enviar datos de seguimiento de rendimiento</translation> <translation id="7053983685419859001">Bloquear</translation> -<translation id="705508001219706572">Para volver a acceder a este sitio rápidamente, instala <ph name="APP_NAME" />.</translation> <translation id="7055152154916055070">Se bloqueó el redireccionamiento:</translation> <translation id="7055451306017383754">No se puede dejar de compartir esta carpeta porque una app la está usando. Dejará de compartirse la próxima vez que se cierre Parallels Desktop.</translation> <translation id="7056526158851679338">&Inspeccionar dispositivos</translation> @@ -7160,6 +7160,7 @@ <translation id="9209563766569767417">Revisando la configuración del contenedor de Linux</translation> <translation id="9209689095351280025">Los sitios no pueden usar cookies para rastrearte en la Web</translation> <translation id="9211177926627870898">Actualización necesaria</translation> +<translation id="9211490828691860325">Todos los escritorios</translation> <translation id="9214520840402538427">¡Vaya! Se ha agotado el tiempo de la inicialización de los atributos de tiempo de instalación. Comunícate con el representante de asistencia.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" agregada</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 5b25a19a..ec539e09 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation> <translation id="2618797463720777311">Configurar Compartir con Nearby</translation> <translation id="2619761439309613843">Actualiz. diaria</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> no se puede descargar de forma segura.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Preparar modelo de voz del Asistente de Google</translation> <translation id="2621713457727696555">Segura</translation> @@ -5262,7 +5263,6 @@ <translation id="7051943809462976355">Buscando el ratón...</translation> <translation id="7052237160939977163">Enviar datos de seguimiento de rendimiento</translation> <translation id="7053983685419859001">Bloquear</translation> -<translation id="705508001219706572">Para volver aquí rápidamente, instala <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Redirección bloqueada:</translation> <translation id="7055451306017383754">No se ha podido dejar de compartir esta carpeta porque una aplicación está usándola. La carpeta dejará de compartirse la próxima vez que se apague Parallels Desktop.</translation> <translation id="7056526158851679338">&Inspeccionar dispositivos</translation> @@ -7162,6 +7162,7 @@ <translation id="9209563766569767417">Comprobando la configuración del contenedor de Linux</translation> <translation id="9209689095351280025">Los sitios web no pueden usar cookies para hacer un seguimiento de tu actividad en la Web.</translation> <translation id="9211177926627870898">Actualización necesaria</translation> +<translation id="9211490828691860325">Todos los escritorios</translation> <translation id="9214520840402538427">¡Vaya! Se ha agotado el tiempo de la inicialización de los atributos de tiempo de instalación. Ponte en contacto con el representante del servicio de asistencia.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" añadida</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 12d535a..1aff417 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">SIM-kaart on lukustatud</translation> <translation id="2618797463720777311">Funktsiooni Läheduses jagamine seadistamine</translation> <translation id="2619761439309613843">Igapäevane värskendamine</translation> +<translation id="2620215283731032047">Faili <ph name="FILE_NAME" /> ei saa turvaliselt alla laadida.</translation> <translation id="2620436844016719705">Süsteem</translation> <translation id="262154978979441594">Google'i assistendi häälemudeli treenimine</translation> <translation id="2621713457727696555">Kaitstud</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Hiire otsimine ...</translation> <translation id="7052237160939977163">Saada toimivuse jälgimise andmeid</translation> <translation id="7053983685419859001">Blokeeri</translation> -<translation id="705508001219706572">Kiirelt siia naasmiseks installige <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Ümbersuunamine blokeeriti:</translation> <translation id="7055451306017383754">Jagamist ei saanud lõpetada, kuna rakendus kasutab seda kausta. Kui Parallels Desktop välja lülitatakse, siis kausta jagamine lõpetatakse.</translation> <translation id="7056526158851679338">&Seadmete kontrollimine</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Linuxi konteineri seadistuse kontrollimine</translation> <translation id="9209689095351280025">Saidid ei saa veebis teie jälgimiseks kasutada küpsisefaile</translation> <translation id="9211177926627870898">Värskendamine on nõutav</translation> +<translation id="9211490828691860325">Kõik töölauad</translation> <translation id="9214520840402538427">Installimisaja atribuutide lähtestamisel ilmnes ajalõpp. Võtke ühendust tugiteenuse esindajaga.</translation> <translation id="9214695392875603905">Keeks</translation> <translation id="9215293857209265904">Lisati „<ph name="EXTENSION_NAME" />”</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 01c8fb2b..5367051 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -801,6 +801,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> prest dago instalazioa osatzeko</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">Pasahitzak egiaztatzeko eginbidea ez dago erabilgarri Chromium-en</translation> +<translation id="1869433484041798909">Laster-marka egiteko botoia</translation> <translation id="187145082678092583">Aplikazio gutxiago</translation> <translation id="1871534214638631766">Erakutsi erlazionatutako informazioa edukia eskuineko botoiarekin edo luze sakatzean</translation> <translation id="1871615898038944731">Eguneratuta dago <ph name="DEVICE_TYPE" /> gailua</translation> @@ -832,6 +833,7 @@ <translation id="1900305421498694955">Google Play-ko aplikazioek sistemako fitxategi guztiak atzitzeko baimena beharko dute agian kanpoko memoriako fitxategiak irakurri eta haietan idazteko. Kanpoko unitatea darabilen edonork ikusi ahalko ditu gailuan sortutako fitxategi eta karpetak. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Hautatu &guztiak</translation> <translation id="1901396183631570154">Chrome-k ezin izan ditu gorde pasahitz horiek zure Google-ko kontuan. Gailu honetan gorde ditzakezu, bestela.</translation> +<translation id="1903995858055162096">Ez al da zure gailua? Erabili <ph name="BEGIN_LINK" />gonbidatu modua<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Chromebook gailuaren izena</translation> <translation id="1906181697255754968">Webguneek gailuko fitxategi eta karpetak atzitu ohi dituzte lana automatikoki gordetzeko eta antzeko funtzioak gauzatzeko</translation> <translation id="1906828677882361942">Ez eman serie-atakak atzitzeko baimena webguneei</translation> @@ -1449,6 +1451,7 @@ <translation id="2617342710774726426">Blokeatuta dago SIM txartela</translation> <translation id="2618797463720777311">Konfiguratu Nearby Share</translation> <translation id="2619761439309613843">Freskatu egunero</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ezin da segurtasunez deskargatu.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Trebatu Google-ren Laguntzailea eginbidearen ahots-eredua</translation> <translation id="2621713457727696555">Babestuta</translation> @@ -2377,7 +2380,7 @@ <translation id="3677911431265050325">Eskatu mugikorretarako webgunea</translation> <translation id="3677959414150797585">Aplikazioak, web-orriak eta beste gauza batzuk sartzen dira. Iradokizunak hobetzeko balio duten estatistikak bidaltzen dira erabilera-datuak partekatzea aukeratu baduzu soilik.</translation> <translation id="3678156199662914018">Luzapena: <ph name="EXTENSION_NAME" /></translation> -<translation id="3679608942832457508">Kontu honekin saioa hasten duzunean, aplikazioen eta Chrome OS-ren ezarpenak sinkronizatu egingo dira Chromebook batetik bestera. <ph name="LINK_BEGIN" />Sinkronizazio-ezarpenak<ph name="LINK_END" /></translation> +<translation id="3679608942832457508">Kontu honekin saioa hasten duzunean, aplikazioen eta Chrome OS-en ezarpenak sinkronizatu egingo dira Chromebook batetik bestera. <ph name="LINK_BEGIN" />Sinkronizazio-ezarpenak<ph name="LINK_END" /></translation> <translation id="3680683624079082902">Testua ahots bihurtzeko eginbidearen ahotsa</translation> <translation id="3681311097828166361">Eskerrik asko oharrak bidaltzeagatik. Konektatuta ez zaudenez, geroago bidaliko da txostena.</translation> <translation id="3682824389861648626">Mugimenduen atalasea</translation> @@ -5262,7 +5265,6 @@ <translation id="7051943809462976355">Sagua bilatzen…</translation> <translation id="7052237160939977163">Bidali errendimenduaren jarraipena egiteko datuak</translation> <translation id="7053983685419859001">Blokeatu</translation> -<translation id="705508001219706572">Hona bizkor itzultzeko, instalatu <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Birbideratze hau blokeatu da:</translation> <translation id="7055451306017383754">Ezin izan da kendu partekatzeko aukera, aplikazio bat ari delako karpeta hau erabiltzen. Parallels Desktop ixten den hurrengoan utziko zaio karpeta partekatzeari.</translation> <translation id="7056526158851679338">&Aztertu gailuak</translation> @@ -5435,6 +5437,7 @@ <translation id="7251346854160851420">Horma-paper lehenetsia</translation> <translation id="7253521419891527137">&Lortu informazio gehiago</translation> <translation id="7254951428499890870">Ziur "<ph name="APP_NAME" />" diagnostiko moduan abiarazi nahi duzula?</translation> +<translation id="725497546968438223">Karpetaren laster-marka egiteko botoia</translation> <translation id="7255002516883565667">Une honetan, gailu honetan soilik erabil daitekeen txartel bat duzu</translation> <translation id="7255935316994522020">Aplikatu</translation> <translation id="7256069762010468647">Webgunea zure kamera erabiltzen ari da</translation> @@ -5696,6 +5699,7 @@ <translation id="7564847347806291057">Amaitu prozesua</translation> <translation id="7566118625369982896">Kudeatu Play-ko aplikazioen estekak</translation> <translation id="756809126120519699">Garbitu dira Chrome-ko datuak</translation> +<translation id="756876171895853918">Pertsonalizatu abatarra</translation> <translation id="7568790562536448087">Eguneratzen</translation> <translation id="7569983096843329377">Beltza</translation> <translation id="7571643774869182231">Ez dago eguneratzeko behar adina toki</translation> @@ -6287,7 +6291,7 @@ <translation id="8211551284753798479">PUK kodeak ez du balio. <ph name="RETRIES" /> saiakera gelditzen zaizkizu.</translation> <translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{Deskarga abian da}other{Deskargak abian dira}}</translation> <translation id="8213449224684199188">Argazki moduan sartu zara</translation> -<translation id="8213866992824776555"><ph name="DOMAIN" /> domeinuak gailua identifikatu nahi du kalitate oneneko video eta audio babestuak erreproduzitzeko.</translation> +<translation id="8213866992824776555"><ph name="DOMAIN" /> domeinuak gailua identifikatu nahi du kalitate oneneko bideo eta audio babestuak erreproduzitzeko.</translation> <translation id="8214489666383623925">Ireki fitxategia…</translation> <translation id="8214962590150211830">Kendu pertsona hau</translation> <translation id="8216351761227087153">Ikusi</translation> @@ -7161,6 +7165,7 @@ <translation id="9209563766569767417">Linux-en edukiontziaren konfigurazioa egiaztatzen</translation> <translation id="9209689095351280025">Webguneek ezin dituzte erabili sarean jarraipena egiten dizuten cookieak</translation> <translation id="9211177926627870898">Eguneratu egin behar da</translation> +<translation id="9211490828691860325">Lan-eremu guztiak</translation> <translation id="9214520840402538427">Instalazioko atributuak abiarazteko denbora-muga gainditu da. Jarri harremanetan laguntza emateko ordezkariarekin.</translation> <translation id="9214695392875603905">Pasteltxoa</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" gehitu da</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 0dfd7d0..68f01e7 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -799,6 +799,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> آماده تکمیل نصب است</translation> <translation id="1868193363684582383">«Ok Google»</translation> <translation id="1868553836791672080">بررسی گذرواژه در Chromium دردسترس نیست</translation> +<translation id="1869433484041798909">دکمه نشانکگذاری</translation> <translation id="187145082678092583">برنامههای کمتر</translation> <translation id="1871534214638631766">با فشار طولانی یا کلیک راست روی محتوا، اطلاعات مرتبط را نمایش میدهد</translation> <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> شما به روز است</translation> @@ -830,6 +831,7 @@ <translation id="1900305421498694955">ممکن است برنامههای Google Play برای خواندن فایلهای موجود در دستگاههای ذخیرهسازی خارجی و نوشتن در آنها، نیازمند دسترسی کامل به سیستم فایل باشند. فایلها و پوشههای ایجادشده در دستگاه برای هر فردی که از درایو خارجی استفاده میکند، نمایان است. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="1901303067676059328">انتخاب &همه</translation> <translation id="1901396183631570154">Chrome نتوانست این گذرواژهها را در «حساب Google» شما ذخیره کند. همچنان میتوانید آنها را در این دستگاه ذخیره کنید.</translation> +<translation id="1903995858055162096">این دستگاه شما نیست؟ استفاده از <ph name="BEGIN_LINK" />حالت مهمان<ph name="END_LINK" /></translation> <translation id="1905375423839394163">نام دستگاه Chromebook</translation> <translation id="1906181697255754968">سایتها معمولاً برای ارائه ویژگیهایی مانند ذخیره خودکار به فایلها و پوشههای دستگاه دسترسی مییابند</translation> <translation id="1906828677882361942">عدمامکان دسترسی به درگاههای سریال به هیچ سایتی</translation> @@ -1447,6 +1449,7 @@ <translation id="2617342710774726426">سیمکارت قفل است</translation> <translation id="2618797463720777311">راهاندازی «همرسانی با اطراف»</translation> <translation id="2619761439309613843">بازخوانی روزانه</translation> +<translation id="2620215283731032047">نمیتوان <ph name="FILE_NAME" /> را بهطور ایمن بارگیری کرد.</translation> <translation id="2620436844016719705">سیستم</translation> <translation id="262154978979441594">آموزش مدل صوتی «دستیار Google»</translation> <translation id="2621713457727696555">ایمن شد</translation> @@ -5261,7 +5264,6 @@ <translation id="7051943809462976355">در حال جستجو برای موشواره...</translation> <translation id="7052237160939977163">ارسال دادههای ردیابی عملکرد</translation> <translation id="7053983685419859001">مسدود کردن</translation> -<translation id="705508001219706572">برای اینکه سریع به اینجا برگردید، <ph name="APP_NAME" /> را نصب کنید</translation> <translation id="7055152154916055070">هدایت کردن مسدود شده است:</translation> <translation id="7055451306017383754">لغو همرسانی امکانپذیر نیست زیرا برنامهای از این پوشه استفاده میکند. دفعه بعد که Parallels Desktop خاموش شود، پوشه لغو همرسانی میشود.</translation> <translation id="7056526158851679338">&بازرسی دستگاهها</translation> @@ -5434,6 +5436,7 @@ <translation id="7251346854160851420">کاغذدیواری پیشفرض</translation> <translation id="7253521419891527137">&بیشتر بیاموزید</translation> <translation id="7254951428499890870">مطمئنید میخواهید «<ph name="APP_NAME" />» را در حالت تشخیص راهاندازی کنید؟</translation> +<translation id="725497546968438223">دکمه نشانکگذاری پوشه</translation> <translation id="7255002516883565667">درحالحاضر، یک کارت دارید که فقط در این دستگاه قابل استفاده است</translation> <translation id="7255935316994522020">اعمال</translation> <translation id="7256069762010468647">سایت درحال استفاده از دوربین شما است</translation> @@ -5695,6 +5698,7 @@ <translation id="7564847347806291057">پایان دادن به فرایند</translation> <translation id="7566118625369982896">مدیریت پیوندهای برنامه Play</translation> <translation id="756809126120519699">دادههای Chrome پاک شد</translation> +<translation id="756876171895853918">سفارشی کردن چهرهنما</translation> <translation id="7568790562536448087">در حال بهروزرسانی</translation> <translation id="7569983096843329377">سیاه</translation> <translation id="7571643774869182231">فضای ذخیرهسازی برای بهروزرسانی کافی نیست</translation> @@ -7162,6 +7166,7 @@ <translation id="9209563766569767417">درحال بررسی تنظیم محتوی Linux</translation> <translation id="9209689095351280025">سایتها نمیتوانند از کوکیهایی که شما را در وب ردیابی میکند استفاده کنند</translation> <translation id="9211177926627870898">بهروزرسانی لازم است</translation> +<translation id="9211490828691860325">همه میزکارها</translation> <translation id="9214520840402538427">متأسفیم! مهلت مقداردهی اولیه از ویژگیهای زمان نصب به پایان رسیده است. لطفاً با نماینده پشتیبانی خود تماس بگیرید.</translation> <translation id="9214695392875603905">کیک فنجانی</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" اضافه شد</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 3de401b..228d500 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -801,6 +801,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> on valmis suorittamaan asennuksen loppuun.</translation> <translation id="1868193363684582383">Ok Google</translation> <translation id="1868553836791672080">Salasanojen tarkistus ei ole saatavilla Chromiumissa</translation> +<translation id="1869433484041798909">Kirjanmerkkipainike</translation> <translation id="187145082678092583">Vähemmän sovelluksia</translation> <translation id="1871534214638631766">Näytä aiheeseen liittyviä tietoja klikkaamalla sisältöä hiiren kakkospainikkeella tai painamalla sitä pitkään</translation> <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> on ajan tasalla.</translation> @@ -832,6 +833,7 @@ <translation id="1900305421498694955">Google Playn sovellukset voivat edellyttää täysiä tiedostojärjestelmän käyttöoikeuksia, jotta ne voivat kirjoittaa ja lukea ulkoisten tallennustilalaitteiden tiedostoja. Kaikki ulkoisen aseman käyttäjät voivat nähdä laitteella luodut tiedostot ja kansiot. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Valitse &kaikki</translation> <translation id="1901396183631570154">Chrome ei voinut tallentaa näitä salasanoja Google-tilillesi. Voit kuitenkin tallentaa ne laitteellesi.</translation> +<translation id="1903995858055162096">Eikö tämä ole laitteesi? Käytä <ph name="BEGIN_LINK" />vierastilaa<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Chromebook-laitteen nimi</translation> <translation id="1906181697255754968">Sivustot käyttävät yleensä laitteesi tiedostoja ja kansioita tallentaakseen muutoksia automaattisesti ja tehdäkseen muuta vastaavaa</translation> <translation id="1906828677882361942">Älä anna minkään sivuston käyttää sarjaportteja</translation> @@ -1449,6 +1451,7 @@ <translation id="2617342710774726426">SIM-kortti on lukittu.</translation> <translation id="2618797463720777311">Lähijakamisen käyttöönotto</translation> <translation id="2619761439309613843">Uusi päivittäin</translation> +<translation id="2620215283731032047">Tiedostoa (<ph name="FILE_NAME" />) ei voi ladata turvallisesti.</translation> <translation id="2620436844016719705">Järjestelmä</translation> <translation id="262154978979441594">Kouluta Google Assistantin äänimalli</translation> <translation id="2621713457727696555">Suojattu</translation> @@ -5262,7 +5265,6 @@ <translation id="7051943809462976355">Hiirtä etsitään…</translation> <translation id="7052237160939977163">Lähetä tehokkuuden tarkkailutietoja</translation> <translation id="7053983685419859001">Estä</translation> -<translation id="705508001219706572">Asenna <ph name="APP_NAME" />, niin pääset takaisin tähän nopeasti</translation> <translation id="7055152154916055070">Uudelleenohjaus estetty:</translation> <translation id="7055451306017383754">Jakamista ei voitu peruuttaa, koska sovellus käyttää tätä kansiota. Kansion jakaminen perutaan seuraavan kerran, kun Parallels Desktop sammutetaan.</translation> <translation id="7056526158851679338">Tark&ista laitteet</translation> @@ -5435,6 +5437,7 @@ <translation id="7251346854160851420">Oletustausta</translation> <translation id="7253521419891527137">&Lisätietoja</translation> <translation id="7254951428499890870">Haluatko varmasti käynnistää sovelluksen <ph name="APP_NAME" /> diagnostiikkatilassa?</translation> +<translation id="725497546968438223">Kirjanmerkkikansion painike</translation> <translation id="7255002516883565667">Yhtä korteistasi voi juuri nyt käyttää vain tällä laitteella</translation> <translation id="7255935316994522020">Ota käyttöön</translation> <translation id="7256069762010468647">Sivusto käyttää kameraasi</translation> @@ -5696,6 +5699,7 @@ <translation id="7564847347806291057">Lopeta prosessi</translation> <translation id="7566118625369982896">Hallinnoi Play-sovelluksen linkkejä</translation> <translation id="756809126120519699">Chrome-tiedot tyhjennetty</translation> +<translation id="756876171895853918">Muokkaa avataria</translation> <translation id="7568790562536448087">Päivitetään</translation> <translation id="7569983096843329377">Musta</translation> <translation id="7571643774869182231">Tallennustila ei riitä päivitykseen.</translation> @@ -7161,6 +7165,7 @@ <translation id="9209563766569767417">Tarkistetaan Linux-säilön asetuksia</translation> <translation id="9209689095351280025">Sivustot eivät voi seurata sinua verkossa evästeiden avulla</translation> <translation id="9211177926627870898">Päivitys vaaditaan</translation> +<translation id="9211490828691860325">Kaikki työpöydät</translation> <translation id="9214520840402538427">Hups! Asennus-aika-attribuuttien alustaminen on aikakatkaistu. Ota yhteyttä tukipalveluun.</translation> <translation id="9214695392875603905">Kuppikakku</translation> <translation id="9215293857209265904"><ph name="EXTENSION_NAME" /> lisätty</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 3af6537..822ddada 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">Naka-lock ang SIM card</translation> <translation id="2618797463720777311">I-set up ang Nearby Share</translation> <translation id="2619761439309613843">Araw-araw na Pag-refresh</translation> +<translation id="2620215283731032047">Hindi ligtas na mada-download ang file na<ph name="FILE_NAME" />.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Sanayin ang voice model ng Google Assistant</translation> <translation id="2621713457727696555">Secured</translation> @@ -5266,7 +5267,6 @@ <translation id="7051943809462976355">Naghahanap ng mouse...</translation> <translation id="7052237160939977163">Ipadala ang data ng pagte-trace sa pagganap</translation> <translation id="7053983685419859001">I-block</translation> -<translation id="705508001219706572">Para mabilis na makabalik dito, i-install ang <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Na-block ang pag-redirect:</translation> <translation id="7055451306017383754">Hindi ma-unshare dahil ginagamit ng isang application ang folder na ito. Maa-unshare ang folder kapag na-shutdown ang Parallels Desktop.</translation> <translation id="7056526158851679338">&Inspeksyunin ang Mga Device</translation> @@ -7171,6 +7171,7 @@ <translation id="9209563766569767417">Sinusuri ang pag-set up ng Linux container</translation> <translation id="9209689095351280025">Ang mga site ay hindi makakagamit ng cookies na sumusubaybay sa iyo sa buong web</translation> <translation id="9211177926627870898">Kailangang i-update</translation> +<translation id="9211490828691860325">Lahat ng desk</translation> <translation id="9214520840402538427">Oops! Nag-time out ang pagpapasimula sa mga katangian ng pag-install at panahon. Mangyaring makipag-ugnay sa iyong kinatawan ng suporta.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">Idinagdag ang "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 90fbf752..4042887c 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -802,6 +802,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> est prêt à terminer l'installation.</translation> <translation id="1868193363684582383">« Ok Google »</translation> <translation id="1868553836791672080">La vérification des mots de passe n'est pas offerte dans Chromium</translation> +<translation id="1869433484041798909">Bouton de favori</translation> <translation id="187145082678092583">Moins d'applications</translation> <translation id="1871534214638631766">Afficher de l'information connexe lorsque vous faites un clic droit ou un appui prolongé sur un élément</translation> <translation id="1871615898038944731">Votre <ph name="DEVICE_TYPE" /> est à jour</translation> @@ -833,6 +834,7 @@ <translation id="1900305421498694955">Les applications de Google Play peuvent exiger un accès complet au système de fichiers pour lire et écrire des fichiers sur des périphériques de stockage externe. Les fichiers et les dossiers créés sur le périphérique sont visibles par tout utilisateur du disque externe. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="1901303067676059328">&Tout sélectionner</translation> <translation id="1901396183631570154">Chrome n'a pas pu enregistrer ces mots de passe dans votre compte Google. Vous pouvez quand même les enregistrer sur cet appareil.</translation> +<translation id="1903995858055162096">Ce n'est pas votre appareil? Utilisez le <ph name="BEGIN_LINK" />mode Invité<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Nom du Chromebook</translation> <translation id="1906181697255754968">Les sites accèdent généralement aux fichiers et aux dossiers sur votre appareil pour proposer des fonctionnalités, comme la sauvegarde automatique de votre travail</translation> <translation id="1906828677882361942">Ne pas autoriser les sites à accéder aux ports série</translation> @@ -1451,6 +1453,7 @@ <translation id="2617342710774726426">La carte SIM est verrouillée</translation> <translation id="2618797463720777311">Configurer le partage à proximité</translation> <translation id="2619761439309613843">Actualiser tous les jours</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ne peut pas être téléchargé de manière sécuritaire.</translation> <translation id="2620436844016719705">Système</translation> <translation id="262154978979441594">Former le modèle vocal pour l'Assistant Google</translation> <translation id="2621713457727696555">Sécurisé</translation> @@ -5264,7 +5267,6 @@ <translation id="7051943809462976355">Recherche de la souris en cours…</translation> <translation id="7052237160939977163">Envoyer des données de suivi des performances</translation> <translation id="7053983685419859001">Bloquer</translation> -<translation id="705508001219706572">Pour revenir ici rapidement, installez <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Redirection bloquée :</translation> <translation id="7055451306017383754">Impossible d'annuler le partage parce qu'une application utilise ce dossier. Le partage sera annulé au prochain arrêt de Parallels Desktop.</translation> <translation id="7056526158851679338">&Inspecter les appareils</translation> @@ -5437,6 +5439,7 @@ <translation id="7251346854160851420">Fond d'écran par défaut</translation> <translation id="7253521419891527137">En savoir p&lus</translation> <translation id="7254951428499890870">Voulez-vous vraiment lancer l'application « <ph name="APP_NAME" /> » en mode diagnostic?</translation> +<translation id="725497546968438223">Bouton du dossier de favoris</translation> <translation id="7255002516883565667">Pour le moment, vous n'avez qu'une carte et elle ne peut être utilisée que sur cet appareil</translation> <translation id="7255935316994522020">Appliquer</translation> <translation id="7256069762010468647">Le site utilise votre appareil photo</translation> @@ -5698,6 +5701,7 @@ <translation id="7564847347806291057">Supprimer le processus</translation> <translation id="7566118625369982896">Gérer les liens de l'application Play</translation> <translation id="756809126120519699">Données de Chrome effacées</translation> +<translation id="756876171895853918">Personnaliser l'avatar</translation> <translation id="7568790562536448087">Mise à jour</translation> <translation id="7569983096843329377">Noir</translation> <translation id="7571643774869182231">Espace insuffisant pour la mise à jour</translation> @@ -7164,6 +7168,7 @@ <translation id="9209563766569767417">Vérification de la configuration du conteneur Linux en cours…</translation> <translation id="9209689095351280025">Les sites ne peuvent pas utiliser de témoins qui font le suivi de votre activité sur le Web</translation> <translation id="9211177926627870898">Mise à jour requise</translation> +<translation id="9211490828691860325">Tous les bureaux</translation> <translation id="9214520840402538427">Oups… Le délai alloué à l'initialisation des attributs de temps d'installation a expiré. Veuillez communiquer avec le service d'assistance.</translation> <translation id="9214695392875603905">Petit gâteau</translation> <translation id="9215293857209265904">« <ph name="EXTENSION_NAME" /> » a été ajouté</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index bdb2b7f000..c3a549b8 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">La carte SIM est verrouillée</translation> <translation id="2618797463720777311">Configurer la fonctionnalité Partage à proximité</translation> <translation id="2619761439309613843">Actualisation quotidienne</translation> +<translation id="2620215283731032047">Impossible de télécharger <ph name="FILE_NAME" /> de manière sécurisée.</translation> <translation id="2620436844016719705">Système</translation> <translation id="262154978979441594">Entraîner l'empreinte vocale de l'Assistant Google</translation> <translation id="2621713457727696555">Sécurisé</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Recherche de la souris en cours…</translation> <translation id="7052237160939977163">Envoyer des informations relatives au suivi des performances</translation> <translation id="7053983685419859001">Bloquer</translation> -<translation id="705508001219706572">Pour revenir ici rapidement, installez <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Redirection bloquée :</translation> <translation id="7055451306017383754">Impossible d'annuler le partage, car une application utilise ce dossier. Le partage sera annulé au prochain arrêt de Parallels Desktop.</translation> <translation id="7056526158851679338">&Inspecter les appareils</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">Vérification de la configuration du conteneur Linux…</translation> <translation id="9209689095351280025">Les sites ne peuvent pas utiliser de cookies pour suivre votre activité sur le Web</translation> <translation id="9211177926627870898">Mise à jour requise</translation> +<translation id="9211490828691860325">Tous les bureaux</translation> <translation id="9214520840402538427">Petit problème… Le délai alloué à l'initialisation des attributs de temps d'installation a expiré. Veuillez contacter le service d'assistance.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ajoutée</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 662bc365..68fc3a21 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -800,6 +800,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> está preparado para completar a instalación</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">A comprobación de contrasinais non está dispoñible en Chromium.</translation> +<translation id="1869433484041798909">Botón de marcador</translation> <translation id="187145082678092583">Menos aplicacións</translation> <translation id="1871534214638631766">Mostra información relacionada cando manteñas premido o contido ou fagas clic co botón dereito nel</translation> <translation id="1871615898038944731">O dispositivo <ph name="DEVICE_TYPE" /> está actualizado</translation> @@ -831,6 +832,7 @@ <translation id="1900305421498694955">As aplicacións de Google Play poden necesitar acceso total ao sistema de ficheiros para ler e editar ficheiros no almacenamento externo. Os ficheiros e os cartafoles creados no dispositivo son visibles para todos os usuarios da unidade externa. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Seleccion&ar todo</translation> <translation id="1901396183631570154">Chrome non puido gardar estes contrasinais na túa Conta de Google. Así e todo, podes gardalos neste dispositivo.</translation> +<translation id="1903995858055162096">Non é o teu dispositivo? Utiliza o <ph name="BEGIN_LINK" />modo de invitado<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Nome do dispositivo Chromebook</translation> <translation id="1906181697255754968">Os sitios adoitan acceder aos ficheiros e aos cartafoles do dispositivo para ofrecerche determinadas funcións (por exemplo, gardar automaticamente o teu traballo)</translation> <translation id="1906828677882361942">Non permitir que ningún sitio acceda aos portos de serie</translation> @@ -1448,6 +1450,7 @@ <translation id="2617342710774726426">A tarxeta SIM está bloqueada</translation> <translation id="2618797463720777311">Configurar a función Compartir por Nearby</translation> <translation id="2619761439309613843">Actualización diaria</translation> +<translation id="2620215283731032047">O ficheiro <ph name="FILE_NAME" /> non se pode descargar de forma segura.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Crear modelo de voz do Asistente de Google</translation> <translation id="2621713457727696555">Protexida</translation> @@ -5261,7 +5264,6 @@ <translation id="7051943809462976355">Buscando o rato...</translation> <translation id="7052237160939977163">Enviar datos de seguimento de rendemento</translation> <translation id="7053983685419859001">Bloquear</translation> -<translation id="705508001219706572">Para volver aquí rapidamente, instala <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Bloqueouse unha redirección:</translation> <translation id="7055451306017383754">Non se puido deixar de compartir este cartafol porque había unha aplicación usándoo. O cartafol deixará de compartirse cando Parallels Desktop se apague.</translation> <translation id="7056526158851679338">&Inspeccionar dispositivos</translation> @@ -5434,6 +5436,7 @@ <translation id="7251346854160851420">Fondo de pantalla predeterminado</translation> <translation id="7253521419891527137">&Máis información</translation> <translation id="7254951428499890870">Estás seguro de que queres iniciar "<ph name="APP_NAME" />" no modo de diagnóstico?</translation> +<translation id="725497546968438223">Botón de cartafol de marcadores</translation> <translation id="7255002516883565667">Neste momento, tes unha tarxeta que só se pode utilizar neste dispositivo</translation> <translation id="7255935316994522020">Aplicar</translation> <translation id="7256069762010468647">O sitio está usando a túa cámara</translation> @@ -5695,6 +5698,7 @@ <translation id="7564847347806291057">Finalizar proceso</translation> <translation id="7566118625369982896">Xestionar ligazóns da aplicación Play</translation> <translation id="756809126120519699">Borráronse os datos de Chrome</translation> +<translation id="756876171895853918">Personalizar avatar</translation> <translation id="7568790562536448087">Actualizando</translation> <translation id="7569983096843329377">Negro</translation> <translation id="7571643774869182231">Non hai almacenamento suficiente para realizar a actualización</translation> @@ -7160,6 +7164,7 @@ <translation id="9209563766569767417">Comprobando configuración do contedor de Linux</translation> <translation id="9209689095351280025">Os sitios non poden usar cookies para seguirte pola Web</translation> <translation id="9211177926627870898">Actualización obrigatoria</translation> +<translation id="9211490828691860325">Todos os ordenadores</translation> <translation id="9214520840402538427">Esgotouse o tempo de inicio dos atributos de tempo de instalación. Ponte en contacto co representante do servizo de asistencia.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">Engadiuse "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 88a5922..e9a17bf5 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1446,6 +1446,7 @@ <translation id="2617342710774726426">SIM કાર્ડ લૉક કરેલ છે</translation> <translation id="2618797463720777311">'નજીકના શેર'નું સેટઅપ કરો</translation> <translation id="2619761439309613843">દરરોજ રિફ્રેશ કરો</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> સુરક્ષિતપણે ડાઉનલોડ કરી શકાતી નથી.</translation> <translation id="2620436844016719705">સિસ્ટમ</translation> <translation id="262154978979441594">Google Assistant વૉઇસ મૉડલને તાલિમ આપો</translation> <translation id="2621713457727696555">સુરક્ષિત</translation> @@ -5262,7 +5263,6 @@ <translation id="7051943809462976355">માઉસ માટે શોધી રહ્યું છે...</translation> <translation id="7052237160939977163">પ્રદર્શન ટ્રેસ ડેટા મોકલો</translation> <translation id="7053983685419859001">અવરોધિત કરો</translation> -<translation id="705508001219706572">અહીં ઝડપથી પરત ફરવા માટે, <ph name="APP_NAME" /> ઇન્સ્ટૉલ કરો</translation> <translation id="7055152154916055070">રીડાયરેક્ટ કરવાનું બ્લૉક કરવામાં આવ્યું છે:</translation> <translation id="7055451306017383754">કોઈ ઍપ્લિકેશન આ ફોલ્ડરનો ઉપયોગ કરી રહી હોવાને કારણે આને અનશેર કરી શકાતું નથી. જ્યારે આગલી વારે Parallels Desktop શટ ડાઉન થશે, ત્યારે ફોલ્ડરને અનશેર કરવામાં આવશે.</translation> <translation id="7056526158851679338">&ઉપકરણોની તપાસ કરો</translation> @@ -7157,6 +7157,7 @@ <translation id="9209563766569767417">Linux કન્ટેનરનું સેટઅપ ચેક કરી રહ્યાં છીએ</translation> <translation id="9209689095351280025">સાઇટ તમને વેબ પર બધે ટ્રૅક કરતી કુકીનો ઉપયોગ કરી શકશે નહીં</translation> <translation id="9211177926627870898">અપડેટ જરૂરી છે</translation> +<translation id="9211490828691860325">તમામ ડેસ્ક</translation> <translation id="9214520840402538427">અરે! ઇન્સ્ટૉલેશન-સમયનો ચાલુ એટ્રિબ્યૂટનો સમય સમાપ્ત થયો. કૃપા કરીને તમારા સપોર્ટ પ્રતિનિધિનો સંપર્ક કરો.</translation> <translation id="9214695392875603905">કપકૅક</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ઉમેરાયું</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index bf2bb60a..deb3c49 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">सिम कार्ड लॉक है</translation> <translation id="2618797463720777311">आस-पास शेयर करने की सुविधा सेट अप करें</translation> <translation id="2619761439309613843">हर दिन रीफ़्रेश करें</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> को सुरक्षित रूप से डाउनलोड नहीं किया जा सकता.</translation> <translation id="2620436844016719705">सिस्टम</translation> <translation id="262154978979441594">Google Assistant की आवाज़ के नमूने को ट्रेनिंग दें</translation> <translation id="2621713457727696555">सुरक्षित</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">माउस खोजा जा रहा है...</translation> <translation id="7052237160939977163">निष्पादन ट्रेस डेटा भेजें</translation> <translation id="7053983685419859001">ब्लॉक करें</translation> -<translation id="705508001219706572">इसे और जल्दी ऐक्सेस करने के लिए, <ph name="APP_NAME" /> इंस्टॉल करें</translation> <translation id="7055152154916055070">रीडायरेक्ट ब्लॉक किया गया:</translation> <translation id="7055451306017383754">शेयर करना बंद नहीं किया जा सका, क्योंकि एक ऐप्लिकेशन इस फ़ोल्डर का इस्तेमाल कर रहा है. जब Parallels Desktop अगली बार बंद होगा, तब इस फ़ोल्डर को शेयर करना बंद कर दिया जाएगा.</translation> <translation id="7056526158851679338">&उपकरणों की जाँच करें</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Linux कंटेनर सेट अप की जांच हो रही है</translation> <translation id="9209689095351280025">साइटें उन कुकी का इस्तेमाल नहीं कर सकतीं जो आपको वेब पर ट्रैक करती हैं</translation> <translation id="9211177926627870898">अपडेट ज़रूरी है</translation> +<translation id="9211490828691860325">सभी डेस्क</translation> <translation id="9214520840402538427">ओह! इंस्टॉलेशन-समय विशेषताएं शुरू करने की समय सीमा खत्म हो गई है. कृपया अपने सहायता प्रतिनिधि से संपर्क करें.</translation> <translation id="9214695392875603905">कपकेक</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" जोड़ा गया</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 8be45187..ab169c0 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2618797463720777311">Postavljanje Dijeljenja s Android uređajima</translation> <translation id="2619761439309613843">Dnevno osvježavanje</translation> +<translation id="2620215283731032047">Datoteka <ph name="FILE_NAME" /> ne može se sigurno preuzeti.</translation> <translation id="2620436844016719705">Sustav</translation> <translation id="262154978979441594">Uvježbavanje glasovnog modela Google asistenta</translation> <translation id="2621713457727696555">Zaštićeno</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Traženje miša...</translation> <translation id="7052237160939977163">Šalji podatke o praćenju izvedbe</translation> <translation id="7053983685419859001">Blokiraj</translation> -<translation id="705508001219706572">Da biste se brzo vratili ovdje, instalirajte aplikaciju <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Preusmjeravanje je blokirano:</translation> <translation id="7055451306017383754">Prestanak dijeljenja nije bio moguć jer jedna aplikacija koristi tu mapu. Dijeljenje mape prestat će kad se Parallels Desktop isključi.</translation> <translation id="7056526158851679338">&Provjeri uređaje</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">Provjera postavljanja Linuxovog spremnika</translation> <translation id="9209689095351280025">Web-lokacije ne mogu upotrebljavati kolačiće koji vas prate na webu</translation> <translation id="9211177926627870898">Potrebno je ažuriranje</translation> +<translation id="9211490828691860325">Sve radne površine</translation> <translation id="9214520840402538427">Ups! Inicijalizacija atributa vremena instalacije istekla je. Obratite se predstavniku podrške.</translation> <translation id="9214695392875603905">Kolač</translation> <translation id="9215293857209265904">Dodano je proširenje "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index ae0d39b..24884df 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">A SIM-kártya zárolva van</translation> <translation id="2618797463720777311">Közeli megosztás beállítása</translation> <translation id="2619761439309613843">Napi frissítés</translation> +<translation id="2620215283731032047">A következő fájlt nem lehet biztonságosan letölteni: <ph name="FILE_NAME" />.</translation> <translation id="2620436844016719705">Rendszer</translation> <translation id="262154978979441594">Google Segéd-hangminta megtanítása</translation> <translation id="2621713457727696555">Biztonságos</translation> @@ -4184,7 +4185,7 @@ <translation id="5794476117027678724">A webhelyek nem láthatják a vágólapon szereplő szöveget és képeket</translation> <translation id="5794700615121138172">Megosztott Linux-mappák</translation> <translation id="5794786537412027208">Összes Chrome-alkalmazás bezárása</translation> -<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Keresés, a hirdetések és más Google-szolgáltatások személyre szabására</translation> +<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására</translation> <translation id="5798301976526354562">Szöveg mérete (az Élő feliratozás funkcióra is érvényes)</translation> <translation id="579915268381781820">Eltávolította a biztonsági hardverkulcsot.</translation> <translation id="5799508265798272974">Linuxos virtuális gép: <ph name="LINUX_VM_NAME" /></translation> @@ -5266,7 +5267,6 @@ <translation id="7051943809462976355">Egér keresése…</translation> <translation id="7052237160939977163">Teljesítménykövetési adatok elküldése</translation> <translation id="7053983685419859001">Letiltás</translation> -<translation id="705508001219706572">Telepítse a(z) <ph name="APP_NAME" /> alkalmazást, hogy gyorsabban visszatérhessen ide</translation> <translation id="7055152154916055070">Átirányítás letiltva:</translation> <translation id="7055451306017383754">Nem sikerült a megosztás visszavonása, mivel valamelyik alkalmazás használja ezt a mappát. A mappa megosztásának visszavonása a Parallels Desktop következő leállításakor történik majd meg.</translation> <translation id="7056526158851679338">&Eszközök vizsgálata</translation> @@ -6577,7 +6577,7 @@ <translation id="8561853412914299728"><ph name="TAB_TITLE" /> <ph name="EMOJI_PLAYING" /></translation> <translation id="8565650234829130278">Megpróbálta alacsonyabb verzióra váltani az alkalmazást.</translation> <translation id="8569682776816196752">Nem található célhely</translation> -<translation id="8571213806525832805">Az elmúlt négy hétből</translation> +<translation id="8571213806525832805">Az elmúlt 4 hétből</translation> <translation id="8571687764447439720">Kerberos-jegy hozzáadása</translation> <translation id="8571814292654854151">Nevezze el a profilját</translation> <translation id="8574990355410201600">Hangok folyamatos engedélyezése a következőn: <ph name="HOST" /></translation> @@ -7168,6 +7168,7 @@ <translation id="9209563766569767417">Linux-tároló beállításainak ellenőrzése</translation> <translation id="9209689095351280025">A webhelyek nem tudnak olyan cookie-kat használni, amelyek nyomon követik tevékenységeit az interneten.</translation> <translation id="9211177926627870898">Frissítés szükséges</translation> +<translation id="9211490828691860325">Az összes asztal</translation> <translation id="9214520840402538427">Hoppá! A telepítés alatti attribútumok inicializálásakor időtúllépés történt. Kérjük, lépjen kapcsolatba az ügyfélszolgálattal.</translation> <translation id="9214695392875603905">Muffin</translation> <translation id="9215293857209265904">„<ph name="EXTENSION_NAME" />” hozzáadva</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 0688b309..2be3e9c1 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -803,6 +803,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" />-ը պատրաստ է ավարտել տեղադրումը</translation> <translation id="1868193363684582383">«Ok Google»</translation> <translation id="1868553836791672080">Գաղտնաբառերի ստուգումը հասանելի չէ Chromium-ում</translation> +<translation id="1869433484041798909">Էջանշման կոճակ</translation> <translation id="187145082678092583">Ավելի քիչ հավելվածներ</translation> <translation id="1871534214638631766">Ցույց տալ առնչվող տեղեկություններ՝ բովանդակության վրա երկար սեղմելու կամ մկնիկի աջ կոճակը սեղմելու դեպքում</translation> <translation id="1871615898038944731"><ph name="DEVICE_TYPE" /> սարքը թարմացված է</translation> @@ -834,6 +835,7 @@ <translation id="1900305421498694955">Google Play Խանութի հավելավածներին կարող է պահանջվել ֆայլային համակարգի լրիվ հասանելիություն՝ ֆայլերը կարդալու և արտաքին հիշասարքերում պահելու համար: Սարքում ստեղծված ֆայլերն ու պանակները տեսանելի կլինեն բոլորին, ով օգտագործում է արտաքին դրայվը: <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Ընտրել &բոլորը</translation> <translation id="1901396183631570154">Chrome-ին չհաջողվեց պահել այս գաղտնաբառերը ձեր Google հաշվում։ Դրանք կարող եք պահել այս սարքում։</translation> +<translation id="1903995858055162096">Սա ձեր սա՞րքը չէ։ Օգտագործեք <ph name="BEGIN_LINK" />հյուրի ռեժիմը<ph name="END_LINK" />։</translation> <translation id="1905375423839394163">Chromebook սարքի անունը</translation> <translation id="1906181697255754968">Կայքերը սովորաբար օգտագործում են սարքի ֆայլերն ու պանակները՝ ձեր աշխատանքն ավտոմատ կերպով պահպանելու և նման այլ գործառույթների համար</translation> <translation id="1906828677882361942">Արգելափակել հաջորդական միացքների հասանելիությունը բոլոր կայքերի համար</translation> @@ -1451,6 +1453,7 @@ <translation id="2617342710774726426">SIM քարտը կողպված է</translation> <translation id="2618797463720777311">Կարգավորեք «Փոխանակում մոտակա սարքերի հետ» գործառույթը</translation> <translation id="2619761439309613843">Ամենօրյա թարմացում</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ֆայլը հնարավոր չէ ներբեռնել անվտանգ եղանակով։</translation> <translation id="2620436844016719705">Համակարգ</translation> <translation id="262154978979441594">Ձայնագրել ձայնի մոդել Google Օգնականի համար</translation> <translation id="2621713457727696555">Պաշտպանված է</translation> @@ -5267,7 +5270,6 @@ <translation id="7051943809462976355">Մկնիկի որոնում է…</translation> <translation id="7052237160939977163">Ուղարկել կատարողականության հետագծման տվյալները</translation> <translation id="7053983685419859001">Արգելափակել</translation> -<translation id="705508001219706572">Այս էջն արագ բացելու համար տեղադրեք <ph name="APP_NAME" /> հավելվածը</translation> <translation id="7055152154916055070">Վերահասցեավորումն արգելափակված է՝</translation> <translation id="7055451306017383754">Չհաջողվեց չեղարկել պանակի հասանելիությունը, քանի որ այն օգտագործվում է հավելվածի կողմից։ Պանակն անհասանելի կդառնա, երբ Parallels Desktop-ը հաջորդ անգամ անջատվի։</translation> <translation id="7056526158851679338">&Հետազոտել սարքերը</translation> @@ -5440,6 +5442,7 @@ <translation id="7251346854160851420">Կանխադրված պաստառ</translation> <translation id="7253521419891527137">&Իմանալ ավելին</translation> <translation id="7254951428499890870">Գործարկե՞լ «<ph name="APP_NAME" />» հավելվածն ախտորոշման ռեժիմում:</translation> +<translation id="725497546968438223">Պանակն էջանշելու կոճակ</translation> <translation id="7255002516883565667">Տվյալ պահին դուք ունեք մի քարտ, որը կարող է օգտագործվել միայն այս սարքում</translation> <translation id="7255935316994522020">Կիրառել</translation> <translation id="7256069762010468647">Կայքն օգտագործում է ձեր տեսախցիկը</translation> @@ -5701,6 +5704,7 @@ <translation id="7564847347806291057">Ավարտել գործընթացը</translation> <translation id="7566118625369982896">Կառավարել Google Play հավելվածի հղումները</translation> <translation id="756809126120519699">Chrome-ի տվյալները ջնջվեցին</translation> +<translation id="756876171895853918">Անհատականացնել ավատարը</translation> <translation id="7568790562536448087">Թարմացում</translation> <translation id="7569983096843329377">Սև</translation> <translation id="7571643774869182231">Թարմացման համար հիշողությունը բավարար չէ</translation> @@ -7166,6 +7170,7 @@ <translation id="9209563766569767417">Լինուքսի կոնտեյների կարգավորումները ստուգվում են</translation> <translation id="9209689095351280025">Կայքերը չեն կարող օգտագործել քուքիները, որոնց միջոցով հետագծվում են ձեր գործողությունները համացանցում։</translation> <translation id="9211177926627870898">Պահանջվում է թարմացում</translation> +<translation id="9211490828691860325">Բոլոր աշխատասեղանները</translation> <translation id="9214520840402538427">Ցավոք, եղադրման ժամանակի հատկանիշների սկզբնավորումը ժամասպառվեց: Կապվեք ձեր աջակցման կենտրոնի ներկայացուցչի հետ:</translation> <translation id="9214695392875603905">Կեքս</translation> <translation id="9215293857209265904">«<ph name="EXTENSION_NAME" />» ընդլայնումն ավելացվել է</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 887e298..4965f9c 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">Kartu SIM terkunci</translation> <translation id="2618797463720777311">Menyiapkan Berbagi Langsung</translation> <translation id="2619761439309613843">Muat Ulang Harian</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> tidak dapat didownload dengan aman.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Latih model suara Asisten Google</translation> <translation id="2621713457727696555">Aman</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">Mencari mouse...</translation> <translation id="7052237160939977163">Mengirim data pelacakan kinerja</translation> <translation id="7053983685419859001">Blokir</translation> -<translation id="705508001219706572">Instal <ph name="APP_NAME" /> agar dapat kembali ke sini dengan cepat</translation> <translation id="7055152154916055070">Pengalihan diblokir:</translation> <translation id="7055451306017383754">Tidak dapat membatalkan berbagi karena ada aplikasi yang menggunakan folder ini. Berbagi folder akan dibatalkan saat berikutnya Parallels Desktop dimatikan.</translation> <translation id="7056526158851679338">&Periksa Perangkat</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Memeriksa penyiapan container Linux</translation> <translation id="9209689095351280025">Situs tidak dapat menggunakan cookie yang melacak Anda di seluruh web</translation> <translation id="9211177926627870898">Perlu update</translation> +<translation id="9211490828691860325">Semua desktop</translation> <translation id="9214520840402538427">Uups! Waktu pemulaian atribut waktu pemasangan telah habis. Hubungi perwakilan dukungan Anda.</translation> <translation id="9214695392875603905">Kue mangkok</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ditambahkan</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 5714a20..4bd9355a 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">SIM-kortið er læst</translation> <translation id="2618797463720777311">Setja upp nærdeilingu</translation> <translation id="2619761439309613843">Uppfæra daglega</translation> +<translation id="2620215283731032047">Ekki er hægt að sækja <ph name="FILE_NAME" /> á öruggan hátt.</translation> <translation id="2620436844016719705">Kerfi</translation> <translation id="262154978979441594">Þjálfa raddlíkan Google hjálpara</translation> <translation id="2621713457727696555">Læst</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Leitar að mús...</translation> <translation id="7052237160939977163">Senda rakningargögn um afköst</translation> <translation id="7053983685419859001">Setja á bannlista</translation> -<translation id="705508001219706572">Til að komast hratt hingað aftur skaltu setja upp <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Lokað á framsendingu:</translation> <translation id="7055451306017383754">Ekki var hægt að hætta að deila vegna þess að forrit er að nota þessa möppu. Hætt verður að deila möppunni næst þegar slökkt er á Parallels Desktop.</translation> <translation id="7056526158851679338">Kanna tæk&i</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Athugar uppsetningu Linux-geymis</translation> <translation id="9209689095351280025">Vefsvæði geta ekki notað fótspor sem rekja virkni þína á vefnum</translation> <translation id="9211177926627870898">Uppfærslu er krafist</translation> +<translation id="9211490828691860325">Öll skrifborð</translation> <translation id="9214520840402538427">Úbbs! Frumstilling uppsetningareiginda rann út á tíma. Hafðu samband við þjónustufulltrúann þinn.</translation> <translation id="9214695392875603905">Kaka</translation> <translation id="9215293857209265904">„<ph name="EXTENSION_NAME" />“ bætt við</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 5226f0f..56d8d1d9 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">La scheda SIM è bloccata</translation> <translation id="2618797463720777311">Configura Condivisione nelle vicinanze</translation> <translation id="2619761439309613843">Aggiornam. quotidiano</translation> +<translation id="2620215283731032047">Impossibile scaricare <ph name="FILE_NAME" /> in modo sicuro.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Imposta il modello vocale dell'Assistente Google</translation> <translation id="2621713457727696555">Protetta</translation> @@ -5262,7 +5263,6 @@ <translation id="7051943809462976355">Ricerca mouse in corso...</translation> <translation id="7052237160939977163">Invia dati di rilevamento del rendimento</translation> <translation id="7053983685419859001">Blocca</translation> -<translation id="705508001219706572">Per tornare qui rapidamente, installa <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Reindirizzamento bloccato:</translation> <translation id="7055451306017383754">Impossibile annullare la condivisione perché questa cartella è in uso in un'applicazione. La condivisione della cartella verrà annullata quando verrà arrestato Parallels Desktop.</translation> <translation id="7056526158851679338">&Ispeziona dispositivi</translation> @@ -7161,6 +7161,7 @@ <translation id="9209563766569767417">Controllo della configurazione del container Linux</translation> <translation id="9209689095351280025">I siti non possono utilizzare i cookie per monitorare la tua attività sul Web.</translation> <translation id="9211177926627870898">Aggiornamento richiesto</translation> +<translation id="9211490828691860325">Tutte le scrivanie</translation> <translation id="9214520840402538427">Spiacenti. L'inizializzazione degli attributi installation-time è scaduta. Contatta il tuo rappresentante dell'assistenza.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" aggiunta</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index fa3526ab..c7c996e 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">כרטיס ה-SIM נעול</translation> <translation id="2618797463720777311">הגדרת 'שיתוף בקרבת מקום'</translation> <translation id="2619761439309613843">רענון יומי</translation> +<translation id="2620215283731032047">לא ניתן להוריד את <ph name="FILE_NAME" /> בצורה מאובטחת.</translation> <translation id="2620436844016719705">מערכת</translation> <translation id="262154978979441594">אימון תבנית הקול של Google Assistant</translation> <translation id="2621713457727696555">מאובטחת</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">המערכת מחפשת עכבר...</translation> <translation id="7052237160939977163">שליחת נתוני מעקב אחר ביצועים</translation> <translation id="7053983685419859001">חסימה</translation> -<translation id="705508001219706572">כדי לחזור לכאן במהירות, מומלץ להתקין את <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">הפניה אוטומטית נחסמה:</translation> <translation id="7055451306017383754">לא ניתן לבטל את השיתוף כי אפליקציה משתמשת בתיקייה הזו. שיתוף התיקייה הזו יבוטל בכיבוי הבא של Parallels Desktop.</translation> <translation id="7056526158851679338">&בדיקת מכשירים</translation> @@ -7170,6 +7170,7 @@ <translation id="9209563766569767417">המערכת בודקת את הגדרות הקונטיינר של Linux</translation> <translation id="9209689095351280025">אתרים לא יכולים להשתמש בקובצי cookie שעוקבים אחריך באינטרנט</translation> <translation id="9211177926627870898">נדרש עדכון</translation> +<translation id="9211490828691860325">כל שולחנות העבודה הווירטואליים</translation> <translation id="9214520840402538427">אופס! תם הזמן הקצוב לאתחול של מאפייני זמן ההתקנה. יש לפנות אל נציג התמיכה שלך.</translation> <translation id="9214695392875603905">קאפקייק</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" נוסף</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 3ba0902..10d8a6f7 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">SIM カードはロックされています</translation> <translation id="2618797463720777311">ニアバイシェアの設定</translation> <translation id="2619761439309613843">毎日更新する</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> は安全にダウンロードできません。</translation> <translation id="2620436844016719705">システム</translation> <translation id="262154978979441594">Google アシスタントの音声モデルのトレーニング</translation> <translation id="2621713457727696555">保護あり</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">マウスを探しています...</translation> <translation id="7052237160939977163">パフォーマンス追跡データを送信する</translation> <translation id="7053983685419859001">ブロック</translation> -<translation id="705508001219706572">このページにすぐにアクセスできるようにするには、<ph name="APP_NAME" /> をインストールしてください</translation> <translation id="7055152154916055070">リダイレクトがブロックされました</translation> <translation id="7055451306017383754">このフォルダを使用しているアプリケーションがあるため、共有を停止できませんでした。次回 Parallels Desktop をシャットダウンするときに、フォルダの共有を停止します。</translation> <translation id="7056526158851679338">デバイスを検証(&I)</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Linux コンテナの設定を確認しています</translation> <translation id="9209689095351280025">サイトは Cookie を使用してあなたをウェブ上でトラッキングできません</translation> <translation id="9211177926627870898">更新が必要です</translation> +<translation id="9211490828691860325">すべてのデスク</translation> <translation id="9214520840402538427">installation-time 属性の初期化がタイムアウトしました。サポート担当者にお問い合わせください。</translation> <translation id="9214695392875603905">カップケーキ</translation> <translation id="9215293857209265904">「<ph name="EXTENSION_NAME" />」が追加されました</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index a359a271..76c65909 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">SIM ბარათი დაბლოკილია</translation> <translation id="2618797463720777311">მახლობლად გაზიარების დაყენეა</translation> <translation id="2619761439309613843">ყოველდღიური განახლება</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" />-ის უსაფრთხოდ ჩამოტვირთვა ვერ მოხერხდება.</translation> <translation id="2620436844016719705">სისტემა</translation> <translation id="262154978979441594">Google ასისენტის ხმის მოდელის მომზადება</translation> <translation id="2621713457727696555">დაცული</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">მაუსის ძებნა…</translation> <translation id="7052237160939977163">ეფექტურობის ტრასირების მონაცემების გაგზავნა</translation> <translation id="7053983685419859001">დაბლოკვა</translation> -<translation id="705508001219706572">აქ უფრო სწრაფად რომ დაბრუნდეთ ხოლმე, დააინსტალირეთ <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">გადამისამართება დაიბლოკა:</translation> <translation id="7055451306017383754">გაზიარების გაუქმება ვერ მოხერხდა, ვინაიდან ამ საქაღალდეს ერთ-ერთი აპლიკაცია იყენებს. ამ საქაღალდის გაზიარება გაუქმდება Parallels Desktop-ის მომდევნო გათიშვისას.</translation> <translation id="7056526158851679338">მოწყობილობების შ&ემოწმება</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">მიმდინარეობს Linux-ის კონტეინერის დაყენება</translation> <translation id="9209689095351280025">საიტები ვერ გამოიყენებს ქუქი-ჩანაწერებს ვებში თქვენთვის თვალის მისადევნებლად</translation> <translation id="9211177926627870898">საჭიროა განახლება</translation> +<translation id="9211490828691860325">ყველა სამუშაო მაგიდა</translation> <translation id="9214520840402538427">უპს! დაინსტალირების დროის ატრიბუტების ინიციალიზაცია ამოიწურა. დაუკავშირდით მხარდაჭერის თქვენს წარმომადგენელს.</translation> <translation id="9214695392875603905">კექსი</translation> <translation id="9215293857209265904">„<ph name="EXTENSION_NAME" />“ დამატებულია</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 7d617d98..a2bd17ae 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">SIM картасы құлыпталған</translation> <translation id="2618797463720777311">Nearby Share функциясын реттеу</translation> <translation id="2619761439309613843">Күн сайын жаңарту</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> файлын қауіпсіз жүктеп алу мүмкін емес.</translation> <translation id="2620436844016719705">Жүйе</translation> <translation id="262154978979441594">Google Assistant-ке дауыс үлгісін үйрету</translation> <translation id="2621713457727696555">Қорғалған</translation> @@ -5261,7 +5262,6 @@ <translation id="7051943809462976355">Тінтуірді іздеуде…</translation> <translation id="7052237160939977163">Өнімділікті бақылау деректерін жіберу</translation> <translation id="7053983685419859001">Бөгеу</translation> -<translation id="705508001219706572">Осы жерге жылдам оралу үшін <ph name="APP_NAME" /> қолданбасын орнатыңыз.</translation> <translation id="7055152154916055070">Бағыттау функциясына тыйым салынды.</translation> <translation id="7055451306017383754">Бөлісуден бас тарту мүмкін емес, себебі бұл қалтаны қолданба пайдаланып жатыр. Parallels Desktop өшкен соң ғана, қалтаны бөлісуден бас тартылады.</translation> <translation id="7056526158851679338">&Құрылғыларды тексеру</translation> @@ -7162,6 +7162,7 @@ <translation id="9209563766569767417">Linux контейнерінің реттелуі тексерілуде</translation> <translation id="9209689095351280025">Сайттар сізді интернетте қадағалайтын cookie файлдарын пайдалана алмайды.</translation> <translation id="9211177926627870898">Жаңарту қажет</translation> +<translation id="9211490828691860325">Барлық жұмыс үстелдері</translation> <translation id="9214520840402538427">Орнату уақыты атрибуттарын жұмысқа дайындау мерзімі бітті. Қолдау көрсету өкіліне хабарласыңыз.</translation> <translation id="9214695392875603905">Маффин</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" қосылды</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index be40ffc..63fad17 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">ស៊ីមកាតជាប់សោ</translation> <translation id="2618797463720777311">រៀបចំការចែករំលែកនៅជិត</translation> <translation id="2619761439309613843">ការផ្ទុកឡើងវិញប្រចាំថ្ងៃ</translation> +<translation id="2620215283731032047">មិនអាចទាញយក <ph name="FILE_NAME" /> ដោយសុវត្ថិភាពបានទេ។</translation> <translation id="2620436844016719705">ប្រព័ន្ធ</translation> <translation id="262154978979441594">បង្ហាត់គំរូសំឡេង Google ជំនួយការ</translation> <translation id="2621713457727696555">មានសុវត្ថិភាព</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">កំពុងស្វែងរកកណ្តុរ...</translation> <translation id="7052237160939977163">ផ្ញើទិន្នន័យតាមដានប្រតិបត្តិការ</translation> <translation id="7053983685419859001">ទប់ស្កាត់</translation> -<translation id="705508001219706572">ដើម្បីត្រឡប់មកទីនេះវិញឱ្យបានរហ័ស សូមដំឡើង <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">បានទប់ស្កាត់ការបញ្ជូនបន្ត៖</translation> <translation id="7055451306017383754">មិនអាចឈប់ចែករំលែកបានទេ ដោយសារកម្មវិធីកំពុងប្រើថតនេះ។ ថតនេះនឹងឈប់ចែករំលែក នៅពេល Parallels Desktop បិទលើកក្រោយ។</translation> <translation id="7056526158851679338">តាមដានឧបករណ៍</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">កំពុងពិនិត្យមើលការរៀបចំទម្រង់ផ្ទុក Linux</translation> <translation id="9209689095351280025">គេហទំព័រមិនអាចប្រើខូគី ដែលតាមដានអ្នកនៅលើអ៊ីនធឺណិតបានទេ</translation> <translation id="9211177926627870898">តម្រូវឱ្យដំឡើងកំណែ</translation> +<translation id="9211490828691860325">តុនិម្មិតទាំងអស់</translation> <translation id="9214520840402538427">អូ! ការចាប់ផ្តើម installation-time attributes បានអស់ពេល។ សូមទំនាក់ទំនងជំនួយការរបស់អ្នក។</translation> <translation id="9214695392875603905">នំខេកតូច</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" បានបន្ថែម</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 6763296..1f6dc2b2 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="2618797463720777311">Nearby ಶೇರ್ ಸೆಟಪ್ ಮಾಡಿ</translation> <translation id="2619761439309613843">ಪ್ರತಿದಿನವು ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="2620436844016719705">ಸಿಸ್ಟಂ</translation> <translation id="262154978979441594">Google Assistant ಗೆ ವಾಯ್ಸ್ ಮಾಡೆಲ್ನ ತರಬೇತಿ ನೀಡಿ</translation> <translation id="2621713457727696555">ಸುರಕ್ಷಿತವಾಗಿದೆ</translation> @@ -5269,7 +5270,6 @@ <translation id="7051943809462976355">ಮೌಸ್ಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ...</translation> <translation id="7052237160939977163">ಕಾರ್ಯಕ್ಷಮತೆ ಟ್ರೇಸ್ ಡೇಟಾ ಕಳುಹಿಸಿ</translation> <translation id="7053983685419859001">ನಿರ್ಬಂಧಿಸು</translation> -<translation id="705508001219706572">ಇಲ್ಲಿಗೆ ತ್ವರಿತವಾಗಿ ಮರಳಲು, <ph name="APP_NAME" /> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ</translation> <translation id="7055152154916055070">ಮರುನಿರ್ದೇಶಿಸುವಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ:</translation> <translation id="7055451306017383754">ಒಂದು ಅಪ್ಲಿಕೇಶನ್, ಈ ಫೋಲ್ಡರ್ ಅನ್ನು ಬಳಸುತ್ತಿರುವ ಕಾರಣ, ಅದರ ಹಂಚಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಲಿಲ್ಲ. ಮುಂದಿನ ಸಲ Parallels Desktop ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಿದಾಗ, ಈ ಫೋಲ್ಡರ್ ಹಂಚಿಕೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="7056526158851679338">&ಸಾಧನಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> @@ -7169,6 +7169,7 @@ <translation id="9209563766569767417">Linux ಕಂಟೇನರ್ ಸೆಟಪ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="9209689095351280025">ವೆಬ್ನಾದ್ಯಂತ ನಿಮ್ಮನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡುವ ಕುಕೀಗಳನ್ನು ವೆಬ್ಸೈಟ್ಗಳು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="9211177926627870898">ಅಪ್ಡೇಟ್ ಅಗತ್ಯವಿದೆ</translation> +<translation id="9211490828691860325">ಎಲ್ಲಾ ಡೆಸ್ಕ್ಗಳು</translation> <translation id="9214520840402538427">ಓಹ್! ಇನ್ಸ್ಟಾಲೇಶನ್-ಟೈಮ್-ಆ್ಯಟ್ರಿಬ್ಯೂಷನ್ ಅವಧಿ ಮುಗಿದಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬೆಂಬಲ ಪ್ರತಿನಿಧಿಯನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ಸೇರಿಸಲಾಗಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index badba7d..5eb37272 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">SIM 카드가 잠겨 있습니다.</translation> <translation id="2618797463720777311">Nearby Share 설정</translation> <translation id="2619761439309613843">매일 새로고침</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> 파일은 안전하게 다운로드할 수 없습니다.</translation> <translation id="2620436844016719705">시스템</translation> <translation id="262154978979441594">Google 어시스턴트 음성 모델 학습시키기</translation> <translation id="2621713457727696555">보안</translation> @@ -5261,7 +5262,6 @@ <translation id="7051943809462976355">마우스 검색 중...</translation> <translation id="7052237160939977163">성능 추적 데이터 전송</translation> <translation id="7053983685419859001">차단</translation> -<translation id="705508001219706572">이곳으로 빠르게 이동하려면 <ph name="APP_NAME" /> 앱을 설치하세요.</translation> <translation id="7055152154916055070">다음 주소로의 리디렉션이 차단됨:</translation> <translation id="7055451306017383754">다른 애플리케이션에서 폴더를 사용 중이므로 공유를 취소할 수 없습니다. 다음번에 Parallels Desktop이 종료되면 폴더 공유가 취소됩니다.</translation> <translation id="7056526158851679338">기기 검사(&I)</translation> @@ -7161,6 +7161,7 @@ <translation id="9209563766569767417">Linux 컨테이너 설정 확인 중</translation> <translation id="9209689095351280025">사이트가 웹 전반에서 사용자를 추적하는 쿠키를 사용할 수 없습니다.</translation> <translation id="9211177926627870898">업데이트 필요</translation> +<translation id="9211490828691860325">모든 데스크</translation> <translation id="9214520840402538427">설치 시간 속성의 시작 시간이 초과되었습니다. 지원 담당자에게 문의하시기 바랍니다.</translation> <translation id="9214695392875603905">컵케이크</translation> <translation id="9215293857209265904">'<ph name="EXTENSION_NAME" />'이(가) 추가됨</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index fe40b1d..b75f635f 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">SIM-карта кулпуланган</translation> <translation id="2618797463720777311">Nearby Share функциясын жөндөө</translation> <translation id="2619761439309613843">Күн сайын жаңыртуу</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> файлын коопсуз жүктөп алууга болбойт.</translation> <translation id="2620436844016719705">Тутум</translation> <translation id="262154978979441594">Google Жардамчыга үнүңүздүн үлгүсүн үйрөтүңүз</translation> <translation id="2621713457727696555">Корголгон</translation> @@ -5264,7 +5265,6 @@ <translation id="7051943809462976355">Чычкан изделүүдө…</translation> <translation id="7052237160939977163">Иштин майнаптуулугун жогорулатуу дайындарын жөнөтүү</translation> <translation id="7053983685419859001">Бөгөттөө</translation> -<translation id="705508001219706572">Бул баракты тезирээк ачуу үчүн <ph name="APP_NAME" /> колдонмосун орнотуңуз</translation> <translation id="7055152154916055070">Багыттоо бөгөттөлгөн:</translation> <translation id="7055451306017383754">Колдонмо бул папканы пайдаланып жаткандыктан, бөлүшүү токтотулган жок. Parallels Desktop эмки жолу өчүрүлгөндө, бул папканы бөлүшүү токтотулат.</translation> <translation id="7056526158851679338">Түзмөктөрдү &текшерүү</translation> @@ -7165,6 +7165,7 @@ <translation id="9209563766569767417">Linux контейнеринин жөндөөсү текшерилүүдө</translation> <translation id="9209689095351280025">Сайттар Интернеттеги аракеттериңизге көз салган cookie файлдарын колдонушпайт</translation> <translation id="9211177926627870898">Жаңыртуу талап кылынат</translation> +<translation id="9211490828691860325">Бардык иш такталар</translation> <translation id="9214520840402538427">Ой! Орнотуу убакыт аттрибуттарынын демилгеленишин күтүү убакыты аяктады. Кардарларды тейлеген өкүлүңүзгө кайрылыңыз.</translation> <translation id="9214695392875603905">Кекс</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" кошулду</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 1cad49b..9d5fc41 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">ແຜ່ນ SIM ລັອກແລ້ວ</translation> <translation id="2618797463720777311">ຕັ້ງຄ່າການແບ່ງປັນໃກ້ຄຽງ</translation> <translation id="2619761439309613843">ການໂຫຼດຂໍ້ມູນໃໝ່ປະຈຳວັນ</translation> +<translation id="2620215283731032047">ບໍ່ສາມາດດາວໂຫຼດ <ph name="FILE_NAME" /> ໄດ້ຢ່າງປອດໄພ.</translation> <translation id="2620436844016719705">ລະບົບ</translation> <translation id="262154978979441594">ຝຶກຮູບແບບສຽງໃຫ້ຜູ້ຊ່ວຍ Google</translation> <translation id="2621713457727696555">ຮັກສາຄວາມປອດໄພແລ້ວ</translation> @@ -5262,7 +5263,6 @@ <translation id="7051943809462976355">ການຄົ້ນຫາເມົາສ໌...</translation> <translation id="7052237160939977163">ສົ່ງຂໍ້ມູນຕິດຕາມການປະຕິບັດ</translation> <translation id="7053983685419859001">ບລັອກ</translation> -<translation id="705508001219706572">ເພື່ອກັບຄືນບ່ອນນີ້ໄດ້ຢ່າງວ່ອງໄວ, ກະລຸນາຕິດຕັ້ງ <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">ບລັອກການປ່ຽນເສັ້ນທາງແລ້ວ:</translation> <translation id="7055451306017383754">ບໍ່ສາມາດເຊົາແບ່ງປັນໄດ້ເພາະວ່າແອັບພລິເຄຊັນກຳລັງໃຊ້ໂຟນເດີນີ້ຢູ່. ລະບົບຈະເຊົາແບ່ງປັນໂຟນເດີເມື່ອປິດ Parallels Desktop ໃນຄັ້ງຕໍ່ໄປ.</translation> <translation id="7056526158851679338">ກວດກາອຸປະກອນ</translation> @@ -7162,6 +7162,7 @@ <translation id="9209563766569767417">ກຳລັງກວດການຕັ້ງຄ່າກ່ອງບັນຈຸ Linux</translation> <translation id="9209689095351280025">ເວັບໄຊບໍ່ສາມາດໃຊ້ຄຸກກີ້ທີ່ຕິດຕາມທ່ານໃນທົ່ວເວັບໄຊໄດ້</translation> <translation id="9211177926627870898">ຈຳເປັນຕ້ອງອັບເດດ</translation> +<translation id="9211490828691860325">ໂຕະທັງໝົດ</translation> <translation id="9214520840402538427">ອຸ້ຍ! ການລິເລີ່ມຄຸນລັກສະນະເວລາການຕິດຕັ້ງໝົດເວລາແລ້ວ. ກະລຸນາຕິດຕໍ່ຕົວແທນຊ່ວຍເຫຼືອຂອງທ່ານ.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">ເພີ່ມ "<ph name="EXTENSION_NAME" />" ແລ້ວ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 0dc72a4..4f4a1ac 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -804,6 +804,7 @@ <translation id="1867780286110144690">„<ph name="PRODUCT_NAME" />“ pasirengusi baigti diegimą</translation> <translation id="1868193363684582383">„Ok Google“</translation> <translation id="1868553836791672080">Naudojant „Chromium“ slaptažodžio patikra nepasiekiama</translation> +<translation id="1869433484041798909">Žymės mygtukas</translation> <translation id="187145082678092583">Mažiau programų</translation> <translation id="1871534214638631766">Rodyti susijusią informaciją, kai turinys spustelėjamas dešiniuoju klavišu arba ilgai paspaudžiamas</translation> <translation id="1871615898038944731">„<ph name="DEVICE_TYPE" />“ atnaujintas</translation> @@ -835,6 +836,7 @@ <translation id="1900305421498694955">Programose iš „Google Play“ gali būti prašoma leidimo pasiekti visas failų sistemos funkcijas, kad būtų galima nuskaityti ir įrašyti failus išoriniuose saugyklos įrenginiuose. Įrenginyje sukurtus failus ir aplankus gali matyti visi, naudojantys išorinį diską. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Pasirinkti &viską</translation> <translation id="1901396183631570154">„Chrome“ nepavyko išsaugoti šių slaptažodžių „Google“ paskyroje. Vis tiek galite juos išsaugoti šiame įrenginyje.</translation> +<translation id="1903995858055162096">Ne jūsų įrenginys? Naudokite <ph name="BEGIN_LINK" />svečio režimą<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">„Chromebook“ įrenginio pavadinimas</translation> <translation id="1906181697255754968">Paprastai svetainės pasiekia failus ir aplankus jūsų įrenginyje vykdydamos tokias funkcijas kaip automatinis darbo išsaugojimas</translation> <translation id="1906828677882361942">Neleisti svetainėms pasiekti nuosekliųjų prievadų</translation> @@ -1452,6 +1454,7 @@ <translation id="2617342710774726426">SIM kortelė užrakinta</translation> <translation id="2618797463720777311">Bendrinimo netoliese nustatymas</translation> <translation id="2619761439309613843">Atnaujinimas per dieną</translation> +<translation id="2620215283731032047">Negalima saugiai atsisiųsti failo „<ph name="FILE_NAME" />“.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Išmokyti „Google“ padėjėjo balso modelį</translation> <translation id="2621713457727696555">Apsaugota</translation> @@ -5267,7 +5270,6 @@ <translation id="7051943809462976355">Ieškoma pelės...</translation> <translation id="7052237160939977163">Siųsti našumo stebėjimo duomenis</translation> <translation id="7053983685419859001">Blokuoti</translation> -<translation id="705508001219706572">Jei norite sparčiai čia grįžti, įdiekite „<ph name="APP_NAME" />“</translation> <translation id="7055152154916055070">Peradresavimas užblokuotas:</translation> <translation id="7055451306017383754">Nepavyko panaikinti bendrinimo, nes programa naudoja šį aplanką. Aplankas bus nebebendrinamas, kai kitą kartą išjungsite „Parallels Desktop“.</translation> <translation id="7056526158851679338">&Tikrinti įrenginius</translation> @@ -5440,6 +5442,7 @@ <translation id="7251346854160851420">Numatytasis ekrano fonas</translation> <translation id="7253521419891527137">&Sužinokite daugiau</translation> <translation id="7254951428499890870">Ar tikrai norite paleisti „<ph name="APP_NAME" />“ diagnostikos režimu?</translation> +<translation id="725497546968438223">Žymių aplanko mygtukas</translation> <translation id="7255002516883565667">Šiuo metu turite vieną kortelę, kurią galima naudoti tik šiuo įrenginiu</translation> <translation id="7255935316994522020">Taikyti</translation> <translation id="7256069762010468647">Svetainė naudoja jūsų fotoaparatą</translation> @@ -5701,6 +5704,7 @@ <translation id="7564847347806291057">Baigti procesą</translation> <translation id="7566118625369982896">„Play“ programų nuorodų tvarkymas</translation> <translation id="756809126120519699">Išvalyti „Chrome“ duomenys</translation> +<translation id="756876171895853918">Tinkinti pseudoportretą</translation> <translation id="7568790562536448087">Atnaujinama</translation> <translation id="7569983096843329377">Juoda</translation> <translation id="7571643774869182231">Saugykloje nepakanka vietos, kad būtų galima atnaujinti</translation> @@ -7170,6 +7174,7 @@ <translation id="9209563766569767417">Tikrinama „Linux“ sudėtinio rodinio sąranka</translation> <translation id="9209689095351280025">Svetainės negali naudoti slapukų, stebinčių jus žiniatinklyje</translation> <translation id="9211177926627870898">Būtina atnaujinti</translation> +<translation id="9211490828691860325">Visi darbalaukiai</translation> <translation id="9214520840402538427">Oi! Diegimo trukmės atributų iniciacijos laikas baigėsi. Susisiekite su palaikymo komandos atstovu.</translation> <translation id="9214695392875603905">Keksinis pyragaitis</translation> <translation id="9215293857209265904">Pridėtas „<ph name="EXTENSION_NAME" />“</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 6686e3a..986a2be 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1453,6 +1453,7 @@ <translation id="2617342710774726426">SIM karte ir bloķēta.</translation> <translation id="2618797463720777311">Kopīgošanas tuvumā iestatīšana</translation> <translation id="2619761439309613843">Nomainīt katru dienu</translation> +<translation id="2620215283731032047">Failu “<ph name="FILE_NAME" />” nevar droši lejupielādēt.</translation> <translation id="2620436844016719705">Sistēma</translation> <translation id="262154978979441594">Google asistenta balss modeļa izveide</translation> <translation id="2621713457727696555">Aizsargāts</translation> @@ -5267,7 +5268,6 @@ <translation id="7051943809462976355">Notiek peles meklēšana...</translation> <translation id="7052237160939977163">Sūtīt veiktspējas izsekošanas datus</translation> <translation id="7053983685419859001">Bloķēt</translation> -<translation id="705508001219706572">Lai varētu ātri atgriezties šeit, instalējiet lietotni <ph name="APP_NAME" />.</translation> <translation id="7055152154916055070">Novirzīšana ir bloķēta:</translation> <translation id="7055451306017383754">Nevarēja atsaukt kopīgošanu, jo šo mapi izmanto lietojumprogramma. Mapes kopīgošana tiks atsaukta nākamajā reizē, kad tiks pārtraukta Parallels Desktop darbība.</translation> <translation id="7056526158851679338">&Pārbaudīt ierīces</translation> @@ -7170,6 +7170,7 @@ <translation id="9209563766569767417">Linux konteinera iestatījumu pārbaude</translation> <translation id="9209689095351280025">Vietnēs nevar izmantot sīkfailus, kas izseko jūsu darbības tīmeklī</translation> <translation id="9211177926627870898">Jāveic atjaunināšana</translation> +<translation id="9211490828691860325">Visas darbvietas</translation> <translation id="9214520840402538427">Instalācijas laika atribūtu inicializēšanā diemžēl iestājās noildze. Lūdzu, sazinieties ar savu atbalsta pārstāvi.</translation> <translation id="9214695392875603905">Glazūrkēkss</translation> <translation id="9215293857209265904">Ir pievienots paplašinājums <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 60acb1b..acdc3d5 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -802,6 +802,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> е подготвен да ја комплетира инсталацијата</translation> <translation id="1868193363684582383">„Ok Google“</translation> <translation id="1868553836791672080">Проверката на лозинки не е достапна во Chromium</translation> +<translation id="1869433484041798909">Копче за обележувач</translation> <translation id="187145082678092583">Помалку апликации</translation> <translation id="1871534214638631766">Прикажувај поврзани информации кога ќе кликнам со десно копче или кога долго ќе притиснам на содржини</translation> <translation id="1871615898038944731">Вашиот <ph name="DEVICE_TYPE" /> е ажуриран</translation> @@ -833,6 +834,7 @@ <translation id="1900305421498694955">Апликациите од Google Play може да бараат целосен пристап до системот на датотеки за да читаат и да запишуваат датотеки на надворешни уреди за складирање. Датотеките и папките создадени на уредот се видливи за сите што го користат надворешниот диск. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Избери ги &сите</translation> <translation id="1901396183631570154">Chrome не може да ги зачува лозинкиве во сметката на Google. Сѐ уште може да ги зачувате на уредов.</translation> +<translation id="1903995858055162096">Ова не е вашиот уред? Користете <ph name="BEGIN_LINK" />режим на гостин<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Име на уредот Chromebook</translation> <translation id="1906181697255754968">Сајтовите обично пристапуваат до датотеките и папките на вашиот уред за функции како што е автоматското зачувување на вашата работа</translation> <translation id="1906828677882361942">Не дозволувај ниту еден сајт да пристапува до сериските порти</translation> @@ -1450,6 +1452,7 @@ <translation id="2617342710774726426">SIM-картичката е заклучена</translation> <translation id="2618797463720777311">Поставување „Споделување во близина“</translation> <translation id="2619761439309613843">Дневно освежување</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> не може да се преземе безбедно.</translation> <translation id="2620436844016719705">Систем</translation> <translation id="262154978979441594">Вежбајте го гласовниот модел на „Помошникот на Google“</translation> <translation id="2621713457727696555">Заштитена</translation> @@ -5263,7 +5266,6 @@ <translation id="7051943809462976355">Се бара глушец…</translation> <translation id="7052237160939977163">Испрати податоци во траги за учинок</translation> <translation id="7053983685419859001">Блокирај</translation> -<translation id="705508001219706572">За брз пристап дотука, инсталирајте <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Пренасочувањето е блокирано:</translation> <translation id="7055451306017383754">Не може да се откаже споделувањето бидејќи некоја апликација ја користи папкава. Споделувањето на папкава ќе се откаже следниот пат кога ќе се исклучи Parallels Desktop.</translation> <translation id="7056526158851679338">&Провери уреди</translation> @@ -5436,6 +5438,7 @@ <translation id="7251346854160851420">Стандарден тапет</translation> <translation id="7253521419891527137">&Дознај повеќе</translation> <translation id="7254951428499890870">Дали сте сигурни дека сакате да стартувате „<ph name="APP_NAME" />“ во дијагностички режим?</translation> +<translation id="725497546968438223">Копче за папка со обележувачи</translation> <translation id="7255002516883565667">Во моментов имате една картичка што може да се користи само на овој уред</translation> <translation id="7255935316994522020">Примени</translation> <translation id="7256069762010468647">Сајтот ја користи камерата</translation> @@ -5697,6 +5700,7 @@ <translation id="7564847347806291057">Заврши процес</translation> <translation id="7566118625369982896">Управувајте со линкови до апликации на Play</translation> <translation id="756809126120519699">Податоците на Chrome се исчистени</translation> +<translation id="756876171895853918">Приспособете го аватарот</translation> <translation id="7568790562536448087">Се ажурира</translation> <translation id="7569983096843329377">Црна</translation> <translation id="7571643774869182231">Нема доволно простор за ажурирање</translation> @@ -7166,6 +7170,7 @@ <translation id="9209563766569767417">Се проверува поставувањето на контејнерот за Linux</translation> <translation id="9209689095351280025">Сајтовите не можe да користат колачиња што ве следат на интернет</translation> <translation id="9211177926627870898">Потребно е ажурирање</translation> +<translation id="9211490828691860325">Сите работни површини</translation> <translation id="9214520840402538427">Упс! Иницијализацијата на атрибутите за време на инсталација истече. Контактирајте со вашиот претставник за поддршка.</translation> <translation id="9214695392875603905">Тортичка</translation> <translation id="9215293857209265904">Додадена е „<ph name="EXTENSION_NAME" />“</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index fe3d803e..9d783051f 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -798,6 +798,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> നിങ്ങളുടെ ഇന്സ്റ്റാളേഷന് പൂര്ത്തിയാക്കുന്നതിന് തയ്യാറാണ്</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">പാസ്വേഡ് പരിശോധന Chromium-ൽ ലഭ്യമല്ല</translation> +<translation id="1869433484041798909">ബുക്ക്മാർക്ക് ബട്ടൺ</translation> <translation id="187145082678092583">കുറച്ച് ആപ്പുകൾ</translation> <translation id="1871534214638631766">ഉള്ളടക്കത്തിൽ വലത്-ക്ലിക്ക് ചെയ്യുമ്പോഴോ ദീർഘനേരം അമർത്തുമ്പോഴോ അതിന്റെ അനുബന്ധ വിവരങ്ങൾ കാണിക്കുക</translation> <translation id="1871615898038944731">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> അപ്ടുഡേറ്റാണ്</translation> @@ -829,6 +830,7 @@ <translation id="1900305421498694955">ബാഹ്യ സ്റ്റോറേജ് ഉപകരണങ്ങളിലെ ഫയലുകൾ വായിക്കാനും എഴുതാനും Google Play-ൽ നിന്നുള്ള ആപ്പുകൾക്ക് പൂർണ്ണ ഫയൽ സിസ്റ്റം ആക്സസ് ആവശ്യമായേക്കാം. ഉപകരണത്തിൽ സൃഷ്ടിച്ച ഫയലുകളും ഫോൾഡറുകളും ബാഹ്യ ഡ്രൈവ് ഉപയോഗിക്കുന്ന ആർക്കും ദൃശ്യമാകും. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="1901303067676059328">എല്ലാം &തിരഞ്ഞെടുക്കൂ</translation> <translation id="1901396183631570154">Chrome-ന് ഈ പാസ്വേഡുകൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കാനായില്ല. എങ്കിലും അവ നിങ്ങൾക്ക് ഈ ഉപകരണത്തിൽ തുടർന്നും സൂക്ഷിക്കാനാകും.</translation> +<translation id="1903995858055162096">നിങ്ങളുടെ ഉപകരണമല്ലേ? <ph name="BEGIN_LINK" />അതിഥി മോഡ്<ph name="END_LINK" /> ഉപയോഗിക്കുക.</translation> <translation id="1905375423839394163">Chromebook ഉപകരണ നാമം</translation> <translation id="1906181697255754968">നിങ്ങളുടെ വർക്ക് സ്വയമേവ സംരക്ഷിക്കുന്നത് പോലുള്ള ഫീച്ചറുകൾക്ക്, സൈറ്റുകൾ സാധാരണയായി നിങ്ങളുടെ ഉപകരണത്തിലെ ഫയലുകളും ഫോൾഡറുകളും ആക്സസ് ചെയ്യാറുണ്ട്</translation> <translation id="1906828677882361942">സീരിയൽ പോർട്ടുകൾ ആക്സസ് ചെയ്യാൻ ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation> @@ -1446,6 +1448,7 @@ <translation id="2617342710774726426">സിം കാർഡ് ലോക്കുചെയ്തു</translation> <translation id="2618797463720777311">സമീപമുള്ള പങ്കിടൽ സജ്ജീകരിക്കുക</translation> <translation id="2619761439309613843">ദിവസവുമുള്ള പുതുക്കൽ</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> സുരക്ഷിതമായി ഡൗൺലോഡ് ചെയ്യാനാവില്ല.</translation> <translation id="2620436844016719705">സിസ്റ്റം</translation> <translation id="262154978979441594">Google Assistant ശബ്ദ മോഡലിനെ പരിശീലിപ്പിക്കുക</translation> <translation id="2621713457727696555">സുരക്ഷിതമാക്കി</translation> @@ -5261,7 +5264,6 @@ <translation id="7051943809462976355">മൗസിനായി തിരയുന്നു...</translation> <translation id="7052237160939977163">പ്രകടന ട്രെയിസ് ഡാറ്റ അയയ്ക്കുക</translation> <translation id="7053983685419859001">തടയുക</translation> -<translation id="705508001219706572">ഇവിടേക്ക് വേഗത്തിൽ മടങ്ങിയെത്താൻ, <ph name="APP_NAME" /> ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="7055152154916055070">റീഡയറക്റ്റ് ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7055451306017383754">ഒരു ആപ്പ് ഈ ഫോൾഡർ ഉപയോഗിക്കുന്നതിനാൽ പങ്കിടൽ മാറ്റാനായില്ല. Parallels Desktop അടുത്ത തവണ ഷട്ട് ഡൗൺ ചെയ്യുമ്പോൾ ഫോൾഡർ പങ്കിടൽ മാറ്റും.</translation> <translation id="7056526158851679338">&ഉപകരണങ്ങൾ പരിശോധിക്കുക</translation> @@ -5434,6 +5436,7 @@ <translation id="7251346854160851420">ഡിഫോള്ട്ട് വാള്പേപ്പര്</translation> <translation id="7253521419891527137">&കൂടുതലറിയുക</translation> <translation id="7254951428499890870">നിങ്ങൾക്ക് "<ph name="APP_NAME" />" ഡയഗണോസ്റ്റിക് മോഡിൽ ലോഞ്ച് ചെയ്യണമെന്ന് തീർച്ചയാണോ?</translation> +<translation id="725497546968438223">ബുക്ക്മാർക്ക് ഫോൾഡർ ബട്ടൺ</translation> <translation id="7255002516883565667">ഇപ്പോൾ, ഈ ഉപകരണത്തിൽ മാത്രം ഉപയോഗിക്കാനാവുന്ന കാർഡ് നിങ്ങൾക്കുണ്ട്</translation> <translation id="7255935316994522020">ബാധകമാക്കുക</translation> <translation id="7256069762010468647">സൈറ്റ് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation> @@ -5695,6 +5698,7 @@ <translation id="7564847347806291057">പ്രക്രിയയുടെ അവസാനം</translation> <translation id="7566118625369982896">Play ആപ്പ് ലിങ്കുകൾ നിയന്ത്രിക്കുക</translation> <translation id="756809126120519699">Chrome ഡാറ്റ മായ്ച്ചു</translation> +<translation id="756876171895853918">അവതാർ ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="7568790562536448087">അപ്ഡേറ്റുചെയ്യുന്നു</translation> <translation id="7569983096843329377">കറുപ്പ്</translation> <translation id="7571643774869182231">അപ്ഡേറ്റിന് ആവശ്യമായ സ്റ്റോറേജില്ല</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index aca22c9b..5bfd6643 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1446,6 +1446,7 @@ <translation id="2617342710774726426">SIM карт түгжигдсэн</translation> <translation id="2618797463720777311">Ойролцоо хуваалцах онцлогийг тохируулах</translation> <translation id="2619761439309613843">Өдөр тутам сэргээх</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" />-г аюулгүй татах боломжгүй.</translation> <translation id="2620436844016719705">Систем</translation> <translation id="262154978979441594">Google Туслахын дуу хоолойн загварыг сургах</translation> <translation id="2621713457727696555">Хамгаалалттай</translation> @@ -5258,7 +5259,6 @@ <translation id="7051943809462976355">Компьютерийн хулганыг хайж байна ...</translation> <translation id="7052237160939977163">Үйлдлийн явцын өгөгдлийг илгээх</translation> <translation id="7053983685419859001">Блоклох</translation> -<translation id="705508001219706572">Энд шуурхай буцаж ирэхийн тулд <ph name="APP_NAME" />-г суулгана уу</translation> <translation id="7055152154916055070">Дахин чиглүүлэлтийг блоклосон:</translation> <translation id="7055451306017383754">Энэ фолдерыг аппликэйшн ашиглаж байгаа тул хуваалцсаныг болиулж чадсангүй. Parallels дэлгэцийг дараагийн удаа унтраах үед фолдерын хуваалцсаныг болиулна.</translation> <translation id="7056526158851679338">& Төхөөрөмжүүдийг шалгах</translation> @@ -7154,6 +7154,7 @@ <translation id="9209563766569767417">Linux контейнерын тохируулгыг шалгаж байна</translation> <translation id="9209689095351280025">Сайтууд нь таныг веб дээр хянадаг күүкиг ашиглах боломжгүй байна</translation> <translation id="9211177926627870898">Шинэчлэх шаардлагатай</translation> +<translation id="9211490828691860325">Бүх дэлгэц</translation> <translation id="9214520840402538427">Програм суурьлуулах атрибут эхлэх цаг хэтэрхий удаан байна. Тусламжийн төлөөлөгчдөө хандана уу.</translation> <translation id="9214695392875603905">Жижиг кекс</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" нэмэгдсэн</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 37ebfd64..e5ca1ec7 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">सिम कार्ड लॉक केले आहे</translation> <translation id="2618797463720777311">Nearby सह शेअरिंग सेट करा</translation> <translation id="2619761439309613843">दैनिक रिफ्रेश</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> सुरक्षितपणे डाउनलोड केली जाऊ शकत नाही.</translation> <translation id="2620436844016719705">सिस्टम</translation> <translation id="262154978979441594">Google Assistant व्हॉइस मॉडेलला प्रशिक्षण द्या</translation> <translation id="2621713457727696555">सुरक्षित</translation> @@ -5261,7 +5262,6 @@ <translation id="7051943809462976355">माउसचा शोध घेत आहे...</translation> <translation id="7052237160939977163">कार्यप्रदर्शन ट्रेस डेटा पाठवा</translation> <translation id="7053983685419859001">अवरोधित करा</translation> -<translation id="705508001219706572">येथे झटपट परत येण्यासाठी, <ph name="APP_NAME" />इंस्टॉल करा</translation> <translation id="7055152154916055070">रीडिरेक्ट ब्लॉक केले:</translation> <translation id="7055451306017383754">एक अॅप्लिकेशन हे फोल्डर वापरत असल्यामुळे ते अनशेअर करता आले नाही. पुढे Parallels Desktop बंद केल्यावर फोल्डर अनशेअर केले जाईल.</translation> <translation id="7056526158851679338">&निरीक्षण डिव्हाइसेस</translation> @@ -7160,6 +7160,7 @@ <translation id="9209563766569767417">Linux कंटेनर सेटअप तपासत आहे</translation> <translation id="9209689095351280025">साइट संपूर्ण वेबवर तुमचा माग ठेवणाऱ्या कुकी वापरू शकत नाहीत</translation> <translation id="9211177926627870898">अपडेट आवश्यक</translation> +<translation id="9211490828691860325">सर्व डेस्क</translation> <translation id="9214520840402538427">अरेरे! स्थापना-वेळ विशेषतांचे इंस्टॉलेशन कालबाह्य झाले. कृपया तुमच्या सपोर्ट प्रतिनिधीशी संपर्क साधा.</translation> <translation id="9214695392875603905">कपकेक</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" जोडले</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 4d64236a..380e44d3 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">Kad SIM dikunci</translation> <translation id="2618797463720777311">Sediakan Kongsi Berdekatan</translation> <translation id="2619761439309613843">Muat Semula Harian</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> tidak dapat dimuat turun dengan selamat.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Latih model suara Google Assistant</translation> <translation id="2621713457727696555">Selamat</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Mencari tetikus...</translation> <translation id="7052237160939977163">Hantar data surih prestasi</translation> <translation id="7053983685419859001">Sekat</translation> -<translation id="705508001219706572">Untuk kembali ke sini dengan cepat, pasang <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Ubah hala disekat:</translation> <translation id="7055451306017383754">Tidak dapat menyahkongsi kerana terdapat aplikasi yang menggunakan folder ini. Folder ini akan dinyahkongsi apabila Parallels Desktop ditutup selepas ini.</translation> <translation id="7056526158851679338">&Periksa Peranti</translation> @@ -7168,6 +7168,7 @@ <translation id="9209563766569767417">Menyemak persediaan bekas Linux</translation> <translation id="9209689095351280025">Tapak tidak dapat menggunakan kuki untuk menjejaki anda merentas web</translation> <translation id="9211177926627870898">Kemas kini diperlukan</translation> +<translation id="9211490828691860325">Semua meja</translation> <translation id="9214520840402538427">Alamak! Pemulaan sifat masa pemasangan telah tamat masa. Sila hubungi wakil sokongan anda.</translation> <translation id="9214695392875603905">Kek cawan</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ditambah</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index c61e0e9b..66d5f25b 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">ဆင်းမ်ကဒ် လော့ခ်ကျနေပါသည်</translation> <translation id="2618797463720777311">'အနီးတစ်ဝိုက် မျှဝေခြင်း' ကို စနစ်ထည့်သွင်းခြင်း</translation> <translation id="2619761439309613843">နေ့စဉ် ပြန်လည်စတင်ရန်</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ကို လုံခြုံစွာ ဒေါင်းလုဒ်လုပ်၍မရပါ။</translation> <translation id="2620436844016719705">စနစ်</translation> <translation id="262154978979441594">Google Assistant အသံ နမူနာ လေ့ကျင့်ရန်</translation> <translation id="2621713457727696555">လုံခြုံပြီ</translation> @@ -5262,7 +5263,6 @@ <translation id="7051943809462976355">မောက်စ်ရှာနေ...</translation> <translation id="7052237160939977163">စွမ်းဆောင်ရည် လမ်းကြောင်းလိုက်ခြင်း အချက်လက် ပို့</translation> <translation id="7053983685419859001">ပိတ်ဆို့ရန်</translation> -<translation id="705508001219706572">ဤနေရာသို့ အမြန်ပြန်လာရန် <ph name="APP_NAME" /> ကို ထည့်သွင်းပါ</translation> <translation id="7055152154916055070">တစ်ဆင့်ပြန်ညွှန်ခြင်းကို ပိတ်ထားသည်−</translation> <translation id="7055451306017383754">အပလီကေးရှင်းက ဤဖိုင်တွဲကို အသုံးပြုနေသဖြင့် မျှဝေမှု မလုပ်၍မရပါ။ နောင်တွင် Parallels Desktop ပိတ်လိုက်သည့်အခါ ဖိုင်တွဲကို မျှဝေမှု မလုပ်တော့ပါ။</translation> <translation id="7056526158851679338">&ကိရိယာများကို စုံစမ်းရန်</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Linux ကွန်တိန်နာ စနစ်ထည့်သွင်းမှု စစ်ဆေးနေသည်</translation> <translation id="9209689095351280025">ဝဘ်တစ်လျှောက် သင့်အားခြေရာခံသည့် ကွတ်ကီးများကို ဝဘ်ဆိုက်များက အသုံးမပြုနိုင်ပါ</translation> <translation id="9211177926627870898">အပ်ဒိတ်လုပ်ရန် လိုပါသည်</translation> +<translation id="9211490828691860325">မျက်နှာပြင်နေရာအားလုံး</translation> <translation id="9214520840402538427">အူးပ်စ်! တပ်ဆင်ရေး-အချိန် အချင်းလက္ခဏာများ အတွက် သတ်မှတ်ချိန် ကုန်သွားပါပြီ။ ကျေးဇူးပြုပြီး သင့်ကို ကူညီပေးသည့် ကိုယ်စားလှယ်ကို ဆက်သွယ်ပါ။</translation> <translation id="9214695392875603905">ကြက်ဥမုန့်</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ကို ထည့်ပြီး</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 86cc126..1c2f05d 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1445,6 +1445,7 @@ <translation id="2617342710774726426">SIM कार्ड लक गरिएको छ</translation> <translation id="2618797463720777311">नजिकैका यन्त्रसँग सेयर गर्ने सुविधा सेटअप गर्नुहोस्</translation> <translation id="2619761439309613843">दैनिक पुनः ताजा गर्नुहोस्</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> सुरक्षित रूपमा डाउनलोड गर्न सकिएन।</translation> <translation id="2620436844016719705">सिस्टम</translation> <translation id="262154978979441594">Google सहायकको आवाजको मोडेललाई आफ्नो आवाज चिन्न सिकाउनुहोस्</translation> <translation id="2621713457727696555">सुरक्षित पारियो</translation> @@ -5257,7 +5258,6 @@ <translation id="7051943809462976355">माउस खोज्दै...</translation> <translation id="7052237160939977163">प्रदर्शन ट्रेस लगत पठाउनुहोस्</translation> <translation id="7053983685419859001">रोक्नुहोस्</translation> -<translation id="705508001219706572">यही पेजमा छिटोछरितो रूपमा फर्कन <ph name="APP_NAME" /> इन्स्टल गर्नुहोस्</translation> <translation id="7055152154916055070">रिडिरेक्ट नामक सुविधामाथि रोक लगाइयो:</translation> <translation id="7055451306017383754">कुनै एप्लिकेसनले यो फोल्डर प्रयोग गरिरहेका कारण यसलाई अनसेयर गर्न सकिएन। अर्को पटक Parallels Desktop सट डाउन हुँदा यो फोल्डर अनसेयर गरिने छ।</translation> <translation id="7056526158851679338">यन्त्रहरूको &निरीक्षण गर्नुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 01d293a..cadfe1c 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">Simkaart is vergrendeld</translation> <translation id="2618797463720777311">'Dichtbij delen' instellen</translation> <translation id="2619761439309613843">Dagelijks vernieuwen</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> kan niet beveiligd worden gedownload.</translation> <translation id="2620436844016719705">Systeem</translation> <translation id="262154978979441594">Spraakmodel van de Google Assistent trainen</translation> <translation id="2621713457727696555">Beveiligd</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">Muis zoeken...</translation> <translation id="7052237160939977163">Gegevens over het bijhouden van prestaties verzenden</translation> <translation id="7053983685419859001">Blokkeren</translation> -<translation id="705508001219706572">Installeer <ph name="APP_NAME" /> om hier snel terug te keren</translation> <translation id="7055152154916055070">Omleiding geblokkeerd:</translation> <translation id="7055451306017383754">Kan het delen niet opheffen omdat een app deze map gebruikt. Het delen van de map wordt opgeheven als Parallels Desktop weer wordt uitgeschakeld.</translation> <translation id="7056526158851679338">Apparaten &inspecteren</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">De installatie van de Linux-container wordt gecontroleerd</translation> <translation id="9209689095351280025">Sites kunnen geen cookies gebruiken die je volgen op internet</translation> <translation id="9211177926627870898">Update vereist</translation> +<translation id="9211490828691860325">Alle bureaus</translation> <translation id="9214520840402538427">De initialisatie van de kenmerken van de installatietijd is verlopen. Neem contact op met je ondersteuningsmedewerker.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">'<ph name="EXTENSION_NAME" />' toegevoegd</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 029fbdf..91e9aa2 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">SIM-kortet er låst</translation> <translation id="2618797463720777311">Konfigurer nærdeling</translation> <translation id="2619761439309613843">Daglig oppdatering</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> kan ikke lastes ned sikkert.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Tren stemmemodellen for Google-assistenten</translation> <translation id="2621713457727696555">Sikret</translation> @@ -5260,7 +5261,6 @@ <translation id="7051943809462976355">Søker etter musen …</translation> <translation id="7052237160939977163">Send ytelsessporingsdata</translation> <translation id="7053983685419859001">Blokkér</translation> -<translation id="705508001219706572">For å komme raskt tilbake hit, installer <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Viderekoblingen er blokkert:</translation> <translation id="7055451306017383754">Kunne ikke avvise delingen, fordi et program bruker denne mappen. Mappedelingen blir avvist neste gang Parallels Desktop avsluttes.</translation> <translation id="7056526158851679338">&Inspiser enheter</translation> @@ -7162,6 +7162,7 @@ <translation id="9209563766569767417">Sjekker konfigurasjonen av Linux-beholderen</translation> <translation id="9209689095351280025">Nettsteder kan ikke bruke informasjonskapsler som sporer deg på nettet</translation> <translation id="9211177926627870898">Oppdatering kreves</translation> +<translation id="9211490828691860325">Alle skrivebord</translation> <translation id="9214520840402538427">Beklager. Oppstarten av attributtene for installasjonstid er tidsavbrutt. Ta kontakt med brukerstøtterepresentanten din.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">«<ph name="EXTENSION_NAME" />» ble lagt til</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index f9dad404..46e225b4 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1442,6 +1442,7 @@ <translation id="2617342710774726426">SIM କାର୍ଡ ଲକ୍ ହୋଇଯାଇଛି।</translation> <translation id="2618797463720777311">Nearby Share ସେଟ୍ ଅପ୍ କରନ୍ତୁ</translation> <translation id="2619761439309613843">ଦୈନିକ ରିଫ୍ରେଶ୍</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ସୁରକ୍ଷିତ ରୂପେ ଡାଉନ୍ ଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ।</translation> <translation id="2620436844016719705">ସିଷ୍ଟମ୍</translation> <translation id="262154978979441594">Google Assistant ଭଏସ୍ ମୋଡେଲକୁ ତାଲିମ ଦିଅନ୍ତୁ</translation> <translation id="2621713457727696555">ସୁରକ୍ଷିତ</translation> @@ -5257,7 +5258,6 @@ <translation id="7051943809462976355">ମାଉସ୍ ପାଇଁ ଖୋଜୁଛି...</translation> <translation id="7052237160939977163">କାର୍ଯ୍ୟଦକ୍ଷତା ଟ୍ରେସ୍ ଡାଟା ପଠାନ୍ତୁ</translation> <translation id="7053983685419859001">ଅବରୋଧ କରନ୍ତୁ</translation> -<translation id="705508001219706572">ଏଠାକୁ ଶୀଘ୍ର ଫେରିବା ପାଇଁ, <ph name="APP_NAME" /> ଇନଷ୍ଟଲ୍ କରନ୍ତୁ</translation> <translation id="7055152154916055070">ରିଡାଇରେକ୍ଟକୁ ଅବରୋଧ କରାଯାଇଛି:</translation> <translation id="7055451306017383754">ଏକ ଆପ୍ଲିକେସନ୍ ଏହି ଫୋଲ୍ଡରକୁ ବ୍ୟବହାର କରୁଥିବା ଯୋଗୁଁ ଏହାକୁ ସେୟାର୍ କରିବା ବନ୍ଦ କରାଯାଇପାରିଲା ନାହିଁ। ପରବର୍ତ୍ତୀ ସମୟରେ Parallels Desktop ବନ୍ଦ ହେଲେ ଫୋଲ୍ଡରକୁ ସେୟାର୍ କରିବା ବନ୍ଦ ହୋଇଯିବ।</translation> <translation id="7056526158851679338">ଡିଭାଇସ୍ଗୁଡ଼ିକ &ନିରୀକ୍ଷଣ କରନ୍ତୁ</translation> @@ -7154,6 +7154,7 @@ <translation id="9209563766569767417">Linux କଣ୍ଟେନର୍ ସେଟଅପ୍ ଯାଞ୍ଚ କରାଯାଉଛି</translation> <translation id="9209689095351280025">ସାଇଟଗୁଡ଼ିକ ସମଗ୍ର ୱେବରେ ଆପଣଙ୍କୁ ଟ୍ରାକ୍ କରୁଥିବା କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ</translation> <translation id="9211177926627870898">ଅପଡେଟ୍ କରିବା ଦରକାର</translation> +<translation id="9211490828691860325">ସମସ୍ତ ଡେସ୍କ</translation> <translation id="9214520840402538427">ଓହୋ! ଇନ୍ଷ୍ଟଲେସନ୍ ସମୟ ବୈଶିଷ୍ଟ୍ୟର ଇନ୍ଷ୍ଟାଲାଇଜେସନ୍ ସମୟ ଅବଧି ଶେଷ। ଦୟାକରି ଆପଣଙ୍କ ସମର୍ଥକ ପ୍ରତିନିଧିଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</translation> <translation id="9214695392875603905">କପ୍କେକ୍</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ଯୋଗ କରାଗଲା</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 7d6aa01..183d0978 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">ਸਿਮ ਕਾਰਡ ਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation> <translation id="2618797463720777311">'ਨਜ਼ਦੀਕੀ ਸਾਂਝ' ਦਾ ਸੈੱਟਅੱਪ ਕਰੋ</translation> <translation id="2619761439309613843">ਰੋਜ਼ਾਨਾ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> ਨੂੰ ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</translation> <translation id="2620436844016719705">ਸਿਸਟਮ</translation> <translation id="262154978979441594">Google Assistant ਅਵਾਜ਼ੀ ਮਾਡਲ ਨੂੰ ਸਿਖਲਾਈ ਦਿਓ</translation> <translation id="2621713457727696555">ਸੁਰੱਖਿਅਤ</translation> @@ -5261,7 +5262,6 @@ <translation id="7051943809462976355">ਮਾਊਸ ਖੋਜ ਰਿਹਾ ਹੈ...</translation> <translation id="7052237160939977163">ਪ੍ਰਦਰਸ਼ਨ ਟ੍ਰੇਸ ਡਾਟਾ ਭੇਜੋ</translation> <translation id="7053983685419859001">ਬਲੌਕ ਕਰੋ</translation> -<translation id="705508001219706572">ਤੇਜ਼ੀ ਨਾਲ ਇੱਥੇ ਵਾਪਸ ਆਉਣ ਲਈ, <ph name="APP_NAME" /> ਨੂੰ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="7055152154916055070">ਇਸ ਰੀਡਾਇਰੈਕਟ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ:</translation> <translation id="7055451306017383754">ਸਾਂਝਾਕਰਨ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ ਕਿਉਂਕਿ ਐਪਲੀਕੇਸ਼ਨ ਇਸ ਫੋਲਡਰ ਨੂੰ ਵਰਤ ਰਹੀ ਹੈ। ਅਗਲੀ ਵਾਰ Parallels Desktop ਬੰਦ ਹੋਣ 'ਤੇ ਫੋਲਡਰ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="7056526158851679338">&ਡਿਵਾਈਸਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index e64fc1b..853edbb 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">Karta SIM jest zablokowana</translation> <translation id="2618797463720777311">Konfigurowanie Udostępniania w pobliżu</translation> <translation id="2619761439309613843">Codziennie nowa</translation> +<translation id="2620215283731032047">Nie można pobrać pliku <ph name="FILE_NAME" /> w bezpieczny sposób.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Naucz Asystenta Google rozpoznawania Twojego modelu głosu</translation> <translation id="2621713457727696555">Zabezpieczona</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">Szukam myszy...</translation> <translation id="7052237160939977163">Wyślij dane śledzenia wydajności</translation> <translation id="7053983685419859001">Blokuj</translation> -<translation id="705508001219706572">Aby szybko tu wrócić, zainstaluj aplikację <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Zablokowano przekierowanie:</translation> <translation id="7055451306017383754">Nie udało się cofnąć udostępniania, ponieważ tego folderu używa aplikacja. Folder przestanie być udostępniany po zamknięciu Parallels Desktop.</translation> <translation id="7056526158851679338">&Sprawdź urządzenia</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Sprawdzam konfigurację kontenera Linuksa</translation> <translation id="9209689095351280025">Strony nie mogą używać plików cookie śledzących, co robisz w sieci</translation> <translation id="9211177926627870898">Wymagana aktualizacja</translation> +<translation id="9211490828691860325">Wszystkie biurka</translation> <translation id="9214520840402538427">Upłynął limit czasu inicjowania atrybutów instalacyjnych. Skontaktuj się z przedstawicielem obsługi klienta.</translation> <translation id="9214695392875603905">Babeczka</translation> <translation id="9215293857209265904">Dodano „<ph name="EXTENSION_NAME" />”</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index cbe3bf4..4ff4db3 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">O chip está bloqueado</translation> <translation id="2618797463720777311">Configurar o "Compartilhar por proximidade"</translation> <translation id="2619761439309613843">Atualização diária</translation> +<translation id="2620215283731032047">Não foi possível fazer o download de <ph name="FILE_NAME" /> por motivo de segurança.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Treinar modelo de voz do Google Assistente</translation> <translation id="2621713457727696555">Protegida</translation> @@ -5267,7 +5268,6 @@ <translation id="7051943809462976355">Procurando mouse...</translation> <translation id="7052237160939977163">Enviar dados de rastreamento de desempenho</translation> <translation id="7053983685419859001">Bloquear</translation> -<translation id="705508001219706572">Para acessar este conteúdo rapidamente, instale o app <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Redirecionamento bloqueado:</translation> <translation id="7055451306017383754">Não foi possível cancelar o compartilhamento porque um aplicativo está usando a pasta. O compartilhamento da pasta será cancelado na próxima vez que o Parallels Desktop for encerrado.</translation> <translation id="7056526158851679338">&Inspecionar dispositivos</translation> @@ -7168,6 +7168,7 @@ <translation id="9209563766569767417">Verificando a configuração do contêiner Linux</translation> <translation id="9209689095351280025">Os sites não podem usar cookies que rastreiem você pela Web</translation> <translation id="9211177926627870898">Atualização necessária</translation> +<translation id="9211490828691860325">Todos os espaços de trabalho</translation> <translation id="9214520840402538427">Ops! A inicialização dos atributos de tempo de instalação ultrapassou o tempo limite. Entre em contato com o representante de suporte.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" adicionada</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 0171aa0..f22e178 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">O cartão SIM está bloqueado</translation> <translation id="2618797463720777311">Configure a funcionalidade Partilhar na proximidade</translation> <translation id="2619761439309613843">Atualização diária</translation> +<translation id="2620215283731032047">Não é possível transferir o ficheiro <ph name="FILE_NAME" /> em segurança.</translation> <translation id="2620436844016719705">Sistema</translation> <translation id="262154978979441594">Treinar o modelo de voz do Assistente Google</translation> <translation id="2621713457727696555">Protegida</translation> @@ -5266,7 +5267,6 @@ <translation id="7051943809462976355">A pesquisar rato...</translation> <translation id="7052237160939977163">Enviar dados de rastreio do desempenho</translation> <translation id="7053983685419859001">Bloquear</translation> -<translation id="705508001219706572">Para voltar aqui rapidamente, instale a app <ph name="APP_NAME" />.</translation> <translation id="7055152154916055070">Redirecionamento bloqueado:</translation> <translation id="7055451306017383754">Não foi possível cancelar a partilha porque uma aplicação está a utilizar esta pasta. Será cancelada a partilha da pasta quando o Parallels Desktop for encerrado.</translation> <translation id="7056526158851679338">&Inspecionar dispositivos</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">A verificar a configuração do contentor do Linux…</translation> <translation id="9209689095351280025">Os sites não podem utilizar cookies que monitorizem a sua navegação na Web.</translation> <translation id="9211177926627870898">Atualização necessária</translation> +<translation id="9211490828691860325">Todos os espaços de trabalho</translation> <translation id="9214520840402538427">Ups! A inicialização dos atributos de tempo de instalação expirou. Contacte o seu representante de suporte.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" adicionada</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index f444cb46..95dad782 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -802,6 +802,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> este pregătit pentru a finaliza instalarea</translation> <translation id="1868193363684582383">„Ok Google”</translation> <translation id="1868553836791672080">Verificarea parolei nu este disponibilă în Chromium</translation> +<translation id="1869433484041798909">Butonul Marcaj</translation> <translation id="187145082678092583">Mai puține aplicații</translation> <translation id="1871534214638631766">Afișează informații conexe atunci când dai clic dreapta sau apeși lung conținutul</translation> <translation id="1871615898038944731">Dispozitivul <ph name="DEVICE_TYPE" /> este actualizat</translation> @@ -833,6 +834,7 @@ <translation id="1900305421498694955">Aplicațiile din Google Play pot necesita acces deplin la sistemul de fișiere pentru a citi și a scrie fișiere pe dispozitive de stocare externe. Fișierele și dosarele create pe dispozitiv sunt vizibile oricărei persoane care folosește unitatea externă. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Select&ează tot</translation> <translation id="1901396183631570154">Chrome nu a putut salva parolele în Contul Google. Însă le poți salva pe acest dispozitiv.</translation> +<translation id="1903995858055162096">Nu este dispozitivul tău? Folosește <ph name="BEGIN_LINK" />modul pentru invitați<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Numele dispozitivului Chromebook</translation> <translation id="1906181697255754968">Site-urile accesează de obicei fișiere și dosare de pe dispozitiv pentru funcții cum ar fi salvarea automată a ceea ce ai lucrat</translation> <translation id="1906828677882361942">Nu permite niciunui site să acceseze porturi seriale</translation> @@ -1450,6 +1452,7 @@ <translation id="2617342710774726426">Cardul SIM este blocat</translation> <translation id="2618797463720777311">Configurează Nearby Share</translation> <translation id="2619761439309613843">Actualizare zilnică</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> nu se poate descărca în siguranță.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Creează un model vocal pentru Asistentul Google</translation> <translation id="2621713457727696555">Securizată</translation> @@ -5264,7 +5267,6 @@ <translation id="7051943809462976355">Se caută mouse-ul...</translation> <translation id="7052237160939977163">Trimiteți datele privind urmărirea performanței</translation> <translation id="7053983685419859001">Blochează</translation> -<translation id="705508001219706572">Ca să revii rapid aici, instalează <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Redirecționarea a fost blocată:</translation> <translation id="7055451306017383754">Distribuirea nu s-a putut anula, deoarece o aplicație folosește acest dosar. Distribuirea dosarului va fi anulată la următoarea închidere a aplicației Parallels Desktop.</translation> <translation id="7056526158851679338">&Inspectați dispozitivele</translation> @@ -5437,6 +5439,7 @@ <translation id="7251346854160851420">Imagine de fundal prestabilită</translation> <translation id="7253521419891527137">&Aflați mai multe</translation> <translation id="7254951428499890870">Sigur doriți să lansați „<ph name="APP_NAME" />” în modul de diagnosticare?</translation> +<translation id="725497546968438223">Butonul Dosar de marcaje</translation> <translation id="7255002516883565667">În acest moment ai un card care poate fi folosit doar pe acest dispozitiv</translation> <translation id="7255935316994522020">Aplicați</translation> <translation id="7256069762010468647">Site-ul folosește camera foto</translation> @@ -5698,6 +5701,7 @@ <translation id="7564847347806291057">Oprește procesul</translation> <translation id="7566118625369982896">Gestionează linkurile aplicației Play</translation> <translation id="756809126120519699">Datele Chrome au fost șterse</translation> +<translation id="756876171895853918">Personalizează avatarul</translation> <translation id="7568790562536448087">Se actualizează</translation> <translation id="7569983096843329377">Negru</translation> <translation id="7571643774869182231">Nu există suficient spațiu de stocare pentru actualizare</translation> @@ -7165,6 +7169,7 @@ <translation id="9209563766569767417">Verificarea configurației containerului Linux este în curs</translation> <translation id="9209689095351280025">Site-urile nu pot folosi cookie-uri care te urmăresc pe web.</translation> <translation id="9211177926627870898">Actualizare necesară</translation> +<translation id="9211490828691860325">Toate desktopurile</translation> <translation id="9214520840402538427">Hopa! Inițializarea atributelor necesare în momentul instalării a expirat. Contactați reprezentantul dvs. de asistență.</translation> <translation id="9214695392875603905">Brioșă</translation> <translation id="9215293857209265904">S-a adăugat „<ph name="EXTENSION_NAME" />”</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index baba655..db857f0 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">SIM-карта заблокирована</translation> <translation id="2618797463720777311">Настройка функции "Обмен с окружением"</translation> <translation id="2619761439309613843">Обновлять ежедневно</translation> +<translation id="2620215283731032047">Невозможно скачать безопасно файл "<ph name="FILE_NAME" />".</translation> <translation id="2620436844016719705">Система</translation> <translation id="262154978979441594">Записать образец голоса для Ассистента</translation> <translation id="2621713457727696555">Защищена</translation> @@ -5264,7 +5265,6 @@ <translation id="7051943809462976355">Поиск мыши…</translation> <translation id="7052237160939977163">Отправлять данные отслеживания производительности</translation> <translation id="7053983685419859001">Блокировать</translation> -<translation id="705508001219706572">Чтобы быстро возвращаться к этой странице, установите приложение "<ph name="APP_NAME" />"</translation> <translation id="7055152154916055070">Заблокирована попытка переадресации:</translation> <translation id="7055451306017383754">Папка используется приложением. Доступ к ней будет закрыт при следующем выключении Parallels Desktop.</translation> <translation id="7056526158851679338">&Проверка устройств</translation> @@ -7166,6 +7166,7 @@ <translation id="9209563766569767417">Проверка настроек контейнера Linux</translation> <translation id="9209689095351280025">Сайты не могут использовать файлы cookie, которые отслеживают ваши действия в Интернете.</translation> <translation id="9211177926627870898">Требуется обновление</translation> +<translation id="9211490828691860325">Все рабочие столы</translation> <translation id="9214520840402538427">К сожалению, срок инициализации для атрибутов времени установки истек. Обратитесь в службу поддержки.</translation> <translation id="9214695392875603905">Кекс</translation> <translation id="9215293857209265904">Добавлено расширение или приложение: <ph name="EXTENSION_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 50cc634..d2915cb 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -799,6 +799,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> ඔබේ ස්ථාපනය සම්පූර්ණ කිරීමට සූදානම්</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">Chromium හි මුරපද පිරික්සුම ලබා ගත නොහැක</translation> +<translation id="1869433484041798909">පිටුසන් බොත්තම</translation> <translation id="187145082678092583">යෙදුම් අඩුවෙන්</translation> <translation id="1871534214638631766">ඔබ අන්තර්ගතය දකුණු ක්ලික් කළ විට හෝ දිගු කාලයක් එබූ විට අදාළ තතු පෙන්වන්න</translation> <translation id="1871615898038944731">ඔබගේ <ph name="DEVICE_TYPE" /> යාවත්කාලීනයි</translation> @@ -830,6 +831,7 @@ <translation id="1900305421498694955">Google Play වෙතින් ලැබෙන යෙදුම්වලට බාහිර ආචයන උපාංග මත ගොනු කියවීමටත් ලිවීමටත් පූර්ණ ගොනු පද්ධති ප්රවේශය අවශ්ය විය හැක. උපාංගය මත සාදනු ලබන ගොනු සහ ෆෝල්ඩර බාහිර ධාවකය භාවිත කරන ඕනෑම කෙනෙකුට දෘශ්යමාන වෙති. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> <translation id="1901303067676059328">සියල්ල තෝරන්න</translation> <translation id="1901396183631570154">Chrome හට මෙම මුරපද ඔබේ Google ගිණුමට සුරැකීමට නොහැකි විය. ඔබට තවමත් ඒවා මෙම උපාංගයේ සුරැකිය හැකිය.</translation> +<translation id="1903995858055162096">ඔබගේ උපාංගය නොවේද? <ph name="BEGIN_LINK" />ආගන්තුක ප්රකාරය<ph name="END_LINK" /> භාවිත කරන්න.</translation> <translation id="1905375423839394163">Chromebook උපාංග නාමය</translation> <translation id="1906181697255754968">අඩවි සාමාන්යයෙන් ඔබේ වැඩ ස්වයංක්රියව සුරැකීම වැනි විශේෂාංග සඳහා ඔබගේ උපාංගයේ ගොනු සහ ෆෝල්ඩරවලට ප්රවේශ වේ</translation> <translation id="1906828677882361942">කිසිම වෙබ් අඩවියකට අනුක්රමික තොටවලට ප්රවේශයට අවසර නොදෙන්න</translation> @@ -1447,6 +1449,7 @@ <translation id="2617342710774726426">SIM පත අගුළු වැටී ඇත</translation> <translation id="2618797463720777311">ළඟ බෙදා ගැනීම පිහිටුවන්න</translation> <translation id="2619761439309613843">දිනපතා නැවුම් කිරීම</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> සුරක්ෂිතව බාගත නොහැක.</translation> <translation id="2620436844016719705">පද්ධතිය</translation> <translation id="262154978979441594">Google සහකරු හඬ මාදිලිය පුහුණු කරන්න</translation> <translation id="2621713457727696555">ආරක්ෂිතයි</translation> @@ -5260,7 +5263,6 @@ <translation id="7051943809462976355">මුසිකය සඳහා සොයමින්...</translation> <translation id="7052237160939977163">ක්රියාකාරීත්ව අනුරේඛන දත්ත යවන්න</translation> <translation id="7053983685419859001">අවහිර කරන්න</translation> -<translation id="705508001219706572">ඉක්මනින් ආපසු මෙහි පැමිණීමට, <ph name="APP_NAME" /> ස්ථාපනය කරන්න</translation> <translation id="7055152154916055070">හරවා යැවීම අවහිරයි:</translation> <translation id="7055451306017383754">යෙදුමක් මෙම ෆෝල්ඩරය භාවිත කරන බැවින් බෙදා ගැනීම ඉවත් කළ නොහැකි විය. ෆෝල්ඩරය Parallels Desktop වසන ඊළඟ අවස්ථාවේ බෙදා ගැනීම ඉවත් කරනු ඇත.</translation> <translation id="7056526158851679338">&උපාංග පරීක්ෂා කරන්න</translation> @@ -5433,6 +5435,7 @@ <translation id="7251346854160851420">පෙරනිමි බිතුපත</translation> <translation id="7253521419891527137">&වැඩිදුර හදාරන්න</translation> <translation id="7254951428499890870">ඔබට විනිශ්චය මාදිලියෙන්"<ph name="APP_NAME" />"දියත් කිරීමට අවශ්ය බව පැහැදිලිද?</translation> +<translation id="725497546968438223">ෆෝල්ඩර බොත්තම පිටුසන් කරන්න</translation> <translation id="7255002516883565667">මේ දැන්, ඔබට මෙම උපාංගය මත පමණක් භාවිත කළ හැකි එක කාඩ්පතක් තිබේ</translation> <translation id="7255935316994522020">යොදා ගන්න</translation> <translation id="7256069762010468647">අඩවිය ඔබගේ කැමරාව භාවිත කරමින්</translation> @@ -5694,6 +5697,7 @@ <translation id="7564847347806291057">ක්රියාවලිය අවසන් කරන්න</translation> <translation id="7566118625369982896">Play යෙදුම් සබැඳි කළමනාකරණය</translation> <translation id="756809126120519699">Chrome දත්ත හිස් කෙරිණි</translation> +<translation id="756876171895853918">නියුරුව අභිරුචිකරණය කරන්න</translation> <translation id="7568790562536448087">යාවත්කරමින්</translation> <translation id="7569983096843329377">කළු</translation> <translation id="7571643774869182231">යාවත්කාලීනය සඳහා ප්රමාණවත් ගබඩාවක් නොමැත</translation> @@ -7159,6 +7163,7 @@ <translation id="9209563766569767417">ලිනක්ස් භාජන සැකසීම පරීක්ෂා කිරීම</translation> <translation id="9209689095351280025">වෙබ් අඩවිවලට වෙබය අතරින් ඔබව හඹා යන කුකී භාවිත කළ නොහැක</translation> <translation id="9211177926627870898">යාවත්කාලීනය අවශ්යයි</translation> +<translation id="9211490828691860325">සියලු වැඩතල</translation> <translation id="9214520840402538427">අහෝ! ස්ථාපන-කාල අනුලකුණු ආරම්භය කල් ඉකුත්විය. කරුණාකර ඔබේ සහාය නියෝජිතයා සබඳ කරගන්න.</translation> <translation id="9214695392875603905">කප් කේක්</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" එක්කරන ලදී</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 5e4ea2e..911d2f8b 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -535,7 +535,7 @@ <translation id="1585717515139318619">Iný program v počítači pridal motív, ktorý môže zmeniť spôsob fungovania prehliadača Chrome. <ph name="EXTENSION_NAME" /></translation> -<translation id="1587129667417059148">Týmto vymažete všetky dáta a súbory cookie uložené zdrojom <ph name="ORIGIN_NAME" />.</translation> +<translation id="1587129667417059148">Týmto vymažete všetky dáta a súbory cookie uložené webom <ph name="ORIGIN_NAME" /></translation> <translation id="1587275751631642843">&Konzola jazyka JavaScript</translation> <translation id="1587907146729660231">Dotknite sa prstom vypínača</translation> <translation id="1588438908519853928">Normálny</translation> @@ -642,7 +642,7 @@ <translation id="1689945336726856614">Kopírovať &webovú adresu</translation> <translation id="1690248886740053041">Nedá sa pripojiť k mobilnej sieti. Technickú podporu vám poskytne operátor.</translation> <translation id="1692115862433274081">Použiť iný účet</translation> -<translation id="1692118695553449118">Synchronizácia je zapnutá.</translation> +<translation id="1692118695553449118">Synchronizácia je zapnutá</translation> <translation id="1692210323591458290">Tmavofialová</translation> <translation id="169279809881363536">Neboli vyhľadané žiadne profily. Ak chcete nastaviť novú sieť, naskenujte QR kód fotoaparátom zariadenia alebo zadajte aktivačný kód poskytnutý vaším operátorom.</translation> <translation id="1697150536837697295">Umenie</translation> @@ -659,7 +659,7 @@ <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (natívne)</translation> <translation id="1709217939274742847">Vyberte tiket, ktorý sa má použiť na overenie. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1709972045049031556">Nedá sa zdieľať</translation> -<translation id="1711935594505774770">Týmto vymažete všetky dáta a súbory cookie uložené doménou <ph name="SITE_GROUP_NAME" />, všetkými jej podradenými webmi a jej nainštalovanými aplikáciami</translation> +<translation id="1711935594505774770">Týmto vymažete všetky dáta a súbory cookie uložené webom <ph name="SITE_GROUP_NAME" />, jeho podradenými webmi a jeho nainštalovanými aplikáciami</translation> <translation id="1714644264617423774">Povoliť funkcie dostupnosti zjednodušujúce používanie zariadenia. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Senzory pohybu</translation> <translation id="1718835860248848330">Posledná hodina</translation> @@ -803,6 +803,7 @@ <translation id="1867780286110144690">Aplikácia <ph name="PRODUCT_NAME" /> je pripravená dokončiť inštaláciu</translation> <translation id="1868193363684582383">„Ok Google“</translation> <translation id="1868553836791672080">Kontrola hesla nie je v prehliadači Chromium k dispozícii</translation> +<translation id="1869433484041798909">Tlačidlo Záložka</translation> <translation id="187145082678092583">Menej aplikácií</translation> <translation id="1871534214638631766">Zobrazovať súvisiace informácie, keď na obsah kliknete pravým tlačidlom alebo ho dlho stlačíte</translation> <translation id="1871615898038944731">Vaše zariadenie <ph name="DEVICE_TYPE" /> je aktuálne</translation> @@ -834,6 +835,7 @@ <translation id="1900305421498694955">Aplikácie na Google Play môžu vyžadovať úplný prístup k systému súborov a povolenie zapisovať súbory v externých úložiskách. Súbory a priečinky vytvorené v zariadení sú viditeľné pre všetkých používateľov príslušného externého disku. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Vybrať &všetko</translation> <translation id="1901396183631570154">Chromu sa nepodarilo uložiť tieto heslá vo vašom účte Google. Môžete si ich stále uložiť v tomto zariadení.</translation> +<translation id="1903995858055162096">Zariadenie nie je vaše? Použite <ph name="BEGIN_LINK" />hosťovský režim<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Názov zariadenia Chromebook</translation> <translation id="1906181697255754968">Weby zvyčajne získavajú prístup k súborom a priečinkom vo vašom zariadení, aby mohli poskytovať funkcie, ako je automatické ukladanie vašej práce</translation> <translation id="1906828677882361942">Zakázať všetkým webom používať sériové porty</translation> @@ -1450,6 +1452,7 @@ <translation id="2617342710774726426">SIM karta je uzamknutá</translation> <translation id="2618797463720777311">Nastavenie zdieľania nablízku</translation> <translation id="2619761439309613843">Obnovovať denne</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> nie je možné bezpečne stiahnuť.</translation> <translation id="2620436844016719705">Systém</translation> <translation id="262154978979441594">Natrénovať hlasový model Asistenta Google</translation> <translation id="2621713457727696555">Zabezpečená</translation> @@ -3598,7 +3601,7 @@ <translation id="5125751979347152379">Neplatná webová adresa.</translation> <translation id="5126611267288187364">Zobraziť zmeny</translation> <translation id="5127620150973591153">Bezpečný spojovací kód: <ph name="TOKEN" /></translation> -<translation id="5127805178023152808">Synchronizácia je vypnutá.</translation> +<translation id="5127805178023152808">Synchronizácia je vypnutá</translation> <translation id="5127881134400491887">Spravovať sieťové pripojenia</translation> <translation id="512903556749061217">pripojené</translation> <translation id="5131591206283983824">Presun klepnutím na touchpade</translation> @@ -4119,7 +4122,7 @@ <translation id="572155275267014074">Nastavenia Androidu</translation> <translation id="5722086096420375088">Zelená a biela</translation> <translation id="5722930212736070253">Aj, chyba! Program Zip Archiver narazil na chybu.</translation> -<translation id="5723034813131030312">Blokovať weby, aby sa nemohli pripájať k sériovým zariadeniam</translation> +<translation id="5723034813131030312">Brániť webom pripájať sa k sériovým zariadeniam</translation> <translation id="572328651809341494">Nedávne karty</translation> <translation id="5723508132121499792">Na pozadí nie sú spustené žiadne aplikácie</translation> <translation id="5723967018671998714">Súbory cookie tretích strán sú v anonymnom režime blokované</translation> @@ -4471,7 +4474,7 @@ <translation id="6122600716821516697">Chcete zdieľať obsah s týmto zariadením?</translation> <translation id="6122831415929794347">Chcete vypnúť Bezpečné prehliadanie?</translation> <translation id="6122875415561139701">Operácia zápisu je na zariadení <ph name="DEVICE_NAME" /> zakázaná.</translation> -<translation id="6124213551517593835">Týmto vymažete všetky dáta a súbory cookie uložené doménou <ph name="SITE_GROUP_NAME" /> a všetkými jej podradenými webmi.</translation> +<translation id="6124213551517593835">Týmto vymažete všetky dáta a súbory cookie uložené webom <ph name="SITE_GROUP_NAME" /> a jeho podradenými webmi</translation> <translation id="6124650939968185064">Od tohto rozšírenia závisia nasledujúce rozšírenia:</translation> <translation id="6124698108608891449">Tento web potrebuje ďalšie povolenia.</translation> <translation id="6125479973208104919">Do tohto zariadenia <ph name="DEVICE_TYPE" /> si žiaľ budete musieť znova pridať účet.</translation> @@ -5093,7 +5096,7 @@ <translation id="6857699260879628349">Získať informácie o konfigurácii</translation> <translation id="6857725247182211756"><ph name="SECONDS" /> s</translation> <translation id="6860097299815761905">Nastavenia servera proxy...</translation> -<translation id="686022878923628150">Blokovať weby, aby sa nemohli pripájať k zariadeniam MIDI</translation> +<translation id="686022878923628150">Brániť webom pripájať sa k zariadeniam MIDI</translation> <translation id="6860427144121307915">Otvoriť na karte</translation> <translation id="686366188661646310">Chcete heslo odstrániť?</translation> <translation id="6865313869410766144">Dáta automatického dopĺňania formulárov</translation> @@ -5131,7 +5134,7 @@ <translation id="6909422577741440844">Chcete dostávať obsah z tohto zariadenia?</translation> <translation id="6910211073230771657">Odstránené</translation> <translation id="691024665142758461">Stiahnuť viacero súborov</translation> -<translation id="691106080621596509">Týmto vymažete všetky dáta a súbory cookie uložené doménou <ph name="SITE_GROUP_NAME" />, všetkými jej podradenými webmi a jej nainštalovanou aplikáciou</translation> +<translation id="691106080621596509">Týmto vymažete všetky dáta a súbory cookie uložené webom <ph name="SITE_GROUP_NAME" />, jeho podradenými webmi a jeho nainštalovanou aplikáciou</translation> <translation id="6911324888870229398">Sieťové pripojenie bolo prerušené. Skontrolujte pripojenie alebo skúste inú sieť Wi-Fi.</translation> <translation id="6911734910326569517">Množstvo využívanej pamäte</translation> <translation id="6912007319859991306">Kód PIN mobilnej SIM karty</translation> @@ -5264,7 +5267,6 @@ <translation id="7051943809462976355">Prebieha hľadanie myši...</translation> <translation id="7052237160939977163">Odosielať údaje sledovania výkonnosti</translation> <translation id="7053983685419859001">Blokovať</translation> -<translation id="705508001219706572">Ak sa sem chcete rýchlo vrátiť, nainštalujte si aplikáciu <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Presmerovanie bolo zablokované:</translation> <translation id="7055451306017383754">Zdieľanie sa nepodarilo zrušiť, pretože tento priečinok používa nejaká aplikácia. Jeho zdieľanie bude zrušené po ďalšom vypnutí aplikácie Parallels Desktop.</translation> <translation id="7056526158851679338">&Preskúmať zariadenia</translation> @@ -5437,6 +5439,7 @@ <translation id="7251346854160851420">Predvolená tapeta</translation> <translation id="7253521419891527137">Ďalšie &informácie</translation> <translation id="7254951428499890870">Naozaj chcete aplikáciu <ph name="APP_NAME" /> spustiť v diagnostickom režime?</translation> +<translation id="725497546968438223">Tlačidlo Priečinok so záložkami</translation> <translation id="7255002516883565667">Momentálne máte jednu kartu, ktorú je možné použiť iba v tomto zariadení</translation> <translation id="7255935316994522020">Použiť</translation> <translation id="7256069762010468647">Web používa vašu kameru</translation> @@ -5506,7 +5509,7 @@ <translation id="7343372807593926528">Opíšte problém a až potom odošlite spätnú väzbu.</translation> <translation id="7345706641791090287">Potvrdenie hesla</translation> <translation id="7346909386216857016">Dobre</translation> -<translation id="7347452120014970266">Týmto vymažete všetky dáta a súbory cookie uložené zdrojom <ph name="ORIGIN_NAME" /> a jeho nainštalovanými aplikáciami.</translation> +<translation id="7347452120014970266">Týmto vymažete všetky dáta a súbory cookie uložené webom <ph name="ORIGIN_NAME" /> a jeho nainštalovanými aplikáciami</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> <translation id="7347943691222276892">Kliknutím odídete zo stránky <ph name="SUBPAGE_TITLE" />.</translation> <translation id="7348093485538360975">Klávesnica na obrazovke</translation> @@ -5698,6 +5701,7 @@ <translation id="7564847347806291057">Ukončiť proces</translation> <translation id="7566118625369982896">Správa skratiek aplikácie Play</translation> <translation id="756809126120519699">Údaje Chromu boli vymazané</translation> +<translation id="756876171895853918">Prispôsobiť avatar</translation> <translation id="7568790562536448087">Prebieha aktualizácia</translation> <translation id="7569983096843329377">Čierna</translation> <translation id="7571643774869182231">V úložisku nie je dostatok miesta na aktualizáciu</translation> @@ -5797,7 +5801,7 @@ <translation id="7678280409648629969">Po ukončení režimu inkognito sa všetky prihlasovacie údaje uložia v Chrome. Umožní vám to neskôr opäť používať Touch ID na tomto webe.</translation> <translation id="7680416688940118410">Kalibrácia dotykovej obrazovky</translation> <translation id="7681095912841365527">Web môže používať Bluetooth</translation> -<translation id="7682634383739326341">Blokovať weby, aby sa nemohli pripájať k zariadeniam USB</translation> +<translation id="7682634383739326341">Brániť webom pripájať sa k zariadeniam USB</translation> <translation id="7683373461016844951">Ak chcete pokračovať, kliknite na OK a potom kliknutím na možnosť Pridať osobu vytvorte nový profil pre svoju e-mailovú adresu v doméne <ph name="DOMAIN" />.</translation> <translation id="7683593009096723900">{COUNT,plural, =0{Otvoriť všetky v okne inkognito}=1{Otvoriť v okne inkognito}few{Otvoriť všetky ({COUNT}) v okne inkognito}many{Otvoriť všetky ({COUNT}) v okne inkognito}other{Otvoriť všetky ({COUNT}) v okne inkognito}}</translation> <translation id="7684212569183643648">Nainštalované vaším správcom</translation> @@ -7155,7 +7159,7 @@ <translation id="9188732951356337132">Odosielať údaje o využití a diagnostiky. Toto zariadenie momentálne automaticky odosiela Googlu diagnostiky a údaje o používaní zariadenia a aplikácií. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie vylepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom Androidu. Ak pre dieťa aktivujete nastavenie dodatočnej aktivity na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. <ph name="BEGIN_LINK2" />Ďalšie informácie<ph name="END_LINK2" /></translation> <translation id="9198090666959937775">Používanie telefónu s Androidom ako bezpečnostného kľúča</translation> <translation id="920045321358709304">Hľadať vyhľadávačom <ph name="SEARCH_ENGINE" /></translation> -<translation id="9201023452444595544">Budú vymazané všetky offline údaje</translation> +<translation id="9201023452444595544">Všetky offline dáta budú vymazané</translation> <translation id="9201220332032049474">Možnosti zámky obrazovky</translation> <translation id="9201842707396338580">Vyskytol sa problém. Kontaktujte vlastníka či správcu zariadenia. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="9203398526606335860">&Profilovanie povolené</translation> @@ -7165,6 +7169,7 @@ <translation id="9209563766569767417">Kontroluje sa nastavenie kontajnera Linux</translation> <translation id="9209689095351280025">Weby nemôžu používať súbory cookie, ktoré vás sledujú na internete</translation> <translation id="9211177926627870898">Vyžaduje sa aktualizácia</translation> +<translation id="9211490828691860325">Všetky plochy</translation> <translation id="9214520840402538427">Ojoj! Časový limit pre inicializáciu atribútov času inštalácie uplynul. Kontaktujte zástupcu podpory.</translation> <translation id="9214695392875603905">Koláčik</translation> <translation id="9215293857209265904">Položka „<ph name="EXTENSION_NAME" />“ bola pridaná</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index c55a07f..37738d7 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1454,6 +1454,7 @@ <translation id="2617342710774726426">Kartica SIM je zaklenjena</translation> <translation id="2618797463720777311">Nastavitev funkcije Deljenje v bližini</translation> <translation id="2619761439309613843">Dnevno osveževanje</translation> +<translation id="2620215283731032047">Datoteke <ph name="FILE_NAME" /> ni mogoče varno prenesti.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Usposabljanje glasovnega modela za Pomočnika Google</translation> <translation id="2621713457727696555">Varno</translation> @@ -5270,7 +5271,6 @@ <translation id="7051943809462976355">Iskanje miške ...</translation> <translation id="7052237160939977163">Pošlji podatke za sledenje učinkovitosti delovanja</translation> <translation id="7053983685419859001">Blokiraj</translation> -<translation id="705508001219706572">Če se želite hitro vrniti sem, namestite aplikacijo <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Preusmeritev je preprečena:</translation> <translation id="7055451306017383754">Skupne rabe mape ni bilo mogoče preklicati, ker jo uporablja določena aplikacija. Skupna raba mape bo preklicana ob naslednji zaustavitvi programa Parallels Desktop.</translation> <translation id="7056526158851679338">&Pregled naprav</translation> @@ -7175,6 +7175,7 @@ <translation id="9209563766569767417">Preverjanje nastavitve vsebnika za Linux</translation> <translation id="9209689095351280025">Spletna mesta vam ne morejo slediti po spletu na podlagi piškotkov</translation> <translation id="9211177926627870898">Potrebna je posodobitev</translation> +<translation id="9211490828691860325">Vsa namizja</translation> <translation id="9214520840402538427">Ojoj! Potekla je časovna omejitev inicializacije atributov časa namestitve. Obrnite se na predstavnika podpore.</translation> <translation id="9214695392875603905">Tortica</translation> <translation id="9215293857209265904">Razširitev »<ph name="EXTENSION_NAME" />« je dodana</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index b7ea844..bd67afa 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -798,6 +798,7 @@ <translation id="1867780286110144690"><ph name="PRODUCT_NAME" /> është gati për të përfunduar instalimin tënd</translation> <translation id="1868193363684582383">"Ok Google"</translation> <translation id="1868553836791672080">Kontrolli i fjalëkalimit nuk ofrohet në Chromium</translation> +<translation id="1869433484041798909">Butoni i faqeshënuesit</translation> <translation id="187145082678092583">Më pak aplikacione</translation> <translation id="1871534214638631766">Shfaq informacionet e lidhura kur klikon me butonin djathtas ose shtyp gjatë mbi përmbajtje</translation> <translation id="1871615898038944731">Pajisja jote <ph name="DEVICE_TYPE" /> është e përditësuar</translation> @@ -829,6 +830,7 @@ <translation id="1900305421498694955">Aplikacionet nga Google Play mund të kërkojnë qasje të plotë të sistemit të skedarëve për të lexuar dhe për të shkruar te skedarët në pajisjet e jashtme të hapësirës ruajtëse. Skedarët dhe dosjet e krijuara në pajisje janë të dukshme për këdo që përdor diskun e jashtëm. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="1901303067676059328">Zgjidhi &të gjitha</translation> <translation id="1901396183631570154">Chrome nuk mund t'i ruante këto fjalëkalime në "Llogarinë tënde të Google". Mund t'i ruash ato ende në këtë pajisje.</translation> +<translation id="1903995858055162096">Nuk është pajisja jote? Përdor <ph name="BEGIN_LINK" />Modalitetin "vizitor"<ph name="END_LINK" />.</translation> <translation id="1905375423839394163">Emri i pajisjes Chromebook</translation> <translation id="1906181697255754968">Sajtet qasen zakonisht te skedarët dhe dosjet në pajisjen tënde për veçoritë si ruajtja automatike e punës</translation> <translation id="1906828677882361942">Mos lejo asnjë sajt të ketë qasje në portat seriale</translation> @@ -1446,6 +1448,7 @@ <translation id="2617342710774726426">Karta SIM është e kyçur</translation> <translation id="2618797463720777311">Konfiguro "Ndarjen në afërsi"</translation> <translation id="2619761439309613843">Rifreskimi i përditshëm</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> nuk mund të shkarkohet në mënyrë të sigurt.</translation> <translation id="2620436844016719705">Sistemi</translation> <translation id="262154978979441594">Trajno modelin e zërit të "Asistentit të Google"</translation> <translation id="2621713457727696555">I siguruar</translation> @@ -5259,7 +5262,6 @@ <translation id="7051943809462976355">Po kërkon për miun...</translation> <translation id="7052237160939977163">Dërgo të dhënat e gjurmimit të performancës</translation> <translation id="7053983685419859001">Bllokoje</translation> -<translation id="705508001219706572">Për t'u kthyer shpejt këtu, instalo <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Ridrejtimi u bllokua:</translation> <translation id="7055451306017383754">Ndarja nuk mund të anulohej sepse kjo dosje po përdoret nga një aplikacion. Ndarja e dosjes do të anulohet kur Parallels Desktop të ndalojë punën më pas.</translation> <translation id="7056526158851679338">&Inspekto pajisjet</translation> @@ -5432,6 +5434,7 @@ <translation id="7251346854160851420">Imazhi i parazgjedhur i sfondit</translation> <translation id="7253521419891527137">&Mëso më shumë</translation> <translation id="7254951428499890870">Je i sigurt që dëshiron ta nisësh "<ph name="APP_NAME" />" në modalitetin "diagnostikues"?</translation> +<translation id="725497546968438223">Butoni i dosjes së faqeshënuesve</translation> <translation id="7255002516883565667">Në këtë moment, ke një kartë që mund të përdoret vetëm në këtë pajisje</translation> <translation id="7255935316994522020">Zbato</translation> <translation id="7256069762010468647">Sajti po përdor kamerën tënde</translation> @@ -5693,6 +5696,7 @@ <translation id="7564847347806291057">Përfundo procesin</translation> <translation id="7566118625369982896">Menaxho lidhjet për aplikacionet në Play</translation> <translation id="756809126120519699">Të dhënat e Chrome u pastruan</translation> +<translation id="756876171895853918">Personalizo simbolin</translation> <translation id="7568790562536448087">Po përditësohet</translation> <translation id="7569983096843329377">E zezë</translation> <translation id="7571643774869182231">Nuk ka hapësirë ruajtëse të mjaftueshme për përditësimin</translation> @@ -7157,6 +7161,7 @@ <translation id="9209563766569767417">Po kontrollon konfigurimin e kontejnerit të Linux</translation> <translation id="9209689095351280025">Sajtet nuk mund të përdorin kuki që të monitorojnë nëpër ueb</translation> <translation id="9211177926627870898">Kërkohet përditësimi</translation> +<translation id="9211490828691860325">Të gjitha tavolinat e punës</translation> <translation id="9214520840402538427">Mos! Nisjes së atributeve të kohës së instalimit i ka përfunduar afati. Kontakto me përfaqësuesin e mbështetjes.</translation> <translation id="9214695392875603905">Kek në kupë</translation> <translation id="9215293857209265904">U shtua "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index d2aeb63f..28c4b54 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2618797463720777311">Podesite Deljenje u blizini</translation> <translation id="2619761439309613843">Dnevno osvežavanje</translation> +<translation id="2620215283731032047">Bezbedno preuzimanje datoteke <ph name="FILE_NAME" /> nije uspelo.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Obučavajte glasovni model Google pomoćnika</translation> <translation id="2621713457727696555">Zaštićeno</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Traži se miš...</translation> <translation id="7052237160939977163">Šalji podatke o praćenju učinka</translation> <translation id="7053983685419859001">Blokiraj</translation> -<translation id="705508001219706572">Da biste se ovde brzo vraćali, instalirajte aplikaciju <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Blokirano je preusmeravanje:</translation> <translation id="7055451306017383754">Opozivanje deljenja nije uspelo jer neka aplikacija koristi ovaj folder. Deljenje foldera će biti opozvano kada se Parallels Desktop sledeći put zatvori.</translation> <translation id="7056526158851679338">&Ispitaj uređaje</translation> @@ -7169,6 +7169,7 @@ <translation id="9209563766569767417">Proverava se podešavanje Linux kontejnera</translation> <translation id="9209689095351280025">Sajtovi ne mogu da koriste kolačiće koji vas prate na vebu</translation> <translation id="9211177926627870898">Ažuriranje je obavezno</translation> +<translation id="9211490828691860325">Sve radne površine</translation> <translation id="9214520840402538427">Ups! Vreme pokretanja atributa za vreme instalacije je isteklo. Kontaktirajte predstavnika podrške.</translation> <translation id="9214695392875603905">Mafin</translation> <translation id="9215293857209265904">Dodat je „<ph name="EXTENSION_NAME" />“</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 3d208d8..ab33619 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">SIM картица је закључана</translation> <translation id="2618797463720777311">Подесите Дељење у близини</translation> <translation id="2619761439309613843">Дневно освежавање</translation> +<translation id="2620215283731032047">Безбедно преузимање датотеке <ph name="FILE_NAME" /> није успело.</translation> <translation id="2620436844016719705">Систем</translation> <translation id="262154978979441594">Обучавајте гласовни модел Google помоћника</translation> <translation id="2621713457727696555">Заштићено</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Тражи се миш...</translation> <translation id="7052237160939977163">Шаљи податке о праћењу учинка</translation> <translation id="7053983685419859001">Блокирај</translation> -<translation id="705508001219706572">Да бисте се овде брзо враћали, инсталирајте апликацију <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Блокирано је преусмеравање:</translation> <translation id="7055451306017383754">Опозивање дељења није успело јер нека апликација користи овај фолдер. Дељење фолдера ће бити опозвано када се Parallels Desktop следећи пут затвори.</translation> <translation id="7056526158851679338">&Испитај уређаје</translation> @@ -7169,6 +7169,7 @@ <translation id="9209563766569767417">Проверава се подешавање Linux контејнера</translation> <translation id="9209689095351280025">Сајтови не могу да користе колачиће који вас прате на вебу</translation> <translation id="9211177926627870898">Ажурирање је обавезно</translation> +<translation id="9211490828691860325">Све радне површине</translation> <translation id="9214520840402538427">Упс! Време покретања атрибута за време инсталације је истекло. Контактирајте представника подршке.</translation> <translation id="9214695392875603905">Мафин</translation> <translation id="9215293857209265904">Додат је „<ph name="EXTENSION_NAME" />“</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 06b3da3..19679e90 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">SIM-kortet är låst</translation> <translation id="2618797463720777311">Konfigurera Närdelning</translation> <translation id="2619761439309613843">Daglig uppdatering</translation> +<translation id="2620215283731032047">Det går inte att ladda ned <ph name="FILE_NAME" /> på ett säkert sätt.</translation> <translation id="2620436844016719705">System</translation> <translation id="262154978979441594">Träna Google-assistentens röstmodell</translation> <translation id="2621713457727696555">Skyddat</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Söker efter mus …</translation> <translation id="7052237160939977163">Skicka data från resultatspårning</translation> <translation id="7053983685419859001">Blockera</translation> -<translation id="705508001219706572">Installera <ph name="APP_NAME" /> så att du kan komma tillbaka hit snabbt</translation> <translation id="7055152154916055070">Omdirigeringen blockerades:</translation> <translation id="7055451306017383754">Det gick inte att sluta dela eftersom ett program använder den här mappen. Mappen slutar delas nästa gång Parallels Desktop stängs av.</translation> <translation id="7056526158851679338">&Inspektera enheter</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Linux-behållarens konfiguration kontrolleras</translation> <translation id="9209689095351280025">Webbplatser kan inte använda cookies som spårar dig på webben</translation> <translation id="9211177926627870898">Uppdatering krävs</translation> +<translation id="9211490828691860325">Alla skrivbord</translation> <translation id="9214520840402538427">Hoppsan! Initieringen av attributen för installationstiden har gått ut. Kontakta din representant för kundsupport.</translation> <translation id="9214695392875603905">Muffin</translation> <translation id="9215293857209265904"><ph name="EXTENSION_NAME" /> har lagts till</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 4d8cb0e..64d48b3 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">SIM kadi imefungwa</translation> <translation id="2618797463720777311">Weka mipangilio ya kipengele cha Uhamishaji wa Karibu</translation> <translation id="2619761439309613843">Onyesha Upya Kila Siku</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> haiwezi kupakuliwa kwa usalama.</translation> <translation id="2620436844016719705">Mfumo</translation> <translation id="262154978979441594">Ifunze programu ya Mratibu wa Google muundo wa sauti</translation> <translation id="2621713457727696555">Unalindwa</translation> @@ -5260,7 +5261,6 @@ <translation id="7051943809462976355">Inatafuta kipanya...</translation> <translation id="7052237160939977163">Tuma data ya ufuatiliaji wa utendaji</translation> <translation id="7053983685419859001">Zuia</translation> -<translation id="705508001219706572">Ili uweze kurudi hapa kwa haraka, sakinisha <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Imezuiwa kuelekeza kwingine:</translation> <translation id="7055451306017383754">Imeshindwa kughairi kushiriki kwa sababu kuna programu inayotumia folda hii. Itaghairi kushiriki folda wakati programu ya Parallels Desktop itafungwa tena.</translation> <translation id="7056526158851679338">Na Ukague Vifaa</translation> @@ -7164,6 +7164,7 @@ <translation id="9209563766569767417">Inakagua mipangilio ya metadata ya Linux</translation> <translation id="9209689095351280025">Tovuti haziwezi kutumia vidakuzi vinavyokufuatilia kwenye wavuti</translation> <translation id="9211177926627870898">Sasisho linahitajika</translation> +<translation id="9211490828691860325">Maeneokazi yote</translation> <translation id="9214520840402538427">Lo! Uanzishaji wa muda wa usakinishaji sifa umechina. Tafadhali wasiliana na mwakilishi wako wa kutoa msaada.</translation> <translation id="9214695392875603905">Keki dogo</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" limeongezwa</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index c6bc9bb..510e766 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">சிம் கார்டு பூட்டப்பட்டுள்ளது</translation> <translation id="2618797463720777311">‘அருகிலுள்ளவற்றுடன் பகிர்தல்’ அம்சத்தை அமைத்திடுங்கள்</translation> <translation id="2619761439309613843">தினசரிப் புதுப்பிப்பு</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> என்ற கோப்பைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது.</translation> <translation id="2620436844016719705">அமைப்பு</translation> <translation id="262154978979441594">Google Assistant குரல் பதிவிற்குப் பயிற்சி அளி</translation> <translation id="2621713457727696555">பாதுகாக்கப்பட்ட வைஃபை நெட்வொர்க்</translation> @@ -5264,7 +5265,6 @@ <translation id="7051943809462976355">மவுஸைத் தேடுகிறது...</translation> <translation id="7052237160939977163">செயல்திறன் தடமறிதல் தரவை அனுப்பு</translation> <translation id="7053983685419859001">தடு</translation> -<translation id="705508001219706572">இந்தப் பக்கத்தை விரைவாக அணுக, <ph name="APP_NAME" /> ஆப்ஸை நிறுவுங்கள்</translation> <translation id="7055152154916055070">திசைதிருப்புதல் தடுக்கப்பட்டது:</translation> <translation id="7055451306017383754">ஓர் ஆப்ஸ் இந்தக் கோப்புறையைப் பயன்படுத்திக் கொண்டிருப்பதால் பகிர்வை நீக்க முடியவில்லை. அடுத்த முறை Parallels Desktop ஷட் டவுன் செய்யப்படும் போது இந்தக் கோப்புறை பகிர்வு நீக்கப்படும்.</translation> <translation id="7056526158851679338">&சாதனங்களை ஆய்வுசெய்</translation> @@ -7164,6 +7164,7 @@ <translation id="9209563766569767417">Linux கண்டெய்னர் அமைவைச் சரிபார்க்கிறது</translation> <translation id="9209689095351280025">உங்கள் இணைய நடவடிக்கைகளைக் கண்காணிக்கும் குக்கீகளைத் தளங்களால் பயன்படுத்த முடியாது</translation> <translation id="9211177926627870898">புதுப்பிப்பு தேவை</translation> +<translation id="9211490828691860325">அனைத்து டெஸ்குகளும்</translation> <translation id="9214520840402538427">அச்சச்சோ! நிறுவல் நேர பண்புக்கூறுகளின் தொடக்க நேரம் முடிந்தது. உங்கள் ஆதரவு பிரதிநிதியைத் தொடர்புகொள்ளவும்.</translation> <translation id="9214695392875603905">கப்கேக்</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" சேர்க்கப்பட்டது</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 15047066..17e75ec 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1451,6 +1451,7 @@ <translation id="2617342710774726426">SIM కార్డ్ లాక్ అయింది</translation> <translation id="2618797463720777311">సమీప షేరింగ్ను సెటప్ చేయండి</translation> <translation id="2619761439309613843">రోజూ రిఫ్రెష్ అవుతుంది</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" />ను సురక్షితంగా డౌన్లోడ్ చేయడం సాధ్యం కాదు.</translation> <translation id="2620436844016719705">సిస్టమ్</translation> <translation id="262154978979441594">Google Assistant వాయిస్ మోడల్కు శిక్షణనివ్వండి</translation> <translation id="2621713457727696555">సురక్షితమైంది</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">మౌస్ కోసం వెతుకుతోంది...</translation> <translation id="7052237160939977163">పనితీరు గుర్తింపు డేటాను పంపు</translation> <translation id="7053983685419859001">నిరోధించు</translation> -<translation id="705508001219706572">ఇక్కడికి త్వరగా తిరిగి రావడానికి, <ph name="APP_NAME" />ను ఇన్స్టాల్ చేయండి</translation> <translation id="7055152154916055070">మళ్లింపు బ్లాక్ చేయబడింది:</translation> <translation id="7055451306017383754">ఒక యాప్ ఈ ఫోల్డర్ను ఉపయోగిస్తుంది కాబట్టి షేరింగ్ను తీసివేయడం సాధ్యపడలేదు. Parallels Desktop మళ్లీ షట్ డౌన్ అయినప్పుడు ఫోల్డర్ షేరింగ్ తీసివేయబడుతుంది.</translation> <translation id="7056526158851679338">&పరికరాలను పర్యవేక్షించు</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Linux కంటెయినర్ సెటప్ను తనిఖీ చేస్తోంది</translation> <translation id="9209689095351280025">వెబ్ అంతటా మిమ్మల్ని ట్రాక్ చేయడానికి ఉపయోగించే కుక్కీలను సైట్లు ఉపయోగించడం సాధ్యం కాదు</translation> <translation id="9211177926627870898">అప్డేట్ అవసరం</translation> +<translation id="9211490828691860325">అన్ని డెస్క్లు</translation> <translation id="9214520840402538427">అయ్యో! ఇనస్టలేషన్-సమయ లక్షణాల ప్రారంభ సమయం ముగిసింది. దయచేసి మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation> <translation id="9214695392875603905">కప్ కేక్</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" జోడించబడింది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index c70d6fb..15c427a 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">ซิมการ์ดถูกล็อก</translation> <translation id="2618797463720777311">ตั้งค่าการแชร์ใกล้เคียง</translation> <translation id="2619761439309613843">รีเฟรชทุกวัน</translation> +<translation id="2620215283731032047">ดาวน์โหลด <ph name="FILE_NAME" /> อย่างปลอดภัยไม่ได้</translation> <translation id="2620436844016719705">ระบบ</translation> <translation id="262154978979441594">ฝึกรูปแบบเสียงของ Google Assistant</translation> <translation id="2621713457727696555">ปลอดภัย</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">กำลังค้นหาเมาส์...</translation> <translation id="7052237160939977163">ส่งข้อมูลการติดตามผลการปฏิบัติงาน</translation> <translation id="7053983685419859001">บล็อก</translation> -<translation id="705508001219706572">หากต้องการกลับมาที่นี่อย่างรวดเร็ว ให้ติดตั้ง <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">การเปลี่ยนเส้นทางถูกบล็อก</translation> <translation id="7055451306017383754">เลิกแชร์ไม่ได้เนื่องจากมีแอปพลิเคชันใช้โฟลเดอร์นี้อยู่ โฟลเดอร์นี้จะเลิกแชร์เมื่อมีการปิด Parallels Desktop ครั้งต่อไป</translation> <translation id="7056526158851679338">&ตรวจสอบอุปกรณ์</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">กำลังตรวจสอบการตั้งค่าคอนเทนเนอร์ Linux</translation> <translation id="9209689095351280025">เว็บไซต์ต่างๆ จะใช้คุกกี้ที่ติดตามคุณในอินเทอร์เน็ตไม่ได้</translation> <translation id="9211177926627870898">ต้องอัปเดต</translation> +<translation id="9211490828691860325">เดสก์ทั้งหมด</translation> <translation id="9214520840402538427">อ๊ะ! การเริ่มแอตทริบิวต์เวลาการติดตั้งได้หมดเวลาแล้ว โปรดติดต่อตัวแทนการสนับสนุึนของคุณ</translation> <translation id="9214695392875603905">คัปเค้ก</translation> <translation id="9215293857209265904">เพิ่ม "<ph name="EXTENSION_NAME" />" แล้ว</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 301c206d..277f7d5 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -461,7 +461,7 @@ <translation id="1508491105858779599">Cihazın kilidini açmak için parmağınızı parmak izi sensörünün üzerine yerleştirin.</translation> <translation id="1508575541972276599">Geçerli sürüm: Debian 9 (Stretch)</translation> <translation id="1509281256533087115">USB üzerinden herhangi bir <ph name="DEVICE_NAME_AND_VENDOR" /> cihazına erişme</translation> -<translation id="1509960214886564027">Birçok sitedeki özellikler bozulabilir</translation> +<translation id="1509960214886564027">Birçok sitedeki özellikler çalışmayabilir</translation> <translation id="1510238584712386396">Başlatıcı</translation> <translation id="151070646350206700">Siteler bildirim gönderme isteğinde bulunarak işinizi bölemez</translation> <translation id="1510785804673676069">Bir proxy sunucusu kullanıyorsanız, proxy ayarlarınızı kontrol edin veya @@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">SIM kart kilitli</translation> <translation id="2618797463720777311">Yakındakilerle Paylaş kurulumu</translation> <translation id="2619761439309613843">Günlük Yenileme</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> güvenli bir şekilde indirilemiyor.</translation> <translation id="2620436844016719705">Sistem</translation> <translation id="262154978979441594">Google Asistan ses modelini eğitin</translation> <translation id="2621713457727696555">Güvenlik sağlandı</translation> @@ -2902,7 +2903,7 @@ <translation id="4275830172053184480">Cihazınızı yeniden başlatın</translation> <translation id="4276288850178085042">Sitelerin kameramı kullanmasını engelle</translation> <translation id="4278101229438943600">Asistanınız hazır</translation> -<translation id="4278390842282768270">İzin verilen</translation> +<translation id="4278390842282768270">İzin veriliyor</translation> <translation id="4281844954008187215">Hizmet Şartları</translation> <translation id="4282196459431406533">Smart Lock açık</translation> <translation id="4285418559658561636">Şifreyi Güncelle</translation> @@ -3044,14 +3045,14 @@ <translation id="4450274068924249931">Ekranınız boştayken fotoğrafları, saati, hava durumunu ve medya bilgileri gösterilsin. Ekran koruyucuyu etkinleştirirseniz cihazınız şarj olurken ekranı açık kalır.</translation> <translation id="4450974146388585462">Teşhis Et</translation> <translation id="4451479197788154834">Şifreniz bu cihazda ve Google Hesabınızda kayıtlı</translation> -<translation id="4451757071857432900">Araya giren veya yanıltıcı reklamlar gösteren sitelerde engellendi (önerilen)</translation> +<translation id="4451757071857432900">Araya giren veya yanıltıcı reklamlar gösteren sitelerde engellenir (önerilir)</translation> <translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" /> üzerinde arayın veya bir URL yazın</translation> <translation id="4459169140545916303"><ph name="DEVICE_LAST_ACTIVATED_TIME" /> gün önce etkindi</translation> <translation id="4460014764210899310">Grubu çöz</translation> <translation id="4462159676511157176">Özel ad sunucuları</translation> <translation id="4465236939126352372"><ph name="APP_NAME" /> için <ph name="TIME" /> süreli zaman sınırı ayarla</translation> <translation id="4465725236958772856">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Yöneticiniz tarafından yönetiliyor, Bağlan</translation> -<translation id="4469477701382819144">Araya giren veya yanıltıcı reklamlar gösteren sitelerde engellendi</translation> +<translation id="4469477701382819144">Araya giren veya yanıltıcı reklamlar gösteren sitelerde engellenir</translation> <translation id="4469762931504673593"><ph name="ORIGIN" /> sitesi <ph name="FOLDERNAME" /> klasöründeki dosyaları düzenleyebilir</translation> <translation id="4470957202018033307">Harici depolama tercihleri</translation> <translation id="4471354919263203780">Konuşma tanıma dosyaları indiriliyor... %<ph name="PERCENT" /></translation> @@ -4080,7 +4081,7 @@ <translation id="567587836466137939">Bu cihaz, <ph name="MONTH_AND_YEAR" /> tarihine kadar otomatik yazılım ve güvenlik güncellemelerini alacak. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="567643736130151854">Tüm cihazlarda yer işaretlerinizi, şifrelerinizi ve daha pek çok şeyi almak için oturum açın ve senkronizasyonu etkinleştirin</translation> <translation id="5677503058916217575">Sayfanın dili:</translation> -<translation id="5677928146339483299">Engellendi</translation> +<translation id="5677928146339483299">Engelleniyor</translation> <translation id="5678550637669481956"><ph name="VOLUME_NAME" /> birimine okuma ve yazma erişimi izni verildi.</translation> <translation id="5678955352098267522"><ph name="WEBSITE_1" /> sitesindeki verilerinizi okuma</translation> <translation id="5680050361008726776">"<ph name="ESIM_PROFILE_NAME" />" kaldırılsın mı?</translation> @@ -4136,7 +4137,7 @@ <translation id="5739235828260127894">Doğrulama bekleniyor. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Çok büyük</translation> <translation id="5740328398383587084">Yakındakilerle Paylaş</translation> -<translation id="5740820643029013514">Sessiz mesajlaşmayı kullan (önerilir)</translation> +<translation id="5740820643029013514">İletişim daha sessiz kurulsun (önerilir)</translation> <translation id="574104302965107104">Ekran yansıtma</translation> <translation id="574209121243317957">Ses Kalınlığı</translation> <translation id="5742505912938664543">Buraya ikincil hesap eklediğinizde bu hesabı kullanarak web'e göz atabilir, uygulama indirebilir, Gmail'inizi ve diğer Google hizmetlerini kontrol edebilirsiniz.</translation> @@ -4382,7 +4383,7 @@ <translation id="6032715498678347852">Bir uzantının bu siteye erişmesine izin vermek için uzantıyı tıklayın.</translation> <translation id="6032912588568283682">Dosya sistemi</translation> <translation id="603539183851330738">Otomatik düzeltmeyi geri alma düğmesi. Yazımı <ph name="TYPED_WORD" /> biçimine geri döndürün. Etkinleştirmek için enter, kapatmak için escape tuşuna basın.</translation> -<translation id="6038929619733116134">Site, araya giren veya yanıltıcı reklamlar gösteriyorsa engelleyin</translation> +<translation id="6038929619733116134">Sitede araya giren veya yanıltıcı reklamlar engellensin</translation> <translation id="6039651071822577588">Ağ mülkü sözlüğü bozuk</translation> <translation id="6040143037577758943">Kapat</translation> <translation id="6040852767465482106">Anonim Kimlik</translation> @@ -4594,7 +4595,7 @@ <translation id="6267166720438879315"><ph name="HOST_NAME" /> sunucusunda kimliğinizi doğrulamak için bir sertifika seçin</translation> <translation id="6267547857941397424">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="PHONE_NAME" />, %<ph name="SIGNAL_STRENGTH" /> Sinyal Gücü, %<ph name="BATTERY_STATUS" /> Telefon Pili, Bağlan</translation> <translation id="6268252012308737255"><ph name="APP" /> ile aç</translation> -<translation id="6270391203985052864">Siteler bildirim göndermek isteyebilir</translation> +<translation id="6270391203985052864">Siteler bildirim gönderme izni isteyebilir</translation> <translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Sistem ve uygulama bilgilerini<ph name="END_LINK1" /> ve <ph name="BEGIN_LINK2" />metrikleri<ph name="END_LINK2" /> gönder</translation> <translation id="6271348838875430303">düzeltme geri alındı</translation> <translation id="6272643420381259437">Eklenti indirilirken bir hata (<ph name="ERROR" />) oluştu</translation> @@ -4847,7 +4848,7 @@ <translation id="6556903358015358733">Tema ve Duvar Kağıdı</translation> <translation id="6557290421156335491">Kısayollarım</translation> <translation id="6560151649238390891">Öneri eklendi</translation> -<translation id="6561560012278703671">Bilgiyi daha az rahatsız edici bir şekilde alın (bildirim istemlerinin sizi rahatsız etmesini engelleyin)</translation> +<translation id="6561560012278703671">İletişim daha sessiz kurulsun (bildirim istemlerinin sizi rahatsız etmesini engeller)</translation> <translation id="6561726789132298588">enter</translation> <translation id="6562117348069327379">Sistem günlüklerini İndirilenler konumunda saklayın.</translation> <translation id="656293578423618167">Dosya yolu veya adı çok uzun. Lütfen daha kısa bir adla veya başka bir konuma kaydedin.</translation> @@ -4982,7 +4983,7 @@ <translation id="6731877319426971768">Konuşma tanıma dosyaları indirildi</translation> <translation id="6732801395666424405">Sertifikalar yüklenmedi</translation> <translation id="6732900235521116609">Kısayol kaldırılamıyor</translation> -<translation id="6734468588183300211">Gizli moddayken siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezlerinizi kullanamaz. Bazı sitelerdeki özellikler bozulabilir.</translation> +<translation id="6734468588183300211">Gizli moddayken siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezlerinizi kullanamaz. Bazı sitelerdeki özellikler çalışmayabilir.</translation> <translation id="6735304988756581115">Çerezleri ve diğer site verilerini göster...</translation> <translation id="6736243959894955139">Adres</translation> <translation id="6736329909263487977"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />]</translation> @@ -4995,7 +4996,7 @@ <translation id="6746124502594467657">Aşağı taşı</translation> <translation id="674632704103926902">Hafifçe vurarak sürüklemeyi etkinleştir</translation> <translation id="6748465660675848252">Devam edebilirsiniz, ancak yalnızca senkronize edilen verileriniz ve ayarlarınız geri yüklenecek. Tüm yerel verileri kaybedeceksiniz.</translation> -<translation id="6749006854028927059">Siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezlerinizi kullanamaz. Bazı sitelerdeki özellikler bozulabilir.</translation> +<translation id="6749006854028927059">Siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezlerinizi kullanamaz. Bazı sitelerdeki özellikler çalışmayabilir.</translation> <translation id="6750757184909117990">Hücresel bağlantıyı devre dışı bırak</translation> <translation id="6750946710563435348">Başka kullanıcı adı kullan</translation> <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (Gizli mod)</translation> @@ -5264,7 +5265,6 @@ <translation id="7051943809462976355">Fare aranıyor...</translation> <translation id="7052237160939977163">Performans izleme verilerini gönder</translation> <translation id="7053983685419859001">Engelle</translation> -<translation id="705508001219706572">Buraya kolayca geri dönmek için <ph name="APP_NAME" /> uygulamasını yükleyin</translation> <translation id="7055152154916055070">Yönlendirme engellendi:</translation> <translation id="7055451306017383754">Bir uygulama bu klasörü kullandığından paylaşım kaldırılamadı. Parallels Desktop kapatıldığında klasörün paylaşımı kaldırılacak.</translation> <translation id="7056526158851679338">&Cihazları Denetle</translation> @@ -6814,7 +6814,7 @@ <translation id="881799181680267069">Diğerlerini Gizle</translation> <translation id="8818152010000655963">Duvar kağıdı</translation> <translation id="8818958672113348984">Telefonumu kullanarak doğrula</translation> -<translation id="8820817407110198400">Favoriler</translation> +<translation id="8820817407110198400">Yer işaretleri</translation> <translation id="8821045908425223359">IP adresini otomatik olarak yapılandır</translation> <translation id="8821268776955756404"><ph name="APP_NAME" /> kullanıma hazır.</translation> <translation id="882204272221080310">Daha fazla güvenlik için donanım yazılımını güncelle.</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Linux kapsayıcı kurulumu kontrol ediliyor</translation> <translation id="9209689095351280025">Siteler sizi web'de takip eden çerezler kullanamaz</translation> <translation id="9211177926627870898">Güncelleme gerekli</translation> +<translation id="9211490828691860325">Tüm masalar</translation> <translation id="9214520840402538427">Hata! Yükleme zamanı özniteliklerini başlatma işlemi zaman aşımına uğradı. Lütfen destek temsilcinizle görüşün.</translation> <translation id="9214695392875603905">Küçük kek</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" eklendi</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 3a869bd..1b91881c 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1452,6 +1452,7 @@ <translation id="2617342710774726426">SIM-карту заблоковано</translation> <translation id="2618797463720777311">Налаштуйте функцію "Передавання поблизу"</translation> <translation id="2619761439309613843">Щоденне оновлення</translation> +<translation id="2620215283731032047">Не вдається безпечно завантажити файл "<ph name="FILE_NAME" />".</translation> <translation id="2620436844016719705">Система</translation> <translation id="262154978979441594">Навчити Google Асистента розпізнавати зразок голосу</translation> <translation id="2621713457727696555">Захищено</translation> @@ -5266,7 +5267,6 @@ <translation id="7051943809462976355">Пошук миші…</translation> <translation id="7052237160939977163">Надсилати дані відстеження ефективності</translation> <translation id="7053983685419859001">Блокувати</translation> -<translation id="705508001219706572">Щоб швидко повертатися сюди, установіть додаток <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Переадресацію заблоковано:</translation> <translation id="7055451306017383754">Не вдалося закрити доступ, оскільки цю папку використовує додаток. Доступ до неї буде закрито після завершення роботи Parallels Desktop.</translation> <translation id="7056526158851679338">&Перевірити пристрої</translation> @@ -7169,6 +7169,7 @@ <translation id="9209563766569767417">Перевірка налаштувань контейнера Linux</translation> <translation id="9209689095351280025">Сайти не можуть використовувати файли cookie, щоб відстежувати ваші дії в Інтернеті</translation> <translation id="9211177926627870898">Потрібне оновлення</translation> +<translation id="9211490828691860325">Усі робочі столи</translation> <translation id="9214520840402538427">На жаль, ініціалізація атрибутів часу встановлення минула. Зв’яжіться з представником служби підтримки.</translation> <translation id="9214695392875603905">Кекс</translation> <translation id="9215293857209265904">Додано розширення "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 2f2ff314..ef5e1fd 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">SIM کارڈ مقفل ہے</translation> <translation id="2618797463720777311">قریبی آلات کے ساتھ اشتراک کو سیٹ اپ کریں</translation> <translation id="2619761439309613843">روزانہ ریفریش کریں</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> فائل کو محفوظ طریقے سے ڈاؤن لوڈ نہیں کیا جا سکتا ہے۔</translation> <translation id="2620436844016719705">سسٹم</translation> <translation id="262154978979441594">Google اسسٹنٹ صوتی ماڈل کی تربیت کریں</translation> <translation id="2621713457727696555">محفوظ ہے</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">ماؤس کی تلاش ہو رہی ہے…</translation> <translation id="7052237160939977163">کارکردگی کا پتا لگانے کا ڈیٹا بھیجیں</translation> <translation id="7053983685419859001">مسدود کریں</translation> -<translation id="705508001219706572">فوری طور پر یہاں واپس آنے کے لیے <ph name="APP_NAME" /> انسٹال کریں</translation> <translation id="7055152154916055070">ری ڈائریکٹ مسدود کیا گیا:</translation> <translation id="7055451306017383754">اشتراک ختم نہیں ہوسکا کیونکہ ایک ایپلیکیشن اس فولڈر کو استعمال کر رہی ہے۔ اگلی بار Parallels Desktop بند ہونے پر فولڈر کا اشتراک ختم کر دیا جائے گا۔</translation> <translation id="7056526158851679338">آلات کا &معائنہ کریں</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Linux کنٹینر کا سیٹ اپ چیک کیا جا رہا ہے</translation> <translation id="9209689095351280025">سائٹس ان کوکیز کا استعمال نہیں کر سکتی ہیں جو آپ کو پورے ویب پر ٹریک کرتی ہیں</translation> <translation id="9211177926627870898">اپ ڈیٹ درکار ہے</translation> +<translation id="9211490828691860325">تمام ڈیسکس</translation> <translation id="9214520840402538427">افوہ! انسٹالیشن کے وقت کے انتسابات کے آغاز کا وقت ختم ہوگیا ہے۔ براہ کرم اپنے امدادی نمائندہ سے رابطہ کریں۔</translation> <translation id="9214695392875603905">کپ کیک</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" شامل کر دیا گیا</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 37ec376..2fd6403 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">SIM karta qulflangan</translation> <translation id="2618797463720777311">Yaqin-atrofga yuborish funksiyasini sozlash</translation> <translation id="2619761439309613843">Kundalik yangilash</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" /> faylini xavfsiz yuklab olish imkonsiz.</translation> <translation id="2620436844016719705">Tizim</translation> <translation id="262154978979441594">Google Assistent ovoz modelini oʻqiting</translation> <translation id="2621713457727696555">Himoyalangan</translation> @@ -5262,7 +5263,6 @@ <translation id="7051943809462976355">Sichqoncha qidirilmoqda...</translation> <translation id="7052237160939977163">Unumdorlik kuzatuvi ma’lumotlarini jo‘natish</translation> <translation id="7053983685419859001">Taqiqlash</translation> -<translation id="705508001219706572">Bunga tez qaytish uchun <ph name="APP_NAME" /> ilovasini oʻrnating</translation> <translation id="7055152154916055070">Yo‘naltirish bloklandi:</translation> <translation id="7055451306017383754">Bu jild bandligi sababli umumiy ruxsat bekor qilinmadi. Jildga umumiy ruxsat Parallels Desktop qayta ishga tushganda bekor qilinadi.</translation> <translation id="7056526158851679338">&Qurilmalarni tekshirish</translation> @@ -7162,6 +7162,7 @@ <translation id="9209563766569767417">Linux konteyneri sozlamalari tekshirilmoqda</translation> <translation id="9209689095351280025">Saytlar sizni internet boʻylab kuzatadigan cookie fayllardan foydalana olmaydi.</translation> <translation id="9211177926627870898">Yangilash zarur</translation> +<translation id="9211490828691860325">Barcha ish stollari</translation> <translation id="9214520840402538427">Afsuski, vaqt sozlamalarini o‘rnatishga tayyorlash vaqti tugadi. Xizmat ko‘rsatish markazi bilan bog‘laning.</translation> <translation id="9214695392875603905">Keks</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" qo‘shildi</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 628b085..17b90c0 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1449,6 +1449,7 @@ <translation id="2617342710774726426">Thẻ SIM bị khóa</translation> <translation id="2618797463720777311">Thiết lập tính năng Chia sẻ lân cận</translation> <translation id="2619761439309613843">Làm mới hàng ngày</translation> +<translation id="2620215283731032047">Không thể tải <ph name="FILE_NAME" /> xuống một cách an toàn.</translation> <translation id="2620436844016719705">Hệ thống</translation> <translation id="262154978979441594">Đào tạo mẫu giọng nói cho Trợ lý Google</translation> <translation id="2621713457727696555">Đã bảo mật</translation> @@ -5263,7 +5264,6 @@ <translation id="7051943809462976355">Đang tìm kiếm chuột...</translation> <translation id="7052237160939977163">Gửi dữ liệu theo dõi hoạt động</translation> <translation id="7053983685419859001">Chặn</translation> -<translation id="705508001219706572">Để quay lại đây nhanh hơn, hãy cài đặt <ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Liên kết chuyển hướng đã chặn:</translation> <translation id="7055451306017383754">Không thể ngừng chia sẻ vì một ứng dụng đang dùng thư mục này. Hệ thống sẽ ngừng chia sẻ thư mục này khi bạn tắt Parallels Desktop vào lần tới.</translation> <translation id="7056526158851679338">&Kiểm tra thiết bị</translation> @@ -7163,6 +7163,7 @@ <translation id="9209563766569767417">Đang kiểm tra quá trình thiết lập vùng chứa Linux</translation> <translation id="9209689095351280025">Các trang web không thể dùng cookie theo dõi bạn trên web</translation> <translation id="9211177926627870898">Yêu cầu cập nhật</translation> +<translation id="9211490828691860325">Tất cả các không gian làm việc</translation> <translation id="9214520840402538427">Rất tiếc! Việc chạy thuộc tính thời gian cài đặt đã hết thời gian. Vui lòng liên hệ với người đại diện hỗ trợ của bạn.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">Đã thêm "<ph name="EXTENSION_NAME" />"</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 6b4c1664..6b55c005 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -914,7 +914,7 @@ <translation id="2007404777272201486">报告问题...</translation> <translation id="2010501376126504057">兼容的设备</translation> <translation id="2017334798163366053">停用性能数据收集</translation> -<translation id="2017836877785168846">清除历史记录和地址栏中的自动填充项。</translation> +<translation id="2017836877785168846">清除历史记录和地址栏中的自动补全项。</translation> <translation id="2018352199541442911">抱歉,系统目前不支持您的外部存储设备。</translation> <translation id="2019718679933488176">在新标签页中打开音频(&O)</translation> <translation id="2020183425253392403">显示网络地址设置</translation> @@ -1445,6 +1445,7 @@ <translation id="2617342710774726426">SIM 卡已被锁定</translation> <translation id="2618797463720777311">设置“附近分享”功能</translation> <translation id="2619761439309613843">每日刷新</translation> +<translation id="2620215283731032047">无法安全地下载“<ph name="FILE_NAME" />”。</translation> <translation id="2620436844016719705">系统</translation> <translation id="262154978979441594">训练 Google 助理语音模型</translation> <translation id="2621713457727696555">受保护</translation> @@ -2415,7 +2416,7 @@ <translation id="3713047097299026954">此安全密钥不含任何登录数据</translation> <translation id="3714195043138862580">此演示设备目前处于“已取消配置”状态。</translation> <translation id="3714633008798122362">网络日历</translation> -<translation id="3719826155360621982">首页</translation> +<translation id="3719826155360621982">主页</translation> <translation id="372062398998492895">CUPS</translation> <translation id="3721119614952978349">您与 Google</translation> <translation id="3722108462506185496">启动虚拟机服务时出错。请重试。</translation> @@ -3540,7 +3541,7 @@ <translation id="5060332552815861872">有 1 台可保存的打印机。</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{此文件夹包含 1 个书签。确定要删除此文件夹吗?}other{此文件夹包含 # 个书签。确定要删除此文件夹吗?}}</translation> <translation id="5062930723426326933">登录失败,请连接到互联网,然后重试。</translation> -<translation id="5063480226653192405">使用情况</translation> +<translation id="5063480226653192405">空间占用量</translation> <translation id="5065775832226780415">Smart Lock</translation> <translation id="5067399438976153555">始终启用</translation> <translation id="5067867186035333991">当 <ph name="HOST" /> 想要使用麦克风时询问我</translation> @@ -4130,7 +4131,7 @@ <translation id="5739235828260127894">正在等待验证。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="5739458112391494395">特大</translation> <translation id="5740328398383587084">附近分享</translation> -<translation id="5740820643029013514">使用静态消息通知(推荐)</translation> +<translation id="5740820643029013514">使用干扰性更低的提示方式(推荐)</translation> <translation id="574104302965107104">显示屏镜像</translation> <translation id="574209121243317957">音高</translation> <translation id="5742505912938664543">在此处添加辅助帐号后,您便可使用该帐号浏览网页、下载应用、查看 Gmail 及其他 Google 服务。</translation> @@ -4841,7 +4842,7 @@ <translation id="6556903358015358733">主题背景和壁纸</translation> <translation id="6557290421156335491">我的快捷方式</translation> <translation id="6560151649238390891">已插入建议</translation> -<translation id="6561560012278703671">改用静态指示方式(禁止网站发送通知,以免干扰)</translation> +<translation id="6561560012278703671">改用干扰性更低的提示方式(禁止网站发送通知,以免干扰)</translation> <translation id="6561726789132298588">Enter</translation> <translation id="6562117348069327379">将系统日志存储到“下载内容”目录中。</translation> <translation id="656293578423618167">该文件的路径或名称过长。请以较短的名称保存或保存到其他位置。</translation> @@ -5258,7 +5259,6 @@ <translation id="7051943809462976355">正在搜索鼠标…</translation> <translation id="7052237160939977163">发送性能跟踪数据</translation> <translation id="7053983685419859001">禁止</translation> -<translation id="705508001219706572">若要快速返回到这里,请安装“<ph name="APP_NAME" />”</translation> <translation id="7055152154916055070">已禁止重定向:</translation> <translation id="7055451306017383754">无法停止共享,因为有一个应用正在使用此文件夹。系统将会在下次关闭 Parallels Desktop 时停止共享此文件夹。</translation> <translation id="7056526158851679338">检查设备(&I)</translation> @@ -5322,7 +5322,7 @@ <translation id="711840821796638741">显示托管书签</translation> <translation id="711902386174337313">读取您登录过的设备的列表</translation> <translation id="7120865473764644444">无法连接到同步服务器。正在重试…</translation> -<translation id="7121362699166175603">清除历史记录和地址栏中的自动填充项。您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的浏览记录。</translation> +<translation id="7121362699166175603">清除历史记录和地址栏中的自动补全项。您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的浏览记录。</translation> <translation id="7121438501124788993">开发者模式</translation> <translation id="7121728544325372695">智能破折号</translation> <translation id="7122353087820324370">应用和 Chrome 操作系统设置不会同步到辅助帐号。</translation> @@ -5559,7 +5559,7 @@ <translation id="7409549334477097887">特大</translation> <translation id="7409735910987429903">网站可能会发送弹出式窗口以展示广告,或者使用重定向将您引导至您可能不想访问的网站</translation> <translation id="7410344089573941623"><ph name="HOST" /> 想要使用摄像头和麦克风时询问我是否同意</translation> -<translation id="741204030948306876">立即启用</translation> +<translation id="741204030948306876">立即开启</translation> <translation id="7412226954991670867">GPU 内存</translation> <translation id="7414464185801331860">18 倍</translation> <translation id="7415454883318062233">设置已完成</translation> @@ -5817,7 +5817,7 @@ <translation id="7702574632857388784">从列表中移除 <ph name="FILE_NAME" /></translation> <translation id="7702907602086592255">域名</translation> <translation id="7704305437604973648">任务</translation> -<translation id="7704317875155739195">自动填充搜索字词和网址</translation> +<translation id="7704317875155739195">自动补全搜索字词和网址</translation> <translation id="7704521324619958564">打开 Play 商店</translation> <translation id="7705276765467986571">无法加载书签模型。</translation> <translation id="7705524343798198388">VPN</translation> @@ -6566,7 +6566,7 @@ <translation id="8561853412914299728">“<ph name="TAB_TITLE" />”<ph name="EMOJI_PLAYING" /></translation> <translation id="8565650234829130278">已尝试降低应用版本。</translation> <translation id="8569682776816196752">未找到任何目标</translation> -<translation id="8571213806525832805">近 4 周</translation> +<translation id="8571213806525832805">过去 4 周</translation> <translation id="8571687764447439720">添加 Kerberos 票据</translation> <translation id="8571814292654854151">为您的个人资料命名</translation> <translation id="8574990355410201600">始终允许 <ph name="HOST" /> 播放声音</translation> @@ -6653,7 +6653,7 @@ <translation id="8661290697478713397">在隐身窗口中打开链接(&G)</translation> <translation id="8662671328352114214">加入<ph name="TYPE" />网络</translation> <translation id="8662795692588422978">用户</translation> -<translation id="8662811608048051533">您会从大多数网站退出。</translation> +<translation id="8662811608048051533">会致使您从大多数网站退出。</translation> <translation id="8662911384982557515">将您的主页更改为:<ph name="HOME_PAGE" /></translation> <translation id="8662978096466608964">Chrome 无法设置壁纸。</translation> <translation id="8663099077749055505">始终禁止在 <ph name="HOST" /> 上自动下载多个文件</translation> @@ -7157,6 +7157,7 @@ <translation id="9209563766569767417">正在检查 Linux 容器设置</translation> <translation id="9209689095351280025">网站无法使用 Cookie 来跟踪您在网上的活动</translation> <translation id="9211177926627870898">需要更新</translation> +<translation id="9211490828691860325">所有桌面</translation> <translation id="9214520840402538427">糟糕!安装时间属性的初始化已过期,请与您的支持代表联系。</translation> <translation id="9214695392875603905">纸杯蛋糕</translation> <translation id="9215293857209265904">已添加“<ph name="EXTENSION_NAME" />”</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index e12e2eb..8b4f34f 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">SIM 卡已鎖定</translation> <translation id="2618797463720777311">設定「咫尺共享」</translation> <translation id="2619761439309613843">每日重新整理</translation> +<translation id="2620215283731032047">無法安全下載「<ph name="FILE_NAME" />」。</translation> <translation id="2620436844016719705">系統</translation> <translation id="262154978979441594">訓練「Google 助理」語音模型</translation> <translation id="2621713457727696555">已受保護</translation> @@ -5264,7 +5265,6 @@ <translation id="7051943809462976355">正在搜尋滑鼠…</translation> <translation id="7052237160939977163">傳送效能追蹤數據</translation> <translation id="7053983685419859001">封鎖</translation> -<translation id="705508001219706572">如要快速返回此處,請安裝「<ph name="APP_NAME" />」</translation> <translation id="7055152154916055070">已禁止重新導向:</translation> <translation id="7055451306017383754">某個應用程式正在使用此資料夾,因此無法取消分享。系統會在下次關閉 Parallels Desktop 時取消分享此資料夾。</translation> <translation id="7056526158851679338">檢查裝置(&I)</translation> @@ -7164,6 +7164,7 @@ <translation id="9209563766569767417">正在檢查 Linux 容器設定</translation> <translation id="9209689095351280025">網站不能使用 Cookie 追蹤您的網絡活動</translation> <translation id="9211177926627870898">必須更新</translation> +<translation id="9211490828691860325">所有桌面</translation> <translation id="9214520840402538427">糟糕!系統嘗試初始設定安裝時間 (installation-time) 屬性,但是動作已逾時。請與您的支援代表聯絡。</translation> <translation id="9214695392875603905">紙杯蛋糕</translation> <translation id="9215293857209265904">已新增「<ph name="EXTENSION_NAME" />」</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index de854ad..fb9c2589 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1448,6 +1448,7 @@ <translation id="2617342710774726426">SIM 卡已鎖定</translation> <translation id="2618797463720777311">設定鄰近分享功能</translation> <translation id="2619761439309613843">每日變換新桌布</translation> +<translation id="2620215283731032047">無法安全下載「<ph name="FILE_NAME" />」。</translation> <translation id="2620436844016719705">系統</translation> <translation id="262154978979441594">訓練 Google 助理的語音模型</translation> <translation id="2621713457727696555">已受到安全保護</translation> @@ -5261,7 +5262,6 @@ <translation id="7051943809462976355">正在搜尋滑鼠...</translation> <translation id="7052237160939977163">傳送效能追蹤資料</translation> <translation id="7053983685419859001">封鎖</translation> -<translation id="705508001219706572">如要快速返回此處,請安裝「<ph name="APP_NAME" />」</translation> <translation id="7055152154916055070">已禁止重新導向:</translation> <translation id="7055451306017383754">某個應用程式正在使用這個資料夾,因此無法取消分享。系統會在下次關閉 Parallels Desktop 時取消分享這個資料夾。</translation> <translation id="7056526158851679338">檢查裝置 (&I)</translation> @@ -7160,6 +7160,7 @@ <translation id="9209563766569767417">正在檢查 Linux 容器設定</translation> <translation id="9209689095351280025">網站無法使用 Cookie 來追蹤你在網路上的活動</translation> <translation id="9211177926627870898">必須更新</translation> +<translation id="9211490828691860325">所有桌面</translation> <translation id="9214520840402538427">糟糕!系統嘗試初始設定安裝時間 (installation-time) 屬性,但是動作已逾時。請洽詢你的支援代表。</translation> <translation id="9214695392875603905">杯子蛋糕</translation> <translation id="9215293857209265904">已新增「<ph name="EXTENSION_NAME" />」</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 0b4c98cc..d0ca68c 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1450,6 +1450,7 @@ <translation id="2617342710774726426">I-SIM card ikhiyiwe</translation> <translation id="2618797463720777311">Sesha Ukuthumela Eduze</translation> <translation id="2619761439309613843">Ukuvuselela kwansuku zonke</translation> +<translation id="2620215283731032047"><ph name="FILE_NAME" />ayikwazi ukulandwa ngokuvikelekile.</translation> <translation id="2620436844016719705">Isistimu</translation> <translation id="262154978979441594">Qeqesha Umsizi we-Google ngemodeli yezwi</translation> <translation id="2621713457727696555">Kuvikelwe</translation> @@ -5265,7 +5266,6 @@ <translation id="7051943809462976355">Iseshela igundane...</translation> <translation id="7052237160939977163">Thumela idatha yokulandelela ukusebenza</translation> <translation id="7053983685419859001">Vimba</translation> -<translation id="705508001219706572">Ukuze ubuye lapha ngokushesha, faka i-<ph name="APP_NAME" /></translation> <translation id="7055152154916055070">Ukuqondiswa kabusha kuvinjiwe:</translation> <translation id="7055451306017383754">Akukwazanga ukuyeka ukwabelana ngoba uhlelo lokusebenza lusebenzisa le folda. Ifolda izoyeka ukwabiwa uma i-Parallels Desktop ilandela ukucishwa.</translation> <translation id="7056526158851679338">&Hlola amadivayisi</translation> @@ -7167,6 +7167,7 @@ <translation id="9209563766569767417">Kuhlola isiqukathi sokusetha se-Linux</translation> <translation id="9209689095351280025">Amasayithi awakwazi ukusebenzisa amakhukhi akulandelayo kuwebhu yonkana</translation> <translation id="9211177926627870898">Isibuyekezo siyadingeka</translation> +<translation id="9211490828691860325">Wonke amatafula</translation> <translation id="9214520840402538427">Eshu! Ukuqaliswa kwezichasiso zesikhathi sokufakwa kuphelelwe yisikhathi. Sicela uxhumane nabaqokelwe ukumela abanye bakho bosekelo.</translation> <translation id="9214695392875603905">I-Cupcake</translation> <translation id="9215293857209265904">I-"<ph name="EXTENSION_NAME" />" ingeziwe</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index 92e8507..b6e7ab6 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Chrome OSን ዳግም አስጀምር</translation> <translation id="5132929315877954718">ለGoogle Chrome ምርጥ መተግበሪያዎችን፣ ጨዋታዎችን፣ ቅጥያዎችን እና ገጽታዎችን ያግኙ።</translation> +<translation id="5139423532931106058">የChrome መገለጫዎን ያብጁ</translation> +<translation id="5163087008893166964">እንኳን ወደ Chrome በደህና መጡ፤ አዲስ የአሳሽ መስኮት ተከፍቷል።</translation> <translation id="5170938038195470297">መገለጫዎ የአዲስ Google Chrome ስሪት አካል ስለሆነ መጠቀም አይቻልም። አንዳንድ ባሕሪያት ላይገኙ ይችላሉ። እባክዎ የተለየ የመገለጫ አቃፊ ይግለጹ ወይም አዲሱን የChrome ስሪት ይጠቀሙ።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index 06b13eb..82824e0 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -286,6 +286,6 @@ <translation id="911206726377975832">هل تريد أيضًا حذف بيانات التصفح؟</translation> <translation id="9138603949443464873">لتطبيق التغييرات، يُرجى إعادة تشغيل Chrome</translation> <translation id="919706545465235479">تحديث Chrome لبدء المزامنة</translation> -<translation id="94743460404517794">إذا كانت لديك حسابات متعددة في Google، يمكنك إضافتها على جهاز <ph name="DEVICE_TYPE" />. وستكون حساباتك متوفّرة في متصفِّح Chrome و"متجر Play"، بالإضافة إلى خدمات مثل Gmail وDrive وYouTube. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> +<translation id="94743460404517794">إذا كانت لديك حسابات متعددة على Google، يمكنك إضافتها إلى جهاز <ph name="DEVICE_TYPE" />. وستكون حساباتك متوفّرة في متصفِّح Chrome و"متجر Play"، بالإضافة إلى خدمات مثل Gmail وDrive وYouTube. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="989369509083708165">Google Chrome هو متصفحك التلقائي</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 9a8f52f..614d706 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Перазапусціце Chrome OS</translation> <translation id="5132929315877954718">Адкрывайце для сябе выдатныя праграмы, гульні, пашырэнні і тэмы для Google Chrome.</translation> +<translation id="5139423532931106058">Наладзьце свой профіль Chrome</translation> +<translation id="5163087008893166964">Вітаем у Chrome! Адкрыта новае акно браўзера</translation> <translation id="5170938038195470297">Ваш профіль нельга выкарыстоўваць, бо ён з навейшай версіі Google Chrome. Некаторыя функцыі могуць быць недаступныя. Укажыце іншы каталог профілю або выкарыстайце навейшую версію Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 7334865f..8c6462ecc 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -154,6 +154,8 @@ <translation id="4990567037958725628">Google Chrome ক্যানারি</translation> <translation id="5062123544085870375">Chrome OS রিস্টার্ট করুন</translation> <translation id="5132929315877954718">Google Chrome-এর দুর্দান্ত অ্যাপ্লিকেশান, গেম, এক্সটেনশান এবং থিম আবিষ্কার করুন৷</translation> +<translation id="5139423532931106058">আপনার Chrome প্রোফাইল কাস্টমাইজ করুন</translation> +<translation id="5163087008893166964">Chrome-এ স্বাগতম; নতুন ব্রাউজার উইন্ডো খোলা হয়েছে</translation> <translation id="5170938038195470297">আপনার প্রোফাইল ব্যবহার করা যাবে কারণ এটি Google Chrome-এর একটি নতুন ভার্সনে গঠিত৷ কিছু বৈশিষ্ট্য অনুপলভ্য হতে পারে৷ একটি ভিন্ন প্রোফাইল নির্দেশিকা সুনির্দিষ্টভাবে উল্লেখ করুন অথবা Chrome এর নতুন ভার্সন ব্যবহার করুন৷</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index eb4baecb..95a4b6d 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -152,6 +152,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Reinicia Chrome OS</translation> <translation id="5132929315877954718">Descobriu aplicacions, jocs, extensions i temes genials per a Google Chrome.</translation> +<translation id="5139423532931106058">Personalitza el teu perfil de Chrome</translation> +<translation id="5163087008893166964">Et donem la benvinguda a Chrome; s'ha obert una altra finestra del navegador</translation> <translation id="5170938038195470297">El vostre perfil no es pot utilitzar perquè prové d'una versió més nova de Google Chrome. Pot ser que algunes funcions no estiguin disponibles. Especifiqueu un directori de perfil diferent o utilitzeu una versió més nova de Chrome.</translation> <translation id="5193136243808726294">Google Chrome OS no pot obrir aquesta pàgina.</translation> <translation id="5251420635869119124">Els convidats poden utilitzar Chrome sense deixar-hi rastre.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index e24620b..3c0f52a 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Restartujte systém Chrome OS</translation> <translation id="5132929315877954718">Objevte skvělé aplikace, hry, rozšíření a motivy prohlížeče Google Chrome.</translation> +<translation id="5139423532931106058">Upravit profil Chrome</translation> +<translation id="5163087008893166964">Vítá vás Chrome; bylo otevřeno nové okno prohlížeče</translation> <translation id="5170938038195470297">Nelze použít váš profil, protože byl vytvořen v novější verzi aplikace Google Chrome. Některé funkce mohou být nedostupné. Zadejte prosím jiný adresář profilu, nebo používejte novější verzi aplikace Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 00eeea9..f6f5978fb 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Berrabiarazi Chrome OS</translation> <translation id="5132929315877954718">Ezagutu Google Chrome-rako aplikazio, joko, luzapen eta gai bikainak.</translation> +<translation id="5139423532931106058">Pertsonalizatu Chrome-ko profila</translation> +<translation id="5163087008893166964">Ongi etorri Chrome-ra; beste leiho bat ireki da arakatzailean</translation> <translation id="5170938038195470297">Ezin da profila erabili Google Chrome-ren bertsio berriago batekoa delako. Agian eginbide batzuk ez dira erabilgarri egongo. Zehaztu profilaren beste direktorio bat edo erabili Chrome-ren bertsio berriagoa.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index ec275d03..1a8376c2 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -152,6 +152,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">بازراهاندازی سیستمعامل Chrome</translation> <translation id="5132929315877954718">برنامههای کاربردی، بازیها، افزونهها و طرحهای زمینه فوقالعاده را برای Google Chrome کاوش کنید.</translation> +<translation id="5139423532931106058">سفارشی کردن نمایه Chrome</translation> +<translation id="5163087008893166964">به Chrome خوشآمدید؛ پنجره مرورگر جدید راهاندازی شد</translation> <translation id="5170938038195470297">نمایهٔ شما نمیتواند استفاده شود زیرا مربوط به یک نسخه جدیدتر از Google Chrome است. بعضی از ویژگیها ممکن است موجود نباشند. لطفاً یک مسیر دیگر برای نمایه تعیین کنید یا از نسخه جدیدتر Chrome استفاده کنید.</translation> <translation id="5193136243808726294">Google Chrome OS نمیتواند این صفحه را باز کند.</translation> <translation id="5251420635869119124">مهمانها میتوانند از Chrome استفاده کنند بدون اینکه اثری از خود به جا بگذارند.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 4d14b16..b6ca61c 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -152,6 +152,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Käynnistä Chrome OS uudelleen</translation> <translation id="5132929315877954718">Löydät hienoja sovelluksia, pelejä ja teemoja Google Chromelle.</translation> +<translation id="5139423532931106058">Muokkaa Chrome-profiiliasi</translation> +<translation id="5163087008893166964">Tervetuloa Chromeen, uusi selainikkuna avattu</translation> <translation id="5170938038195470297">Profiiliasi ei voi käyttää, koska se on peräisin uudemmasta Google Chromen versiosta. Kaikkia toimintoja ei välttämättä voi käyttää. Määritä toinen profiilihakemisto tai käytä uudempaa Chromen versiota.</translation> <translation id="5193136243808726294">Google Chrome ‑käyttöjärjestelmä ei voi avata tätä sivua.</translation> <translation id="5251420635869119124">Vierailijat voivat käyttää Chromea jälkiä jättämättä.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 1182ff9..61a28f4 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Redémarrer Chrome OS</translation> <translation id="5132929315877954718">Découvrez des applications, des jeux, des extensions et des thèmes exceptionnels conçus pour Google Chrome.</translation> +<translation id="5139423532931106058">Personnaliser votre profil Chrome</translation> +<translation id="5163087008893166964">Bienvenue à Chrome, une nouvelle fenêtre de navigateur a été ouverte</translation> <translation id="5170938038195470297">Votre profil ne peut pas être utilisé parce qu'il provient d'une version plus récente de Google Chrome. Certaines fonctionnalités peuvent être inaccessibles. Veuillez spécifier un répertoire de profil différent ou utiliser une version plus récente de Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index eb15d54..c4705c0 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Reinicia Chrome OS</translation> <translation id="5132929315877954718">Descubre aplicacións, xogos, extensións e temas fantásticos para Google Chrome.</translation> +<translation id="5139423532931106058">Personalizar o teu perfil de Chrome</translation> +<translation id="5163087008893166964">Dámosche a benvida a Chrome. Abriuse unha nova ventá do navegador</translation> <translation id="5170938038195470297">Non se pode utilizar o teu perfil porque pertence a unha versión máis recente de Google Chrome. É posible que algunhas funcións non estean dispoñibles. Especifica un directorio de perfil diferente ou utiliza unha versión máis recente de Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 184e1ad..a9a8c99 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -154,6 +154,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Chrome OS-ի վերագործարկում</translation> <translation id="5132929315877954718">Հավելվածների, խաղերի, ընդլայնումների և թեմաների լայն ընտրանի Google Chrome-ի համար:</translation> +<translation id="5139423532931106058">Անհատականացնել Chrome-ի պրոֆիլը</translation> +<translation id="5163087008893166964">Բարի գալուստ Chrome․ բացված է դիտարկիչի նոր պատուհան</translation> <translation id="5170938038195470297">Դուք չեք կարող օգտագործել ձեր պրոֆիլը, քանի որ այն Google Chrome-ի նոր տարբերակով է: Որոշ գործառույթներ մատչելի չեն լինի: Նշեք պրոֆիլի այլ գրացուցակ կամ օգտագործեք Chrome-ի նոր տարբերակը:</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 826eb1b9..2bb5fc6 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">„Chrome“ OS paleidimas iš naujo</translation> <translation id="5132929315877954718">Suraskite puikių „Google Chrome“ programų, žaidimų, plėtinių ir temų.</translation> +<translation id="5139423532931106058">Tinkinti „Chrome“ profilį</translation> +<translation id="5163087008893166964">Sveiki, tai – „Chrome“; atidarytas naujas naršyklės langas</translation> <translation id="5170938038195470297">Jūsų profilio negalima naudoti, nes jis iš naujesnės „Google Chrome“ versijos. Kai kurios funkcijos gali būti nepasiekiamos. Nurodykite kitą profilio katalogą arba naudokite naujesnės versijos „Chrome“.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index e9a8c4d..c5ef306 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Канари</translation> <translation id="5062123544085870375">Рестартирајте го Chrome OS</translation> <translation id="5132929315877954718">Открива одлични апликации, игри, наставки и теми за Google Chrome.</translation> +<translation id="5139423532931106058">Приспособете го вашиот профил на Chrome</translation> +<translation id="5163087008893166964">Добре дојдовте на Chrome; отворен е нов прозорец во прелистувачот</translation> <translation id="5170938038195470297">Вашиот профил на може да се користи бидејќи е од поновата верзија на Google Chrome. Некои карактеристики можеби се недостапни. Наведете друг директориум на профили или користете понова верзија на Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 8883e60..d4ec6e6 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Chrome OS പുനഃരാരംഭിക്കുക</translation> <translation id="5132929315877954718">Google Chrome-നായി മികച്ച അപ്ലിക്കേഷനുകളും വിപുലീകരണങ്ങളും തീമുകളും കണ്ടെത്തുക.</translation> +<translation id="5139423532931106058">നിങ്ങളുടെ Chrome പ്രൊഫൈൽ ഇഷ്ടാനുസൃതമാക്കുക</translation> +<translation id="5163087008893166964">Chrome-ലേക്ക് സ്വാഗതം; പുതിയ ബ്രൗസർ വിൻഡോ തുറന്നു</translation> <translation id="5170938038195470297">നിങ്ങളുടെ പ്രൊഫൈൽ Google Chrome-ന്റെ ഒരു പുതിയ പതിപ്പിൽ നിന്നായതിനാൽ ഉപയോഗിക്കാൻ കഴിയില്ല. ചില സവിശേഷതകൾ ലഭ്യമല്ലാതായിരിക്കാം. ദയവായി ഒരു വ്യത്യസ്തമായ പ്രൊഫൈൽ ഡയറക്ടറി വ്യക്തമാക്കുക അല്ലെങ്കിൽ Chrome-ന്റെ ഒരു പുതിയ പതിപ്പ് ഉപയോഗിക്കുക.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 55230e5..011285d 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -152,6 +152,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Repornește sistemul de operare Chrome</translation> <translation id="5132929315877954718">Descoperă aplicații, jocuri, extensii și teme extraordinare pentru Google Chrome.</translation> +<translation id="5139423532931106058">Personalizează-ți profilul Chrome</translation> +<translation id="5163087008893166964">Bun venit la Chrome; fereastră de browser nouă deschisă</translation> <translation id="5170938038195470297">Profilul dvs. nu poate fi utilizat, deoarece provine de la o versiune Google Chrome mai recentă. Este posibil ca unele funcții să nu fie disponibile. Specificați un director de profil diferit sau utilizați o versiune Chrome mai nouă.</translation> <translation id="5193136243808726294">Sistemul de operare Google Chrome nu poate deschide pagina.</translation> <translation id="5251420635869119124">Invitații pot folosi Chrome fără a lăsa nicio urmă.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index b1604f14..58574c0 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Chrome OS යළි අරඹන්න</translation> <translation id="5132929315877954718">Google Chrome සඳහා විශිෂ්ට යෙදුම්, ක්රීඩා, දිගු සහ තේමා සොයා ගන්න.</translation> +<translation id="5139423532931106058">ඔබගේ Chrome පැතිකඩ අභිරුචිකරණය කරන්න</translation> +<translation id="5163087008893166964">Chrome වෙත සාදරයෙන් පිළිගනිමු; නව බ්රවුසර කවුළුවක් විවෘත කරන ලදි</translation> <translation id="5170938038195470297">ඔබේ පැතිකඩ Google Chrome නව සංස්කරණයකින් එන බැවින් භාවිත කළ නොහැක. ඇතැම් විශේෂාංග නොපවතිනු ඇත. කරුණාකර Chrome නි නව සංස්කරණය භාවිතයට වෙනස් පැතිකඩ නාමාවලියක් භාවිත කරන්න.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 92412859..c281ef80 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -154,6 +154,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Reštartovanie Chrome OS</translation> <translation id="5132929315877954718">Objavte skvelé aplikácie, hry, rozšírenia a motívy pre prehliadač Google Chrome.</translation> +<translation id="5139423532931106058">Prispôsobiť profil Chromu</translation> +<translation id="5163087008893166964">Vitajte v Chrome, otvorilo sa nové okno prehliadača</translation> <translation id="5170938038195470297">Váš profil sa nedá použiť, pretože pochádza z novšej verzie prehliadača Google Chrome. Niektoré funkcie môžu byť nedostupné. Zadajte iný adresár profilu alebo použite novšiu verziu prehliadača Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index e38243e6..77d50d7 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -156,6 +156,8 @@ <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5062123544085870375">Rinis Chrome OS</translation> <translation id="5132929315877954718">Zbulo aplikacione, lojëra, shtesa dhe tema të mrekullueshme për Google Chrome.</translation> +<translation id="5139423532931106058">Personalizo profilin tënd të Chrome</translation> +<translation id="5163087008893166964">Mirë se erdhe në Chrome. U hap një dritare e re e shfletuesit</translation> <translation id="5170938038195470297">Profili yt nuk mund të përdoret sepse është nga një version më i ri i Google Chrome. Disa funksione mund të mos ofrohen. Specifiko një direktori tjetër të profilit ose përdor një version më të ri të Chrome.</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 4a9c9708..e28c69c 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1659,6 +1659,25 @@ kResamplingInputEventsLinearResamplingEnabled, base::size(kResamplingInputEventsLinearResamplingEnabled), nullptr}}; +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionTimeBasedEnabled[] = { + {"mode", features::kPredictionTypeTimeBased}, + {"latency", features::kPredictionTypeDefaultTime}}; +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionFramesBasedEnabled[] = { + {"mode", features::kPredictionTypeFramesBased}, + {"latency", features::kPredictionTypeDefaultFramesRatio}}; +const FeatureEntry::FeatureVariation + kResamplingScrollEventsExperimentalPredictionVariations[] = { + {features::kPredictionTypeTimeBased, + kResamplingScrollEventsPredictionTimeBasedEnabled, + base::size(kResamplingScrollEventsPredictionTimeBasedEnabled), + nullptr}, + {features::kPredictionTypeFramesBased, + kResamplingScrollEventsPredictionFramesBasedEnabled, + base::size(kResamplingScrollEventsPredictionFramesBasedEnabled), + nullptr}}; + const FeatureEntry::FeatureParam kFilteringPredictionEmptyFilterEnabled[] = { {"filter", features::kFilterNameEmpty}}; const FeatureEntry::FeatureParam kFilteringPredictionOneEuroFilterEnabled[] = { @@ -2469,6 +2488,15 @@ }; #endif // BUILDFLAG(IS_CHROMEOS_ASH) +constexpr FeatureEntry::FeatureParam kPlatformProvidedTrustTokenIssuance[] = { + {"PlatformProvidedTrustTokenIssuance", "true"}}; + +constexpr FeatureEntry::FeatureVariation + kPlatformProvidedTrustTokensVariations[] = { + {"with platform-provided trust token issuance", + kPlatformProvidedTrustTokenIssuance, + base::size(kPlatformProvidedTrustTokenIssuance), nullptr}}; + // RECORDING USER METRICS FOR FLAGS: // ----------------------------------------------------------------------------- // The first line of the entry is the internal name. @@ -4967,6 +4995,18 @@ kResamplingInputEventsFeatureVariations, "ResamplingScrollEvents")}, + // Should only be available if kResamplingScrollEvents is on, and using + // linear resampling. + {"enable-resampling-scroll-events-experimental-prediction", + flag_descriptions::kEnableResamplingScrollEventsExperimentalPredictionName, + flag_descriptions:: + kEnableResamplingScrollEventsExperimentalPredictionDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + ::features::kResamplingScrollEventsExperimentalPrediction, + kResamplingScrollEventsExperimentalPredictionVariations, + "ResamplingScrollEventsExperimentalLatency")}, + {"enable-filtering-scroll-events", flag_descriptions::kFilteringScrollPredictionName, flag_descriptions::kFilteringScrollPredictionDescription, kOsAll, @@ -5356,10 +5396,6 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if defined(TOOLKIT_VIEWS) - {"enable-md-rounded-corners-on-dialogs", - flag_descriptions::kEnableMDRoundedCornersOnDialogsName, - flag_descriptions::kEnableMDRoundedCornersOnDialogsDescription, kOsDesktop, - FEATURE_VALUE_TYPE(views::features::kEnableMDRoundedCornersOnDialogs)}, {"enable-new-badge-on-menu-items", flag_descriptions::kEnableNewBadgeOnMenuItemsName, @@ -6308,7 +6344,9 @@ {"trust-tokens", flag_descriptions::kTrustTokensName, flag_descriptions::kTrustTokensDescription, kOsAll, - FEATURE_VALUE_TYPE(network::features::kTrustTokens)}, + FEATURE_WITH_PARAMS_VALUE_TYPE(network::features::kTrustTokens, + kPlatformProvidedTrustTokensVariations, + "TrustTokenOriginTrial")}, #if defined(OS_ANDROID) {"android-partner-customization-phenotype", @@ -6627,7 +6665,7 @@ #if BUILDFLAG(ENABLE_AV1_DECODER) {"enable-avif", flag_descriptions::kEnableAVIFName, - flag_descriptions::kEnableAVIFDescription, kOsDesktop, + flag_descriptions::kEnableAVIFDescription, kOsAll, FEATURE_VALUE_TYPE(blink::features::kAVIF)}, #endif // BUILDFLAG(ENABLE_AV1_DECODER)
diff --git a/chrome/browser/android/autofill_assistant/client_android.cc b/chrome/browser/android/autofill_assistant/client_android.cc index dd979e1..88fa318c 100644 --- a/chrome/browser/android/autofill_assistant/client_android.cc +++ b/chrome/browser/android/autofill_assistant/client_android.cc
@@ -181,7 +181,7 @@ const base::android::JavaParamRef<jobjectArray>& jparameter_values, jlong jservice_request_sender) { trigger_script_bridge_.StartTriggerScript( - this, jdelegate, + web_contents_, jdelegate, GURL(base::android::ConvertJavaStringToUTF8(env, jinitial_url)), CreateTriggerContext(env, jexperiment_ids, jparameter_names, jparameter_values), @@ -531,11 +531,6 @@ return has_had_ui_; } -bool ClientAndroid::IsFirstTimeTriggerScriptUser() const { - return Java_AutofillAssistantClient_isFirstTimeTriggerScriptUser( - AttachCurrentThread()); -} - void ClientAndroid::Shutdown(Metrics::DropOutReason reason) { if (!controller_) return;
diff --git a/chrome/browser/android/autofill_assistant/client_android.h b/chrome/browser/android/autofill_assistant/client_android.h index 16725e6..11de1d8 100644 --- a/chrome/browser/android/autofill_assistant/client_android.h +++ b/chrome/browser/android/autofill_assistant/client_android.h
@@ -124,7 +124,6 @@ void Shutdown(Metrics::DropOutReason reason) override; void RecordDropOut(Metrics::DropOutReason reason) override; bool HasHadUI() const override; - bool IsFirstTimeTriggerScriptUser() const override; // Overrides AccessTokenFetcher void FetchAccessToken(
diff --git a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc index 6d16171..a6230d4 100644 --- a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc +++ b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.cc
@@ -10,6 +10,7 @@ #include "chrome/android/features/autofill_assistant/jni_headers/AssistantTriggerScriptBridge_jni.h" #include "chrome/browser/android/autofill_assistant/assistant_header_model.h" #include "chrome/browser/android/autofill_assistant/ui_controller_android_utils.h" +#include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/common/channel_info.h" #include "components/autofill_assistant/browser/service/api_key_fetcher.h" #include "components/autofill_assistant/browser/service/server_url_fetcher.h" @@ -20,6 +21,7 @@ #include "components/autofill_assistant/browser/trigger_scripts/dynamic_trigger_conditions.h" #include "components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h" #include "components/autofill_assistant/browser/web/web_controller.h" +#include "components/autofill_assistant/browser/website_login_manager_impl.h" #include "content/public/browser/web_contents.h" #include "services/metrics/public/cpp/ukm_recorder.h" @@ -29,13 +31,21 @@ using base::android::ToJavaArrayOfStrings; using base::android::ToJavaIntArray; +namespace { +bool IsFirstTimeTriggerScriptUser() { + return autofill_assistant:: + Java_AssistantTriggerScriptBridge_isFirstTimeTriggerScriptUser( + AttachCurrentThread()); +} +} // namespace + namespace autofill_assistant { TriggerScriptBridgeAndroid::TriggerScriptBridgeAndroid() = default; TriggerScriptBridgeAndroid::~TriggerScriptBridgeAndroid() = default; void TriggerScriptBridgeAndroid::StartTriggerScript( - Client* client, + content::WebContents* web_contents, const JavaParamRef<jobject>& jdelegate, const GURL& initial_url, std::unique_ptr<TriggerContext> trigger_context, @@ -59,7 +69,7 @@ base::Base64UrlDecodePolicy::IGNORE_PADDING, &response)) { LOG(ERROR) << "Failed to base64-decode trigger scripts response"; Metrics::RecordLiteScriptFinished( - ukm::UkmRecorder::Get(), client->GetWebContents(), + ukm::UkmRecorder::Get(), web_contents, Metrics::LiteScriptFinishedState::LITE_SCRIPT_BASE64_DECODING_ERROR); return; } @@ -67,7 +77,7 @@ std::make_unique<ServiceRequestSenderLocalImpl>(response); } else { service_request_sender = std::make_unique<ServiceRequestSenderImpl>( - client->GetWebContents()->GetBrowserContext(), + web_contents->GetBrowserContext(), /* access_token_fetcher = */ nullptr, std::make_unique<NativeURLLoaderFactory>(), ApiKeyFetcher().GetAPIKey(chrome::GetChannel()), @@ -76,8 +86,15 @@ } ServerUrlFetcher url_fetcher{ServerUrlFetcher::GetDefaultServerUrl()}; + if (!website_login_manager_) { + website_login_manager_ = std::make_unique<WebsiteLoginManagerImpl>( + ChromePasswordManagerClient::FromWebContents(web_contents), + web_contents); + } trigger_script_coordinator_ = std::make_unique<TriggerScriptCoordinator>( - client, WebController::CreateForWebContents(client->GetWebContents()), + web_contents, website_login_manager_.get(), + base::BindRepeating(&IsFirstTimeTriggerScriptUser), + WebController::CreateForWebContents(web_contents), std::move(service_request_sender), url_fetcher.GetTriggerScriptsEndpoint(), std::make_unique<StaticTriggerConditions>(),
diff --git a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.h b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.h index a7d7926..a7b2c1b 100644 --- a/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.h +++ b/chrome/browser/android/autofill_assistant/trigger_script_bridge_android.h
@@ -11,7 +11,6 @@ #include "base/android/jni_android.h" #include "base/optional.h" -#include "components/autofill_assistant/browser/client.h" #include "components/autofill_assistant/browser/metrics.h" #include "components/autofill_assistant/browser/service.pb.h" #include "components/autofill_assistant/browser/trigger_context.h" @@ -31,7 +30,7 @@ // Attempts to start a trigger script on |initial_url|. Will communicate with // |jdelegate| to show/hide UI as necessary. - void StartTriggerScript(Client* client, + void StartTriggerScript(content::WebContents* web_contents, const base::android::JavaParamRef<jobject>& jdelegate, const GURL& initial_url, std::unique_ptr<TriggerContext> trigger_context, @@ -82,6 +81,10 @@ void OnTriggerScriptFinished(Metrics::LiteScriptFinishedState state) override; void OnVisibilityChanged(bool visible) override; + // The login manager for fetching login credentials. + // TODO(arbesser) move this to the owner of trigger_script_bridge_android. + std::unique_ptr<WebsiteLoginManager> website_login_manager_; + // Reference to the Java counterpart to this class. base::android::ScopedJavaGlobalRef<jobject> java_object_; bool disable_header_animations_for_testing_ = false;
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.cc b/chrome/browser/android/autofill_assistant/ui_controller_android.cc index 334bf20c..98f058f6 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android.cc +++ b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
@@ -751,6 +751,18 @@ : nullptr); break; + case FEEDBACK_ACTION: + // A "Send feedback" button which will show the feedback form before + // executing the action. + jchip = Java_AutofillAssistantUiController_createFeedbackButton( + env, java_object_, chip.icon, + ConvertUTF8ToJavaString(env, chip.text), i, !action.enabled(), + chip.sticky, chip.visible, + chip.is_content_description_set + ? ConvertUTF8ToJavaString(env, chip.content_description) + : nullptr); + break; + case CANCEL_ACTION: // A Cancel button sneaks in an UNDO snackbar before executing the // action, while a close button behaves like a normal button. @@ -856,6 +868,22 @@ DestroySelf(); } +void UiControllerAndroid::OnFeedbackButtonClicked( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jcaller, + jint index) { + // Show the feedback form then directly run the associated action. + // Unfortunately there is no way to associate a callback to run after the user + // actually sent (or close) the form, so we have to continue directly after + // showing it. It should be good enough, given that in most use cases we will + // directly stop. + Java_AutofillAssistantUiController_showFeedback( + env, java_object_, + ConvertUTF8ToJavaString(env, ui_delegate_->GetDebugContext())); + + OnUserActionSelected(env, jcaller, index); +} + void UiControllerAndroid::OnKeyboardVisibilityChanged( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller,
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.h b/chrome/browser/android/autofill_assistant/ui_controller_android.h index ca52983..9f03a66 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android.h +++ b/chrome/browser/android/autofill_assistant/ui_controller_android.h
@@ -194,6 +194,10 @@ void OnCloseButtonClicked( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); + void OnFeedbackButtonClicked( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jcaller, + jint actionIndex); void OnKeyboardVisibilityChanged( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller,
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc b/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc index 2b2fa51..241d351 100644 --- a/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc +++ b/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc
@@ -445,6 +445,7 @@ case NORMAL_ACTION: case CANCEL_ACTION: case CLOSE_ACTION: + case FEEDBACK_ACTION: return Java_AssistantChip_createHairlineAssistantChip( env, chip.icon(), base::android::ConvertUTF8ToJavaString(env, chip.text()),
diff --git a/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc b/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc index bb0ff16..7f57350 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc
@@ -15,9 +15,11 @@ #include "chrome/browser/android/webapps/add_to_homescreen_params.h" #include "chrome/browser/banners/app_banner_manager.h" +namespace webapps { + // static bool AddToHomescreenCoordinator::ShowForAppBanner( - base::WeakPtr<webapps::AppBannerManager> weak_manager, + base::WeakPtr<AppBannerManager> weak_manager, std::unique_ptr<AddToHomescreenParams> params, base::RepeatingCallback<void(AddToHomescreenInstaller::Event, const AddToHomescreenParams&)> @@ -36,3 +38,5 @@ std::move(event_callback)); return true; } + +} // namespace webapps
diff --git a/chrome/browser/android/webapps/add_to_homescreen_coordinator.h b/chrome/browser/android/webapps/add_to_homescreen_coordinator.h index 7965ebc5..81a2f40 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_coordinator.h +++ b/chrome/browser/android/webapps/add_to_homescreen_coordinator.h
@@ -11,11 +11,10 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/android/webapps/add_to_homescreen_installer.h" -struct AddToHomescreenParams; - namespace webapps { + +struct AddToHomescreenParams; class AppBannerManager; -} // AddToHomescreenCoordinator is the C++ counterpart of org.chromium.chrome. // browser.webapps.addtohomescreen.AddToHomescreenCoordinator in Java. @@ -23,7 +22,7 @@ public: // Called for showing the add-to-homescreen UI for AppBannerManager. static bool ShowForAppBanner( - base::WeakPtr<webapps::AppBannerManager> weak_manager, + base::WeakPtr<AppBannerManager> weak_manager, std::unique_ptr<AddToHomescreenParams> params, base::RepeatingCallback<void(AddToHomescreenInstaller::Event, const AddToHomescreenParams&)> @@ -35,4 +34,6 @@ delete; }; +} // namespace webapps + #endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_COORDINATOR_H_
diff --git a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc index 9c0e145..e8619b6 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc
@@ -39,6 +39,8 @@ #include "ui/gfx/favicon_size.h" #include "url/gurl.h" +namespace webapps { + namespace { // Looks up the original, online, visible URL of |web_contents|. The current @@ -49,23 +51,23 @@ web_contents->GetVisibleURL()); } -webapps::InstallableParams ParamsToPerformManifestAndIconFetch() { - webapps::InstallableParams params; +InstallableParams ParamsToPerformManifestAndIconFetch() { + InstallableParams params; params.valid_primary_icon = true; params.prefer_maskable_icon = - webapps::WebappsIconUtils::DoesAndroidSupportMaskableIcons(); + WebappsIconUtils::DoesAndroidSupportMaskableIcons(); params.wait_for_worker = true; return params; } -webapps::InstallableParams ParamsToPerformInstallableCheck() { - webapps::InstallableParams params; +InstallableParams ParamsToPerformInstallableCheck() { + InstallableParams params; params.check_eligibility = true; params.valid_manifest = true; params.has_worker = true; params.valid_primary_icon = true; params.prefer_maskable_icon = - webapps::WebappsIconUtils::DoesAndroidSupportMaskableIcons(); + WebappsIconUtils::DoesAndroidSupportMaskableIcons(); params.wait_for_worker = true; return params; } @@ -82,9 +84,8 @@ scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner, base::OnceCallback<void(const SkBitmap&, bool)> callback) { bool is_generated = false; - SkBitmap primary_icon = - webapps::WebappsIconUtils::FinalizeLauncherIconInBackground( - icon, maskable, start_url, &is_generated); + SkBitmap primary_icon = WebappsIconUtils::FinalizeLauncherIconInBackground( + icon, maskable, start_url, &is_generated); ui_thread_task_runner->PostTask( FROM_HERE, base::BindOnce(std::move(callback), primary_icon, is_generated)); @@ -120,8 +121,7 @@ int data_timeout_ms, Observer* observer) : content::WebContentsObserver(web_contents), - installable_manager_( - webapps::InstallableManager::FromWebContents(web_contents)), + installable_manager_(InstallableManager::FromWebContents(web_contents)), observer_(observer), shortcut_info_(GetShortcutUrl(web_contents)), has_maskable_primary_icon_(false), @@ -172,7 +172,7 @@ chrome::mojom::WebPageMobileCapable::ENABLED_APPLE) { shortcut_info_.display = blink::mojom::DisplayMode::kStandalone; shortcut_info_.UpdateSource( - webapps::ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_STANDALONE); + ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_STANDALONE); } // Record what type of shortcut was added by the user. @@ -225,7 +225,7 @@ } void AddToHomescreenDataFetcher::OnDidGetManifestAndIcons( - const webapps::InstallableData& data) { + const InstallableData& data) { if (!web_contents()) return; @@ -254,9 +254,9 @@ // Save the splash screen URL for the later download. shortcut_info_.ideal_splash_image_size_in_px = - webapps::WebappsIconUtils::GetIdealSplashImageSizeInPx(); + WebappsIconUtils::GetIdealSplashImageSizeInPx(); shortcut_info_.minimum_splash_image_size_in_px = - webapps::WebappsIconUtils::GetMinimumSplashImageSizeInPx(); + WebappsIconUtils::GetMinimumSplashImageSizeInPx(); shortcut_info_.splash_image_url = blink::ManifestIconSelector::FindBestMatchingSquareIcon( data.manifest->icons, shortcut_info_.ideal_splash_image_size_in_px, @@ -270,7 +270,7 @@ } void AddToHomescreenDataFetcher::OnDidPerformInstallableCheck( - const webapps::InstallableData& data) { + const InstallableData& data) { StopTimer(); if (!web_contents()) @@ -278,8 +278,7 @@ bool webapk_compatible = (data.NoBlockingErrors() && data.valid_manifest && data.has_worker && - webapps::WebappsUtils::AreWebManifestUrlsWebApkCompatible( - *data.manifest)); + WebappsUtils::AreWebManifestUrlsWebApkCompatible(*data.manifest)); observer_->OnUserTitleAvailable( webapk_compatible ? shortcut_info_.name : shortcut_info_.user_title, shortcut_info_.url, webapk_compatible); @@ -290,8 +289,7 @@ // that icon is maskable. should_use_created_icon_for_launcher = false; primary_icon_ = raw_primary_icon_; - shortcut_info_.UpdateSource( - webapps::ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_PWA); + shortcut_info_.UpdateSource(ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_PWA); if (!has_maskable_primary_icon_) { // We can skip creating an icon for the view because the raw icon is // sufficient when WebAPK-compatible and the icon is non-maskable. @@ -323,7 +321,7 @@ // Using favicon if its size is not smaller than platform required size, // otherwise using the largest icon among all available icons. int threshold_to_get_any_largest_icon = - webapps::WebappsIconUtils::GetIdealHomescreenIconSizeInPx() - 1; + WebappsIconUtils::GetIdealHomescreenIconSizeInPx() - 1; favicon_service->GetLargestRawFaviconForPageURL( shortcut_info_.url, icon_types, threshold_to_get_any_largest_icon, base::BindOnce(&AddToHomescreenDataFetcher::OnFaviconFetched, @@ -387,3 +385,5 @@ observer_->OnDataAvailable(shortcut_info_, icon_for_view); } + +} // namespace webapps
diff --git a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h index b08ab17..a0c8d8a2 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h +++ b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.h
@@ -21,9 +21,9 @@ } namespace webapps { + class InstallableManager; struct InstallableData; -} // namespace webapps // Aysnchronously fetches and processes data needed to create a shortcut for an // Android Home screen launcher. @@ -39,7 +39,7 @@ // Called when all the data needed to prompt the user to add to home screen // is available. - virtual void OnDataAvailable(const webapps::ShortcutInfo& info, + virtual void OnDataAvailable(const ShortcutInfo& info, const SkBitmap& primary_icon) = 0; protected: @@ -64,7 +64,7 @@ // Accessors, etc. const SkBitmap& primary_icon() const { return primary_icon_; } - webapps::ShortcutInfo& shortcut_info() { return shortcut_info_; } + ShortcutInfo& shortcut_info() { return shortcut_info_; } bool has_maskable_primary_icon() const { return has_maskable_primary_icon_; } private: @@ -75,10 +75,10 @@ void OnDataTimedout(); // Called when InstallableManager finishes looking for a manifest and icon. - void OnDidGetManifestAndIcons(const webapps::InstallableData& data); + void OnDidGetManifestAndIcons(const InstallableData& data); // Called when InstallableManager finishes checking for installability. - void OnDidPerformInstallableCheck(const webapps::InstallableData& data); + void OnDidPerformInstallableCheck(const InstallableData& data); // Grabs the favicon for the current URL. void FetchFavicon(); @@ -95,13 +95,13 @@ const SkBitmap& icon_for_view, bool is_icon_generated); - webapps::InstallableManager* installable_manager_; + InstallableManager* installable_manager_; Observer* observer_; // The icons must only be set on the UI thread for thread safety. SkBitmap raw_primary_icon_; SkBitmap primary_icon_; - webapps::ShortcutInfo shortcut_info_; + ShortcutInfo shortcut_info_; bool has_maskable_primary_icon_; base::CancelableTaskTracker favicon_task_tracker_; @@ -119,4 +119,6 @@ delete; }; +} // namespace webapps + #endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_DATA_FETCHER_H_
diff --git a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc index db5bc7ad..3e73052b 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc
@@ -78,7 +78,7 @@ is_webapk_compatible_ = is_webapk_compatible; } - void OnDataAvailable(const webapps::ShortcutInfo& info, + void OnDataAvailable(const ShortcutInfo& info, const SkBitmap& primary_icon) override { // This should only be called once. EXPECT_FALSE(data_available_);
diff --git a/chrome/browser/android/webapps/add_to_homescreen_installer.cc b/chrome/browser/android/webapps/add_to_homescreen_installer.cc index 6d547f1..dc0afa5 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_installer.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_installer.cc
@@ -13,6 +13,8 @@ #include "chrome/browser/android/webapk/webapk_install_service.h" #include "content/public/browser/web_contents.h" +namespace webapps { + // static void AddToHomescreenInstaller::Install( content::WebContents* web_contents, @@ -77,3 +79,5 @@ web_contents, *(params.shortcut_info), params.primary_icon, params.has_maskable_primary_icon); } + +} // namespace webapps
diff --git a/chrome/browser/android/webapps/add_to_homescreen_installer.h b/chrome/browser/android/webapps/add_to_homescreen_installer.h index 8038c909..43bbef7 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_installer.h +++ b/chrome/browser/android/webapps/add_to_homescreen_installer.h
@@ -12,6 +12,8 @@ class WebContents; } +namespace webapps { + // Helper class for installing a web app or an Android native app and recording // related UMA. class AddToHomescreenInstaller { @@ -53,4 +55,6 @@ AddToHomescreenInstaller& operator=(const AddToHomescreenInstaller&) = delete; }; +} // namespace webapps + #endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_INSTALLER_H_
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc b/chrome/browser/android/webapps/add_to_homescreen_mediator.cc index 84b78ca..1114b21 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_mediator.cc
@@ -16,17 +16,17 @@ #include "chrome/browser/banners/app_banner_manager_android.h" #include "chrome/browser/banners/app_banner_metrics.h" #include "chrome/browser/banners/app_banner_settings_helper.h" -#include "chrome/browser/feature_engagement/tracker_factory.h" -#include "components/feature_engagement/public/event_constants.h" -#include "components/feature_engagement/public/tracker.h" #include "components/url_formatter/elide_url.h" #include "components/webapps/installable/installable_metrics.h" +#include "components/webapps/webapps_client.h" #include "content/public/browser/web_contents.h" #include "ui/gfx/android/java_bitmap.h" using base::android::JavaParamRef; using base::android::ScopedJavaLocalRef; +namespace webapps { + namespace { // The length of time to allow the add to homescreen data fetcher to run before @@ -59,7 +59,7 @@ } void AddToHomescreenMediator::StartForAppBanner( - base::WeakPtr<webapps::AppBannerManager> weak_manager, + base::WeakPtr<AppBannerManager> weak_manager, std::unique_ptr<AddToHomescreenParams> params, base::RepeatingCallback<void(AddToHomescreenInstaller::Event, const AddToHomescreenParams&)> @@ -171,19 +171,18 @@ SetWebAppInfo(user_title, url, is_webapk_compatible); } -void AddToHomescreenMediator::OnDataAvailable(const webapps::ShortcutInfo& info, +void AddToHomescreenMediator::OnDataAvailable(const ShortcutInfo& info, const SkBitmap& display_icon) { params_ = std::make_unique<AddToHomescreenParams>(); - params_->app_type = - info.source == webapps::ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_PWA - ? AddToHomescreenParams::AppType::WEBAPK - : AddToHomescreenParams::AppType::SHORTCUT; - params_->shortcut_info = std::make_unique<webapps::ShortcutInfo>(info); + params_->app_type = info.source == ShortcutInfo::SOURCE_ADD_TO_HOMESCREEN_PWA + ? AddToHomescreenParams::AppType::WEBAPK + : AddToHomescreenParams::AppType::SHORTCUT; + params_->shortcut_info = std::make_unique<ShortcutInfo>(info); params_->primary_icon = data_fetcher_->primary_icon(); params_->has_maskable_primary_icon = data_fetcher_->has_maskable_primary_icon(); - params_->install_source = webapps::InstallableMetrics::GetInstallSource( - data_fetcher_->web_contents(), webapps::InstallTrigger::MENU); + params_->install_source = InstallableMetrics::GetInstallSource( + data_fetcher_->web_contents(), InstallTrigger::MENU); // AddToHomescreenMediator::OnDataAvailable() is called in the code path // to show A2HS dialog from app menu. In this code path, display_icon is @@ -196,17 +195,17 @@ DCHECK_NE(-1, title_id_); switch (title_id_) { - case webapps::AppBannerSettingsHelper::APP_MENU_OPTION_UNKNOWN: { + case AppBannerSettingsHelper::APP_MENU_OPTION_UNKNOWN: { entry = is_webapk ? AppTypeToMenuEntry::kUnknownMenuEntryForWebApp : AppTypeToMenuEntry::kUnknownMenuEntryForShortcut; break; } - case webapps::AppBannerSettingsHelper::APP_MENU_OPTION_ADD_TO_HOMESCREEN: { + case AppBannerSettingsHelper::APP_MENU_OPTION_ADD_TO_HOMESCREEN: { entry = is_webapk ? AppTypeToMenuEntry::kAddToHomeScreenShownForWebApp : AppTypeToMenuEntry::kAddToHomeScreenShownForShortcut; break; } - case webapps::AppBannerSettingsHelper::APP_MENU_OPTION_INSTALL: { + case AppBannerSettingsHelper::APP_MENU_OPTION_INSTALL: { entry = is_webapk ? AppTypeToMenuEntry::kInstallShownForWebApp : AppTypeToMenuEntry::kInstallShownForShortcut; break; @@ -216,11 +215,8 @@ entry, AppTypeToMenuEntry::kAppTypeFinalEntry); if (is_webapk) { - DVLOG(2) << "Sending event: IPH used for Installing PWA"; - feature_engagement::Tracker* tracker = - feature_engagement::TrackerFactory::GetForBrowserContext( - data_fetcher_->web_contents()->GetBrowserContext()); - tracker->NotifyEvent(feature_engagement::events::kPwaInstallMenuSelected); + webapps::WebappsClient::Get()->OnWebApkInstallInitiatedFromAppMenu( + data_fetcher_->web_contents()); } } @@ -234,16 +230,15 @@ DCHECK_NE(a2hs_params.app_type, AddToHomescreenParams::AppType::NATIVE); switch (event) { case AddToHomescreenInstaller::Event::INSTALL_STARTED: - webapps::AppBannerSettingsHelper::RecordBannerEvent( + AppBannerSettingsHelper::RecordBannerEvent( web_contents, web_contents->GetVisibleURL(), a2hs_params.shortcut_info->url.spec(), - webapps::AppBannerSettingsHelper:: - APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, + AppBannerSettingsHelper::APP_BANNER_EVENT_DID_ADD_TO_HOMESCREEN, base::Time::Now()); break; case AddToHomescreenInstaller::Event::INSTALL_REQUEST_FINISHED: { - webapps::AppBannerManagerAndroid* app_banner_manager = - webapps::AppBannerManagerAndroid::FromWebContents(web_contents); + AppBannerManagerAndroid* app_banner_manager = + AppBannerManagerAndroid::FromWebContents(web_contents); // Fire the appinstalled event and do install time logging. if (app_banner_manager) app_banner_manager->OnInstall(a2hs_params.shortcut_info->display); @@ -263,3 +258,5 @@ return nullptr; } + +} // namespace webapps
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.h b/chrome/browser/android/webapps/add_to_homescreen_mediator.h index 9098e240..f69a2cc7 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_mediator.h +++ b/chrome/browser/android/webapps/add_to_homescreen_mediator.h
@@ -23,9 +23,8 @@ } namespace webapps { -struct ShortcutInfo; -} +struct ShortcutInfo; class AddToHomescreenInstaller; // AddToHomescreenMediator is the C++ counterpart of @@ -41,7 +40,7 @@ const base::android::JavaParamRef<jobject>& java_ref); void StartForAppBanner( - base::WeakPtr<webapps::AppBannerManager> weak_manager, + base::WeakPtr<AppBannerManager> weak_manager, std::unique_ptr<AddToHomescreenParams> params, base::RepeatingCallback<void(AddToHomescreenInstaller::Event, const AddToHomescreenParams&)> @@ -84,7 +83,7 @@ const GURL& url, bool is_webapk_compatible) override; - void OnDataAvailable(const webapps::ShortcutInfo& info, + void OnDataAvailable(const ShortcutInfo& info, const SkBitmap& display_icon) override; void RecordEventForAppMenu(AddToHomescreenInstaller::Event event, @@ -95,7 +94,7 @@ // Points to the Java reference. base::android::ScopedJavaGlobalRef<jobject> java_ref_; - base::WeakPtr<webapps::AppBannerManager> weak_app_banner_manager_; + base::WeakPtr<AppBannerManager> weak_app_banner_manager_; // Fetches data required to add a shortcut. std::unique_ptr<AddToHomescreenDataFetcher> data_fetcher_; @@ -112,4 +111,6 @@ AddToHomescreenMediator& operator=(const AddToHomescreenMediator&) = delete; }; +} // namespace webapps + #endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_MEDIATOR_H_
diff --git a/chrome/browser/android/webapps/add_to_homescreen_params.cc b/chrome/browser/android/webapps/add_to_homescreen_params.cc index 96431cda..5265762 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_params.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_params.cc
@@ -6,5 +6,9 @@ #include "components/webapps/android/shortcut_info.h" +namespace webapps { + AddToHomescreenParams::AddToHomescreenParams() = default; AddToHomescreenParams::~AddToHomescreenParams() = default; + +} // namespace webapps
diff --git a/chrome/browser/android/webapps/add_to_homescreen_params.h b/chrome/browser/android/webapps/add_to_homescreen_params.h index 0c217dd..4a5a44c 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_params.h +++ b/chrome/browser/android/webapps/add_to_homescreen_params.h
@@ -13,8 +13,8 @@ #include "third_party/skia/include/core/SkBitmap.h" namespace webapps { + struct ShortcutInfo; -} struct AddToHomescreenParams { // A Java counterpart will be generated for this enum. @@ -29,8 +29,8 @@ AppType app_type; SkBitmap primary_icon; bool has_maskable_primary_icon = false; - std::unique_ptr<webapps::ShortcutInfo> shortcut_info; - webapps::WebappInstallSource install_source; + std::unique_ptr<ShortcutInfo> shortcut_info; + WebappInstallSource install_source; std::string native_app_package_name; base::android::ScopedJavaGlobalRef<jobject> native_app_data; @@ -38,4 +38,6 @@ ~AddToHomescreenParams(); }; +} // namespace webapps + #endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_PARAMS_H_
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index e00c58a..18acb13 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -1282,9 +1282,14 @@ (!doneOnce && base::mac::WasLaunchedAsHiddenLoginItem()); doneOnce = YES; if (attemptRestore) { + Profile* lastProfile = [self lastProfile]; + if (!lastProfile) { + // There is no session to be restored without a valid profile. Return NO + // to do nothing. + return NO; + } SessionService* sessionService = - SessionServiceFactory::GetForProfileForSessionRestore( - [self lastProfile]); + SessionServiceFactory::GetForProfileForSessionRestore(lastProfile); if (sessionService && sessionService->RestoreIfNecessary(std::vector<GURL>())) return NO;
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index 1d9e478..549c7bf 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -2015,7 +2015,8 @@ // This tests that in-memory storage partitions are reset on browser restart, // but persistent ones maintain state for cookies and HTML5 storage. -IN_PROC_BROWSER_TEST_F(WebViewTest, PRE_StoragePersistence) { +// TODO(1144228): Flaky. +IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_PRE_StoragePersistence) { ASSERT_TRUE(StartEmbeddedTestServer()); // We don't care where the main browser is on this test. ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); @@ -2029,7 +2030,8 @@ // This is the post-reset portion of the StoragePersistence test. See // PRE_StoragePersistence for main comment. -IN_PROC_BROWSER_TEST_F(WebViewTest, StoragePersistence) { +// TODO(1144228): Flaky. +IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_StoragePersistence) { ASSERT_TRUE(StartEmbeddedTestServer()); // We don't care where the main browser is on this test. ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
diff --git a/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc b/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc index b13d681..5b6f062 100644 --- a/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc +++ b/chrome/browser/autofill/address_accessory_controller_impl_unittest.cc
@@ -76,7 +76,10 @@ web_contents(), mock_manual_filling_controller_.AsWeakPtr()); } - void TearDown() override { personal_data_manager()->ClearProfiles(); } + void TearDown() override { + personal_data_manager()->ClearProfiles(); + ChromeRenderViewHostTestHarness::TearDown(); + } AddressAccessoryController* controller() { return AddressAccessoryControllerImpl::FromWebContents(web_contents());
diff --git a/chrome/browser/autofill/credit_card_accessory_controller_impl_unittest.cc b/chrome/browser/autofill/credit_card_accessory_controller_impl_unittest.cc index 84c918e..2b975cee 100644 --- a/chrome/browser/autofill/credit_card_accessory_controller_impl_unittest.cc +++ b/chrome/browser/autofill/credit_card_accessory_controller_impl_unittest.cc
@@ -124,12 +124,13 @@ CreditCardAccessoryControllerImpl::CreateForWebContentsForTesting( web_contents(), mock_mf_controller_.AsWeakPtr(), &data_manager_, &af_manager_, &mock_af_driver_); - data_manager_.SetPrefService(profile_.GetPrefs()); + data_manager_.SetPrefService(profile()->GetPrefs()); } void TearDown() override { data_manager_.SetPrefService(nullptr); data_manager_.ClearCreditCards(); + ChromeRenderViewHostTestHarness::TearDown(); } CreditCardAccessoryController* controller() { @@ -152,7 +153,6 @@ MockAutocompleteHistoryManager history_; testing::NiceMock<MockManualFillingController> mock_mf_controller_; TestAutofillManager af_manager_; - TestingProfile profile_; }; TEST_F(CreditCardAccessoryControllerTest, RefreshSuggestions) {
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 1ca05604..c4647ab 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -408,6 +408,7 @@ #include "ash/public/cpp/tablet_mode.h" #include "chrome/app/chrome_crash_reporter_client.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/arc/fileapi/arc_content_file_system_backend_delegate.h" #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_backend_delegate.h" #include "chrome/browser/chromeos/chrome_browser_main_chromeos.h" @@ -425,6 +426,7 @@ #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h" #include "chrome/browser/chromeos/policy/system_features_disable_list_policy_handler.h" +#include "chrome/browser/chromeos/policy/system_proxy_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/smb_client/fileapi/smbfs_file_system_backend_delegate.h" #include "chrome/browser/chromeos/system/input_device_settings.h" @@ -5095,6 +5097,21 @@ scoped_refptr<net::HttpResponseHeaders> response_headers, bool first_auth_attempt, LoginAuthRequiredCallback auth_required_callback) { +#if BUILDFLAG(IS_CHROMEOS_ASH) + policy::SystemProxyManager* system_proxy_manager = + g_browser_process->platform_part() + ->browser_policy_connector_chromeos() + ->GetSystemProxyManager(); + // For Managed Guest Session and Kiosk devices, the credentials configured + // via the policy SystemProxySettings may be used for proxy authentication. + // Note: |system_proxy_manager| may be missing in tests. + if (system_proxy_manager && system_proxy_manager->CanUsePolicyCredentials( + auth_info, first_auth_attempt)) { + return system_proxy_manager->CreateLoginDelegate( + std::move(auth_required_callback)); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + // For subresources, create a LoginHandler directly, which may show a login // prompt to the user. Main frame resources go through LoginTabHelper, which // manages a more complicated flow to avoid confusion about which website is
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index f0d4bf1..3523ee4d 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1460,6 +1460,8 @@ "first_run/first_run.h", "full_restore/app_launch_handler.cc", "full_restore/app_launch_handler.h", + "full_restore/full_restore_data_handler.cc", + "full_restore/full_restore_data_handler.h", "full_restore/full_restore_prefs.cc", "full_restore/full_restore_prefs.h", "full_restore/full_restore_service.cc",
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 421b7fe..42f291e 100644 --- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc +++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -227,8 +227,7 @@ ArcSessionManager::Get()->SetArcSessionRunnerForTesting( std::make_unique<ArcSessionRunner>( base::BindRepeating(FakeArcSession::Create))); - EXPECT_TRUE(ExpandPropertyFilesForTesting(ArcSessionManager::Get(), - temp_dir_.GetPath())); + ExpandPropertyFilesForTesting(ArcSessionManager::Get()); chromeos::ProfileHelper::SetAlwaysReturnPrimaryUserForTesting(true); }
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc b/chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc index a6948f1a..51a7e50 100644 --- a/chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc +++ b/chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc
@@ -131,8 +131,7 @@ base::BindRepeating(FakeArcSession::Create))); ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - EXPECT_TRUE(ExpandPropertyFilesForTesting(ArcSessionManager::Get(), - temp_dir_.GetPath())); + ExpandPropertyFilesForTesting(ArcSessionManager::Get()); chromeos::ProfileHelper::SetAlwaysReturnPrimaryUserForTesting(true);
diff --git a/chrome/browser/chromeos/arc/test/test_arc_session_manager.cc b/chrome/browser/chromeos/arc/test/test_arc_session_manager.cc index c8a0e08..d1593813 100644 --- a/chrome/browser/chromeos/arc/test/test_arc_session_manager.cc +++ b/chrome/browser/chromeos/arc/test/test_arc_session_manager.cc
@@ -46,10 +46,8 @@ return manager; } -bool ExpandPropertyFilesForTesting(ArcSessionManager* arc_session_manager, - const base::FilePath& temp_dir) { +void ExpandPropertyFilesForTesting(ArcSessionManager* arc_session_manager) { arc_session_manager->OnExpandPropertyFilesAndReadSaltForTesting(true); - return true; } } // namespace arc
diff --git a/chrome/browser/chromeos/arc/test/test_arc_session_manager.h b/chrome/browser/chromeos/arc/test/test_arc_session_manager.h index 508dcee6..fd86adab 100644 --- a/chrome/browser/chromeos/arc/test/test_arc_session_manager.h +++ b/chrome/browser/chromeos/arc/test/test_arc_session_manager.h
@@ -7,10 +7,6 @@ #include <memory> -namespace base { -class FilePath; -} // namespace base - namespace arc { class ArcSessionManager; @@ -25,9 +21,7 @@ // Does something similar to CreateTestArcSessionManager(), but for an existing // object. This function is useful for ARC browser_tests where ArcSessionManager // object is (re)created with ArcServiceLauncher::ResetForTesting(). -// TODO(yusukes): Remove |temp_dir| argument which is unused. -bool ExpandPropertyFilesForTesting(ArcSessionManager* arc_session_manager, - const base::FilePath& temp_dir); +void ExpandPropertyFilesForTesting(ArcSessionManager* arc_session_manager); } // namespace arc
diff --git a/chrome/browser/chromeos/crosapi/account_manager_ash.cc b/chrome/browser/chromeos/crosapi/account_manager_ash.cc index 65665ee..63c924c 100644 --- a/chrome/browser/chromeos/crosapi/account_manager_ash.cc +++ b/chrome/browser/chromeos/crosapi/account_manager_ash.cc
@@ -13,10 +13,8 @@ namespace crosapi { -AccountManagerAsh::AccountManagerAsh( - chromeos::AccountManager* account_manager, - mojo::PendingReceiver<mojom::AccountManager> receiver) - : account_manager_(account_manager), receiver_(this, std::move(receiver)) { +AccountManagerAsh::AccountManagerAsh(chromeos::AccountManager* account_manager) + : account_manager_(account_manager) { DCHECK(account_manager_); account_manager_->AddObserver(this); } @@ -25,6 +23,11 @@ account_manager_->RemoveObserver(this); } +void AccountManagerAsh::BindReceiver( + mojo::PendingReceiver<mojom::AccountManager> receiver) { + receivers_.Add(this, std::move(receiver)); +} + void AccountManagerAsh::IsInitialized(IsInitializedCallback callback) { std::move(callback).Run(account_manager_->IsInitialized()); }
diff --git a/chrome/browser/chromeos/crosapi/account_manager_ash.h b/chrome/browser/chromeos/crosapi/account_manager_ash.h index 6e79a8e..73529ea 100644 --- a/chrome/browser/chromeos/crosapi/account_manager_ash.h +++ b/chrome/browser/chromeos/crosapi/account_manager_ash.h
@@ -10,7 +10,7 @@ #include "chromeos/crosapi/mojom/account_manager.mojom.h" #include "components/account_manager_core/account.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote_set.h" namespace crosapi { @@ -21,12 +21,13 @@ class AccountManagerAsh : public mojom::AccountManager, public chromeos::AccountManager::Observer { public: - AccountManagerAsh(chromeos::AccountManager* account_manager, - mojo::PendingReceiver<mojom::AccountManager> receiver); + explicit AccountManagerAsh(chromeos::AccountManager* account_manager); AccountManagerAsh(const AccountManagerAsh&) = delete; AccountManagerAsh& operator=(const AccountManagerAsh&) = delete; ~AccountManagerAsh() override; + void BindReceiver(mojo::PendingReceiver<mojom::AccountManager> receiver); + // crosapi::mojom::AccountManager: void IsInitialized(IsInitializedCallback callback) override; void AddObserver(AddObserverCallback callback) override; @@ -42,7 +43,7 @@ void FlushMojoForTesting(); chromeos::AccountManager* const account_manager_; - mojo::Receiver<mojom::AccountManager> receiver_; + mojo::ReceiverSet<mojom::AccountManager> receivers_; mojo::RemoteSet<mojom::AccountManagerObserver> observers_; };
diff --git a/chrome/browser/chromeos/crosapi/account_manager_ash_unittest.cc b/chrome/browser/chromeos/crosapi/account_manager_ash_unittest.cc index 0e2bf03..d4f6b433 100644 --- a/chrome/browser/chromeos/crosapi/account_manager_ash_unittest.cc +++ b/chrome/browser/chromeos/crosapi/account_manager_ash_unittest.cc
@@ -93,8 +93,9 @@ protected: void SetUp() override { - account_manager_ash_ = std::make_unique<AccountManagerAsh>( - &account_manager_, remote_.BindNewPipeAndPassReceiver()); + account_manager_ash_ = + std::make_unique<AccountManagerAsh>(&account_manager_); + account_manager_ash_->BindReceiver(remote_.BindNewPipeAndPassReceiver()); account_manager_async_waiter_ = std::make_unique<mojom::AccountManagerAsyncWaiter>( account_manager_ash_.get());
diff --git a/chrome/browser/chromeos/crosapi/ash_chrome_service_impl.cc b/chrome/browser/chromeos/crosapi/ash_chrome_service_impl.cc index 41f78ad..9bdadfc2 100644 --- a/chrome/browser/chromeos/crosapi/ash_chrome_service_impl.cc +++ b/chrome/browser/chromeos/crosapi/ash_chrome_service_impl.cc
@@ -62,35 +62,38 @@ void AshChromeServiceImpl::BindAccountManager( mojo::PendingReceiver<mojom::AccountManager> receiver) { - DVLOG(1) << "Binding AccountManager receiver"; - // Assumptions: - // 1. TODO(https://crbug.com/1102768): Multi-Signin / Fast-User-Switching is - // disabled. - // 2. ash-chrome has 1 and only 1 "regular" |Profile|. + // TODO(https://crrev.com/c/2601750): Move AccountManagerAsh ownership to + // chromeos::AccountManager. + if (!account_manager_ash_) { + // Assumptions: + // 1. TODO(https://crbug.com/1102768): Multi-Signin / Fast-User-Switching is + // disabled. + // 2. ash-chrome has 1 and only 1 "regular" |Profile|. #if DCHECK_IS_ON() - int num_regular_profiles = 0; - for (const Profile* profile : - g_browser_process->profile_manager()->GetLoadedProfiles()) { - if (chromeos::ProfileHelper::IsRegularProfile(profile)) - num_regular_profiles++; - } - DCHECK_EQ(1, num_regular_profiles); + int num_regular_profiles = 0; + for (const Profile* profile : + g_browser_process->profile_manager()->GetLoadedProfiles()) { + if (chromeos::ProfileHelper::IsRegularProfile(profile)) + num_regular_profiles++; + } + DCHECK_EQ(1, num_regular_profiles); #endif // DCHECK_IS_ON() - // Given these assumptions, there is 1 and only 1 Account Manager that - // can/should be contacted - the one attached to the regular |Profile| in - // ash-chrome, for the current |User|. - const user_manager::User* const user = - user_manager::UserManager::Get()->GetActiveUser(); - const Profile* const profile = - chromeos::ProfileHelper::Get()->GetProfileByUser(user); - chromeos::AccountManager* const account_manager = - g_browser_process->platform_part() - ->GetAccountManagerFactory() - ->GetAccountManager(/* profile_path = */ profile->GetPath().value()); - // TODO(https://crbug.com/1148448): Convert this to allow multiple, - // simultaneous crosapi clients. See BindScreenManager for an example. - account_manager_ash_ = std::make_unique<crosapi::AccountManagerAsh>( - account_manager, std::move(receiver)); + // Given these assumptions, there is 1 and only 1 Account Manager that + // can/should be contacted - the one attached to the regular |Profile| in + // ash-chrome, for the current |User|. + const user_manager::User* const user = + user_manager::UserManager::Get()->GetActiveUser(); + const Profile* const profile = + chromeos::ProfileHelper::Get()->GetProfileByUser(user); + chromeos::AccountManager* const account_manager = + g_browser_process->platform_part() + ->GetAccountManagerFactory() + ->GetAccountManager( + /* profile_path = */ profile->GetPath().value()); + account_manager_ash_ = + std::make_unique<crosapi::AccountManagerAsh>(account_manager); + } + account_manager_ash_->BindReceiver(std::move(receiver)); } void AshChromeServiceImpl::BindFileManager(
diff --git a/chrome/browser/chromeos/crosapi/browser_loader.cc b/chrome/browser/chromeos/crosapi/browser_loader.cc index f586d832..123f130 100644 --- a/chrome/browser/chromeos/crosapi/browser_loader.cc +++ b/chrome/browser/chromeos/crosapi/browser_loader.cc
@@ -33,7 +33,7 @@ // At that point, this feature can only be removed from the code and we can // switch unconditionally to the dogfood deployment.. const base::Feature kLacrosPreferDogfoodOverFishfood{ - "LacrosPreferDogfoodOverFishfood", base::FEATURE_DISABLED_BY_DEFAULT}; + "LacrosPreferDogfoodOverFishfood", base::FEATURE_ENABLED_BY_DEFAULT}; // Emergency kill switch in case the notification code doesn't work properly. const base::Feature kLacrosShowUpdateNotifications{
diff --git a/chrome/browser/chromeos/crosapi/browser_loader_unittest.cc b/chrome/browser/chromeos/crosapi/browser_loader_unittest.cc index ea66094..d2e8cf0 100644 --- a/chrome/browser/chromeos/crosapi/browser_loader_unittest.cc +++ b/chrome/browser/chromeos/crosapi/browser_loader_unittest.cc
@@ -21,6 +21,10 @@ namespace crosapi { namespace { +// Copied from browser_loader.cc +constexpr char kLacrosComponentName[] = "lacros-dogfood-dev"; +constexpr char kLacrosComponentId[] = "ldobopbhiamakmncndpkeelenhdmgfhk"; + // Delegate for testing. class DelegateImpl : public BrowserLoader::Delegate { public: @@ -52,9 +56,9 @@ // Create dependencies for object under test. scoped_refptr<component_updater::FakeCrOSComponentManager> component_manager = base::MakeRefCounted<component_updater::FakeCrOSComponentManager>(); - component_manager->set_supported_components({"lacros-fishfood"}); + component_manager->set_supported_components({kLacrosComponentName}); component_manager->ResetComponentState( - "lacros-fishfood", + kLacrosComponentName, component_updater::FakeCrOSComponentManager::ComponentInfo( component_updater::CrOSComponentManager::Error::NONE, base::FilePath("/install/path"), base::FilePath("/mount/path"))); @@ -78,21 +82,20 @@ EXPECT_EQ(0, delegate->set_lacros_update_available_); // Update check does not trigger an update notification. - constexpr char kLacrosFishfoodId[] = "hkifppleldbgkdlijbdfkdpedggaopda"; browser_loader.OnEvent( UpdateClient::Observer::Events::COMPONENT_CHECKING_FOR_UPDATES, - kLacrosFishfoodId); + kLacrosComponentId); EXPECT_EQ(0, delegate->set_lacros_update_available_); // Update download does not trigger an update notification. browser_loader.OnEvent( UpdateClient::Observer::Events::COMPONENT_UPDATE_DOWNLOADING, - kLacrosFishfoodId); + kLacrosComponentId); EXPECT_EQ(0, delegate->set_lacros_update_available_); // Update completion trigger the notification. browser_loader.OnEvent(UpdateClient::Observer::Events::COMPONENT_UPDATED, - kLacrosFishfoodId); + kLacrosComponentId); EXPECT_EQ(1, delegate->set_lacros_update_available_); browser_part.ShutdownCrosComponentManager();
diff --git a/chrome/browser/chromeos/crosapi/browser_manager.cc b/chrome/browser/chromeos/crosapi/browser_manager.cc index 33278e02..3a710b3 100644 --- a/chrome/browser/chromeos/crosapi/browser_manager.cc +++ b/chrome/browser/chromeos/crosapi/browser_manager.cc
@@ -307,6 +307,9 @@ options.environment["GOOGLE_DEFAULT_CLIENT_SECRET"] = google_apis::GetOAuth2ClientSecret(google_apis::CLIENT_MAIN); + // This sets the channel for Lacros. + options.environment["CHROME_VERSION_EXTRA"] = "dev"; + options.kill_on_parent_death = true; // Paths are UTF-8 safe on Chrome OS.
diff --git a/chrome/browser/chromeos/full_restore/full_restore_data_handler.cc b/chrome/browser/chromeos/full_restore/full_restore_data_handler.cc new file mode 100644 index 0000000..946b2a29 --- /dev/null +++ b/chrome/browser/chromeos/full_restore/full_restore_data_handler.cc
@@ -0,0 +1,49 @@ +// Copyright 2021 The Chromium 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/full_restore/full_restore_data_handler.h" + +#include "chrome/browser/apps/app_service/app_service_proxy.h" +#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "components/full_restore/full_restore_read_handler.h" +#include "components/full_restore/full_restore_save_handler.h" +#include "components/services/app_service/public/cpp/app_update.h" + +namespace chromeos { +namespace full_restore { + +FullRestoreDataHandler::FullRestoreDataHandler(Profile* profile) + : profile_(profile) { + DCHECK( + apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile_)); + Observe(&apps::AppServiceProxyFactory::GetForProfile(profile_) + ->AppRegistryCache()); +} + +FullRestoreDataHandler::~FullRestoreDataHandler() = default; + +void FullRestoreDataHandler::OnAppUpdate(const apps::AppUpdate& update) { + if (!update.ReadinessChanged() || + update.Readiness() != apps::mojom::Readiness::kUninstalledByUser) { + return; + } + + // If the user uninstalls an app, then installs it again at the system + // startup phase, its restore data will be removed if the app isn't reopened. + ::full_restore::FullRestoreReadHandler* read_handler = + ::full_restore::FullRestoreReadHandler::GetInstance(); + read_handler->RemoveApp(profile_->GetPath(), update.AppId()); + + ::full_restore::FullRestoreSaveHandler::GetInstance()->RemoveApp( + profile_->GetPath(), update.AppId()); +} + +void FullRestoreDataHandler::OnAppRegistryCacheWillBeDestroyed( + apps::AppRegistryCache* cache) { + apps::AppRegistryCache::Observer::Observe(nullptr); +} + +} // namespace full_restore +} // namespace chromeos
diff --git a/chrome/browser/chromeos/full_restore/full_restore_data_handler.h b/chrome/browser/chromeos/full_restore/full_restore_data_handler.h new file mode 100644 index 0000000..29267d6 --- /dev/null +++ b/chrome/browser/chromeos/full_restore/full_restore_data_handler.h
@@ -0,0 +1,39 @@ +// Copyright 2021 The Chromium 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_FULL_RESTORE_FULL_RESTORE_DATA_HANDLER_H_ +#define CHROME_BROWSER_CHROMEOS_FULL_RESTORE_FULL_RESTORE_DATA_HANDLER_H_ + +#include "components/services/app_service/public/cpp/app_registry_cache.h" + +class Profile; + +namespace chromeos { +namespace full_restore { + +// The FullRestoreDataHandler class observes AppRegistryCache to remove the app +// launching and app windows when the app is removed. +class FullRestoreDataHandler : public apps::AppRegistryCache::Observer { + public: + explicit FullRestoreDataHandler(Profile* profile); + ~FullRestoreDataHandler() override; + + FullRestoreDataHandler(const FullRestoreDataHandler&) = delete; + FullRestoreDataHandler& operator=(const FullRestoreDataHandler&) = delete; + + // apps::AppRegistryCache::Observer: + void OnAppUpdate(const apps::AppUpdate& update) override; + void OnAppRegistryCacheWillBeDestroyed( + apps::AppRegistryCache* cache) override; + + private: + Profile* profile_ = nullptr; + + base::WeakPtrFactory<FullRestoreDataHandler> weak_ptr_factory_{this}; +}; + +} // namespace full_restore +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_FULL_RESTORE_FULL_RESTORE_DATA_HANDLER_H_
diff --git a/chrome/browser/chromeos/full_restore/full_restore_prefs.cc b/chrome/browser/chromeos/full_restore/full_restore_prefs.cc index b57667d..ba666d0 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_prefs.cc +++ b/chrome/browser/chromeos/full_restore/full_restore_prefs.cc
@@ -19,12 +19,20 @@ // Refer to |RestoreOption|. const char kRestoreAppsAndPagesPrefName[] = "settings.restore_apps_and_pages"; +// An integer pref to count how many times the user selected the 'Restore' +// button from the restore notification dialog. +const char kRestoreSelectedCountPrefName[] = + "full_restore.restore_selected_count"; + void RegisterProfilePrefs(PrefRegistrySimple* registry) { - if (ash::features::IsFullRestoreEnabled()) { - registry->RegisterIntegerPref( - kRestoreAppsAndPagesPrefName, static_cast<int>(RestoreOption::kAlways), - user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); - } + if (!ash::features::IsFullRestoreEnabled()) + return; + + registry->RegisterIntegerPref( + kRestoreAppsAndPagesPrefName, static_cast<int>(RestoreOption::kAlways), + user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF); + + registry->RegisterIntegerPref(kRestoreSelectedCountPrefName, 0); } bool HasRestorePref(PrefService* prefs) { @@ -67,5 +75,13 @@ } } +int GetRestoreSelectedCountPref(PrefService* prefs) { + return prefs->GetInteger(kRestoreSelectedCountPrefName); +} + +void SetRestoreSelectedCountPref(PrefService* prefs, int count) { + prefs->SetInteger(kRestoreSelectedCountPrefName, count); +} + } // namespace full_restore } // namespace chromeos
diff --git a/chrome/browser/chromeos/full_restore/full_restore_prefs.h b/chrome/browser/chromeos/full_restore/full_restore_prefs.h index 239d01b7..7849a4d 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_prefs.h +++ b/chrome/browser/chromeos/full_restore/full_restore_prefs.h
@@ -20,8 +20,10 @@ }; extern const char kRestoreAppsAndPagesPrefName[]; +extern const char kRestoreSelectedCountPrefName[]; -// Registers the restore pref |kRestoreAppsAndPagesPrefName|. +// Registers the restore pref |kRestoreAppsAndPagesPrefName| and +// |kRestoreSelectedCountPrefName|. void RegisterProfilePrefs(PrefRegistrySimple* registry); // Returns true if the pref has |kRestoreAppsAndPagesPrefName|. Otherwise, @@ -41,6 +43,12 @@ // restore settings is synced. void UpdateRestorePrefIfNecessary(PrefService* prefs); +// Returns the value of the pref |kRestoreSelectedCountPrefName|. +int GetRestoreSelectedCountPref(PrefService* prefs); + +// Sets the pref |kRestoreSelectedCountPrefName| as |count|. +void SetRestoreSelectedCountPref(PrefService* prefs, int count); + } // namespace full_restore } // namespace chromeos
diff --git a/chrome/browser/chromeos/full_restore/full_restore_prefs_unittest.cc b/chrome/browser/chromeos/full_restore/full_restore_prefs_unittest.cc index 2776a81a..0bcf8d2 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_prefs_unittest.cc +++ b/chrome/browser/chromeos/full_restore/full_restore_prefs_unittest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/chromeos/full_restore/full_restore_prefs.h" + #include "ash/public/cpp/ash_features.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" @@ -82,7 +83,7 @@ EXPECT_EQ(RestoreOption::kDoNotRestore, GetRestoreOption()); } -// When a new Chrome OS user, set 'always restore' as the default value if the +// For a new Chrome OS user, set 'always restore' as the default value if the // browser setting is 'continue where you left off'. TEST_F(FullRestorePrefsTest, NewChromeOSUserFromRestore) { GetFakeUserManager()->set_current_user_new(true); @@ -100,7 +101,7 @@ EXPECT_EQ(RestoreOption::kAlways, GetRestoreOption()); } -// When a new Chrome OS user, set 'ask every time' as the default value if the +// For a new Chrome OS user, set 'ask every time' as the default value if the // browser setting is 'new tab'. TEST_F(FullRestorePrefsTest, NewChromeOSUserFromNotRestore) { GetFakeUserManager()->set_current_user_new(true);
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service.cc b/chrome/browser/chromeos/full_restore/full_restore_service.cc index 8e86c53..04c01e38 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_service.cc +++ b/chrome/browser/chromeos/full_restore/full_restore_service.cc
@@ -8,12 +8,15 @@ #include "base/strings/string_util.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/chromeos/full_restore/app_launch_handler.h" +#include "chrome/browser/chromeos/full_restore/full_restore_data_handler.h" #include "chrome/browser/chromeos/full_restore/full_restore_prefs.h" #include "chrome/browser/chromeos/full_restore/full_restore_service_factory.h" #include "chrome/browser/chromeos/full_restore/new_user_restore_pref_handler.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/notifications/notification_display_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/settings_window_manager_chromeos.h" +#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "chromeos/constants/chromeos_features.h" @@ -29,10 +32,18 @@ const char kRestoreForCrashNotificationId[] = "restore_for_crash_notification"; const char kRestoreNotificationId[] = "restore_notification"; +const char kSetRestorePrefNotificationId[] = "set_restore_pref_notification"; + +// If the user selected the 'Restore' button from the restore notification +// dialog for more than |kMaxConsecutiveRestoreSelectionCount| times, show the +// set restore pref notification. +const int kMaxConsecutiveRestoreSelectionCount = 3; FullRestoreService::FullRestoreService(Profile* profile) : profile_(profile), - app_launch_handler_(std::make_unique<AppLaunchHandler>(profile_)) { + app_launch_handler_(std::make_unique<AppLaunchHandler>(profile_)), + restore_data_handler_( + std::make_unique<FullRestoreDataHandler>(profile_)) { // If the system crashed before reboot, show the restore notification. if (profile->GetLastSessionExitType() == Profile::EXIT_CRASHED) { ShowRestoreNotification(kRestoreForCrashNotificationId); @@ -79,33 +90,43 @@ void FullRestoreService::ShowRestoreNotification(const std::string& id) { message_center::RichNotificationData notification_data; + message_center::ButtonInfo restore_button(l10n_util::GetStringUTF16( - base::ToUpperASCII(IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON))); + base::ToUpperASCII(id == kSetRestorePrefNotificationId + ? IDS_SET_RESTORE_NOTIFICATION_BUTTON + : IDS_RESTORE_NOTIFICATION_RESTORE_BUTTON))); notification_data.buttons.push_back(restore_button); + message_center::ButtonInfo cancel_button(l10n_util::GetStringUTF16( base::ToUpperASCII(IDS_RESTORE_NOTIFICATION_CANCEL_BUTTON))); notification_data.buttons.push_back(cancel_button); - int message_id = id == kRestoreForCrashNotificationId - ? IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE - : IDS_RESTORE_NOTIFICATION_MESSAGE; + int title_id = id == kSetRestorePrefNotificationId + ? IDS_SET_RESTORE_NOTIFICATION_TITLE + : IDS_RESTORE_NOTIFICATION_TITLE; + + int message_id; + if (id == kRestoreForCrashNotificationId) + message_id = IDS_RESTORE_FOR_CRASH_NOTIFICATION_MESSAGE; + else if (id == kRestoreNotificationId) + message_id = IDS_RESTORE_NOTIFICATION_MESSAGE; + else + message_id = IDS_SET_RESTORE_NOTIFICATION_MESSAGE; std::unique_ptr<message_center::Notification> notification = ash::CreateSystemNotification( message_center::NOTIFICATION_TYPE_SIMPLE, id, - l10n_util::GetStringUTF16(IDS_RESTORE_NOTIFICATION_TITLE), + l10n_util::GetStringUTF16(title_id), l10n_util::GetStringUTF16(message_id), l10n_util::GetStringUTF16(IDS_RESTORE_NOTIFICATION_DISPLAY_SOURCE), GURL(), message_center::NotifierId( - message_center::NotifierType::SYSTEM_COMPONENT, - kRestoreForCrashNotificationId), + message_center::NotifierType::SYSTEM_COMPONENT, id), notification_data, base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( base::BindRepeating( &FullRestoreService::HandleRestoreNotificationClicked, - weak_ptr_factory_.GetWeakPtr(), - kRestoreForCrashNotificationId)), + weak_ptr_factory_.GetWeakPtr(), id)), kFullRestoreNotificationIcon, message_center::SystemNotificationWarningLevel::NORMAL); notification->set_priority(message_center::SYSTEM_PRIORITY); @@ -132,6 +153,23 @@ return; } + if (id == kSetRestorePrefNotificationId) { + // Show the 'On Startup' OS setting page. + chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( + profile_, chromeos::settings::mojom::kOnStartupSectionPath); + return; + } + + int count = GetRestoreSelectedCountPref(profile_->GetPrefs()); + + if (count < kMaxConsecutiveRestoreSelectionCount) + SetRestoreSelectedCountPref(profile_->GetPrefs(), ++count); + + // If the user selects the 'restore' button for more than 3 times, show the + // set restore pref notification. + if (count >= kMaxConsecutiveRestoreSelectionCount) + ShowRestoreNotification(kSetRestorePrefNotificationId); + Restore(); }
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service.h b/chrome/browser/chromeos/full_restore/full_restore_service.h index fcbec4f..eed24e4 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_service.h +++ b/chrome/browser/chromeos/full_restore/full_restore_service.h
@@ -18,10 +18,12 @@ namespace full_restore { class AppLaunchHandler; +class FullRestoreDataHandler; class NewUserRestorePrefHandler; extern const char kRestoreForCrashNotificationId[]; extern const char kRestoreNotificationId[]; +extern const char kSetRestorePrefNotificationId[]; // The restore notification button index. enum class RestoreNotificationButtonIndex { @@ -70,6 +72,8 @@ // restore data. std::unique_ptr<AppLaunchHandler> app_launch_handler_; + std::unique_ptr<FullRestoreDataHandler> restore_data_handler_; + base::WeakPtrFactory<FullRestoreService> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc b/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc index 7d78a91f..bcac9e9 100644 --- a/chrome/browser/chromeos/full_restore/full_restore_service_unittest.cc +++ b/chrome/browser/chromeos/full_restore/full_restore_service_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/browser/chromeos/full_restore/full_restore_service_factory.h" +#include "chrome/browser/chromeos/full_restore/full_restore_service.h" #include "ash/public/cpp/ash_features.h" #include "base/files/scoped_temp_dir.h" @@ -10,6 +10,7 @@ #include "base/optional.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/full_restore/full_restore_prefs.h" +#include "chrome/browser/chromeos/full_restore/full_restore_service_factory.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/browser/prefs/session_startup_pref.h" @@ -115,6 +116,25 @@ return message_center_notification.has_value(); } + void VerifyNotification(bool has_crash_notification, + bool has_restore_notification, + bool has_set_restore_notification) { + if (has_crash_notification) + EXPECT_TRUE(HasNotificationFor(kRestoreForCrashNotificationId)); + else + EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); + + if (has_restore_notification) + EXPECT_TRUE(HasNotificationFor(kRestoreNotificationId)); + else + EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + if (has_set_restore_notification) + EXPECT_TRUE(HasNotificationFor(kSetRestorePrefNotificationId)); + else + EXPECT_FALSE(HasNotificationFor(kSetRestorePrefNotificationId)); + } + void SimulateClick(const std::string& notification_id, RestoreNotificationButtonIndex action_index) { display_service()->SimulateClick( @@ -142,6 +162,10 @@ profile()->GetPrefs()->GetInteger(kRestoreAppsAndPagesPrefName)); } + int GetRestoreSelectedCount() const { + return profile()->GetPrefs()->GetInteger(kRestoreSelectedCountPrefName); + } + TestingProfile* profile() const { return profile_.get(); } const AccountId& account_id() const { return account_id_; } @@ -165,12 +189,14 @@ // If the system is crash, show the crash notification, and verify the restore // flag when click the restore button. -TEST_F(FullRestoreServiceTest, CrashAndRestore) { +// TODO(crbug.com/1046900): Fix this unit test. +TEST_F(FullRestoreServiceTest, DISABLED_CrashAndRestore) { profile()->set_last_session_exited_cleanly(false); CreateFullRestoreServiceForTesting(); - EXPECT_TRUE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + VerifyNotification(true /* has_crash_notification */, + false /* has_restore_notification */, + false /* has_set_restore_notification */); SimulateClick(kRestoreForCrashNotificationId, RestoreNotificationButtonIndex::kRestore); @@ -184,8 +210,9 @@ profile()->set_last_session_exited_cleanly(false); CreateFullRestoreServiceForTesting(); - EXPECT_TRUE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + VerifyNotification(true /* has_crash_notification */, + false /* has_restore_notification */, + false /* has_set_restore_notification */); SimulateClick(kRestoreForCrashNotificationId, RestoreNotificationButtonIndex::kCancel); @@ -200,8 +227,9 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); } @@ -213,8 +241,9 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Set the Chrome restore setting to simulate sync for the first time. @@ -226,8 +255,9 @@ content::RunAllTasksUntilIdle(); EXPECT_EQ(RestoreOption::kAlways, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Update the global values to simulate sync from other device. @@ -257,8 +287,9 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Set the Chrome restore setting to simulate sync for the first time. @@ -270,8 +301,9 @@ content::RunAllTasksUntilIdle(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Update the global values to simulate sync from other device. @@ -300,8 +332,9 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Set the restore pref setting to simulate sync for the first time. @@ -316,8 +349,9 @@ content::RunAllTasksUntilIdle(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Update the global values to simulate sync from other device. @@ -349,8 +383,9 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kDoNotRestore, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); // Simulate the Chrome restore setting is changed. @@ -364,22 +399,27 @@ } // If the OS restore setting is 'Ask every time', after reboot, show the restore -// notfication, and verify the restore flag when click the restore button. -TEST_F(FullRestoreServiceTest, AskEveryTimeAndRestore) { +// notification, and verify the restore flag when click the restore button. +// TODO(crbug.com/1046900): Fix this unit test. +TEST_F(FullRestoreServiceTest, DISABLED_AskEveryTimeAndRestore) { profile()->GetPrefs()->SetInteger( kRestoreAppsAndPagesPrefName, static_cast<int>(RestoreOption::kAskEveryTime)); CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_TRUE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false /* has_crash_notification */, + true /* has_restore_notification */, + false /* has_set_restore_notification */); SimulateClick(kRestoreNotificationId, RestoreNotificationButtonIndex::kRestore); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); EXPECT_TRUE(::full_restore::ShouldRestore(account_id())); + + VerifyNotification(false, false, false); } // If the OS restore setting is 'Ask every time', after reboot, show the restore @@ -391,14 +431,18 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_TRUE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false /* has_crash_notification */, + true /* has_restore_notification */, + false /* has_set_restore_notification */); SimulateClick(kRestoreNotificationId, RestoreNotificationButtonIndex::kCancel); EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); + + VerifyNotification(false, false, false); } // If the OS restore setting is 'Always', after reboot, don't show any @@ -409,8 +453,9 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kAlways, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_TRUE(::full_restore::ShouldRestore(account_id())); } @@ -423,10 +468,77 @@ CreateFullRestoreServiceForTesting(); EXPECT_EQ(RestoreOption::kDoNotRestore, GetRestoreOption()); - EXPECT_FALSE(HasNotificationFor(kRestoreForCrashNotificationId)); - EXPECT_FALSE(HasNotificationFor(kRestoreNotificationId)); + + VerifyNotification(false, false, false); + EXPECT_FALSE(::full_restore::ShouldRestore(account_id())); } +// If the restore option has been selected 3 times, show the set restore +// notification. +// TODO(crbug.com/1046900): Fix this unit test. +TEST_F(FullRestoreServiceTest, DISABLED_SetRestorePrefNotification) { + profile()->GetPrefs()->SetInteger( + kRestoreAppsAndPagesPrefName, + static_cast<int>(RestoreOption::kAskEveryTime)); + + // Set |kRestoreSelectedCountPrefName| = 2 to simulate the restore option has + // been selected twice. + profile()->GetPrefs()->SetInteger(kRestoreSelectedCountPrefName, 2); + + CreateFullRestoreServiceForTesting(); + + EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); + + VerifyNotification(false /* has_crash_notification */, + true /* has_restore_notification */, + false /* has_set_restore_notification */); + + // The restore option has been selected the 3rd times. + SimulateClick(kRestoreNotificationId, + RestoreNotificationButtonIndex::kRestore); + + EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); + EXPECT_TRUE(::full_restore::ShouldRestore(account_id())); + + // Verify the set restore notification is shown. + VerifyNotification(false /* has_crash_notification */, + false /* has_restore_notification */, + true /* has_set_restore_notification */); + + EXPECT_EQ(3, GetRestoreSelectedCount()); +} + +// When |kRestoreSelectedCountPrefName| = 3, if the restore option is selected +// again, |kRestoreSelectedCountPrefName| should not change. +// TODO(crbug.com/1046900): Fix this unit test. +TEST_F(FullRestoreServiceTest, DISABLED_RestoreSelectedCount) { + profile()->GetPrefs()->SetInteger( + kRestoreAppsAndPagesPrefName, + static_cast<int>(RestoreOption::kAskEveryTime)); + + // Set |kRestoreSelectedCountPrefName| = 3 to simulate the restore option has + // been selected 3 times locally. + profile()->GetPrefs()->SetInteger(kRestoreSelectedCountPrefName, 3); + + CreateFullRestoreServiceForTesting(); + + EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); + + // The restore option is selected. + SimulateClick(kRestoreNotificationId, + RestoreNotificationButtonIndex::kRestore); + + EXPECT_EQ(RestoreOption::kAskEveryTime, GetRestoreOption()); + EXPECT_TRUE(::full_restore::ShouldRestore(account_id())); + + // Verify the set restore notification is shown. + VerifyNotification(false /* has_crash_notification */, + false /* has_restore_notification */, + true /* has_set_restore_notification */); + + EXPECT_EQ(3, GetRestoreSelectedCount()); +} + } // namespace full_restore } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc index a95560e..44c3ad65 100644 --- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc +++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -11,7 +11,6 @@ #include "ash/public/cpp/test/shell_test_api.h" #include "base/bind.h" #include "base/command_line.h" -#include "base/files/scoped_temp_dir.h" #include "base/macros.h" #include "base/optional.h" #include "base/test/scoped_feature_list.h" @@ -593,8 +592,6 @@ } void SetUpOnMainThread() override { - ASSERT_TRUE(arc_temp_dir_.CreateUniqueTempDir()); - if (params_.is_tablet) ash::ShellTestApi().SetTabletModeEnabledForTest(true); @@ -604,8 +601,7 @@ arc::ArcSessionManager::Get()->SetArcSessionRunnerForTesting( std::make_unique<arc::ArcSessionRunner>( base::BindRepeating(arc::FakeArcSession::Create))); - EXPECT_TRUE(arc::ExpandPropertyFilesForTesting( - arc::ArcSessionManager::Get(), arc_temp_dir_.GetPath())); + arc::ExpandPropertyFilesForTesting(arc::ArcSessionManager::Get()); } } void TearDownInProcessBrowserTestFixture() override { @@ -645,7 +641,6 @@ std::unique_ptr<ScopedTestRecommendAppsFetcherFactory> recommend_apps_fetcher_factory_; net::EmbeddedTestServer* arc_tos_server_; - base::ScopedTempDir arc_temp_dir_; DISALLOW_COPY_AND_ASSIGN(OobeEndToEndTestSetupMixin); };
diff --git a/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc index bb8d44d..0570012 100644 --- a/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
@@ -6,7 +6,6 @@ #include <string> #include "ash/public/cpp/login_screen_test_api.h" -#include "base/files/scoped_temp_dir.h" #include "base/run_loop.h" #include "base/timer/timer.h" #include "chrome/browser/chromeos/arc/arc_util.h" @@ -62,14 +61,11 @@ } void SetUpOnMainThread() override { - ASSERT_TRUE(arc_temp_dir_.CreateUniqueTempDir()); - arc::ArcServiceLauncher::Get()->ResetForTesting(); arc::ArcSessionManager::Get()->SetArcSessionRunnerForTesting( std::make_unique<arc::ArcSessionRunner>( base::BindRepeating(arc::FakeArcSession::Create))); - EXPECT_TRUE(arc::ExpandPropertyFilesForTesting( - arc::ArcSessionManager::Get(), arc_temp_dir_.GetPath())); + arc::ExpandPropertyFilesForTesting(arc::ArcSessionManager::Get()); MixinBasedInProcessBrowserTest::SetUpOnMainThread(); // For this test class, the PRE tests just happen to always wait for active @@ -98,7 +94,6 @@ LoggedInUserMixin logged_in_user_mixin_{ &mixin_host_, content::IsPreTest() ? GetParam() : GetTargetUserType(), embedded_test_server(), this, false /*should_launch_browser*/}; - base::ScopedTempDir arc_temp_dir_; }; IN_PROC_BROWSER_TEST_P(SupervisionTransitionScreenTest,
diff --git a/chrome/browser/chromeos/net/network_health/network_health_unittest.cc b/chrome/browser/chromeos/net/network_health/network_health_unittest.cc index 4f6b281..80292df3 100644 --- a/chrome/browser/chromeos/net/network_health/network_health_unittest.cc +++ b/chrome/browser/chromeos/net/network_health/network_health_unittest.cc
@@ -60,20 +60,14 @@ const auto& initial_network_health_state = network_health_.GetNetworkHealthState(); - ASSERT_EQ(std::size_t(2), initial_network_health_state->networks.size()); - - // Check that VPN device state is always reported even if no VPNs exist. - ASSERT_EQ(network_config::mojom::NetworkType::kVPN, - initial_network_health_state->networks[0]->type); - ASSERT_EQ(network_health::mojom::NetworkState::kNotConnected, - initial_network_health_state->networks[0]->state); + ASSERT_EQ(std::size_t(1), initial_network_health_state->networks.size()); // Check that the default wifi device created by CrosNetworkConfigTestHelper // exists. ASSERT_EQ(network_config::mojom::NetworkType::kWiFi, - initial_network_health_state->networks[1]->type); + initial_network_health_state->networks[0]->type); ASSERT_EQ(network_health::mojom::NetworkState::kNotConnected, - initial_network_health_state->networks[1]->state); + initial_network_health_state->networks[0]->state); } mojom::NetworkPtr GetNetworkHealthStateByType(
diff --git a/chrome/browser/chromeos/phonehub/browser_tabs_model_provider_impl.cc b/chrome/browser/chromeos/phonehub/browser_tabs_model_provider_impl.cc index 2897b2dd..d82d04d 100644 --- a/chrome/browser/chromeos/phonehub/browser_tabs_model_provider_impl.cc +++ b/chrome/browser/chromeos/phonehub/browser_tabs_model_provider_impl.cc
@@ -55,6 +55,12 @@ } void BrowserTabsModelProviderImpl::TriggerRefresh() { + // crbug/1158480: Currently (January 2021), updates to synced sessions + // sometimes take a long time to arrive. As a workaround, + // SyncService::TriggerRefresh() is used, which bypasses some of the potential + // sources of latency (e.g. for delivering an invalidation), but not others + // (e.g. backend replication delay). I.e SyncService::TriggerRefresh() will + // not guarantee an immediate update. sync_service_->TriggerRefresh({syncer::SESSIONS}); }
diff --git a/chrome/browser/chromeos/policy/system_proxy_manager.cc b/chrome/browser/chromeos/policy/system_proxy_manager.cc index d9c290a..6b73c06b 100644 --- a/chrome/browser/chromeos/policy/system_proxy_manager.cc +++ b/chrome/browser/chromeos/policy/system_proxy_manager.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/chromeos/policy/system_proxy_manager.h" #include "base/bind.h" +#include "base/containers/contains.h" +#include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" @@ -17,8 +19,10 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/login/login_handler.h" #include "chrome/common/pref_names.h" #include "chromeos/dbus/system_proxy/system_proxy_client.h" +#include "chromeos/login/login_state/login_state.h" #include "chromeos/network/network_event_log.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" @@ -46,6 +50,40 @@ namespace { const char kSystemProxyService[] = "system-proxy-service"; + +// A `content::LoginDelegate` implementation that returns to the caller the +// proxy credentials set by the policy `SystemProxySettings`. +class SystemProxyLoginHandler : public content::LoginDelegate { + public: + SystemProxyLoginHandler() = default; + ~SystemProxyLoginHandler() override = default; + + SystemProxyLoginHandler(const SystemProxyLoginHandler&) = delete; + SystemProxyLoginHandler& operator=(const SystemProxyLoginHandler&) = delete; + + void AuthenticateWithCredentials( + const std::string& username, + const std::string& password, + LoginAuthRequiredCallback auth_required_callback) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&SystemProxyLoginHandler::InvokeWithCredentials, + weak_factory_.GetWeakPtr(), username, password, + std::move(auth_required_callback))); + } + + private: + void InvokeWithCredentials(const std::string& username, + const std::string& password, + LoginAuthRequiredCallback auth_required_callback) { + std::move(auth_required_callback) + .Run(base::make_optional<net::AuthCredentials>( + base::UTF8ToUTF16(username), base::UTF8ToUTF16(password))); + } + + base::WeakPtrFactory<SystemProxyLoginHandler> weak_factory_{this}; +}; + } // namespace namespace policy { @@ -380,6 +418,47 @@ /*default_value=*/std::string()); } +bool SystemProxyManager::CanUsePolicyCredentials( + const net::AuthChallengeInfo& auth_info, + bool first_auth_attempt) { + if (!auth_info.is_proxy || !first_auth_attempt) + return false; + + if (!chromeos::LoginState::IsInitialized() || + (!chromeos::LoginState::Get()->IsPublicSessionUser() && + !chromeos::LoginState::Get()->IsKioskApp())) { + VLOG(1) << "Only kiosk app and MGS can reuse the policy provided proxy " + "credentials for authentication"; + return false; + } + + if (!system_proxy_enabled_ || system_services_username_.empty() || + system_services_password_.empty()) { + return false; + } + + if (!IsManagedProxyConfigured()) { + return false; + } + if (!policy_credentials_auth_schemes_.empty()) { + if (!base::Contains(policy_credentials_auth_schemes_, auth_info.scheme)) { + VLOG(1) << "Auth scheme not allowed by policy"; + return false; + } + } + + return true; +} + +std::unique_ptr<content::LoginDelegate> SystemProxyManager::CreateLoginDelegate( + LoginAuthRequiredCallback auth_required_callback) { + auto login_delegate = std::make_unique<SystemProxyLoginHandler>(); + login_delegate->AuthenticateWithCredentials( + system_services_username_, system_services_password_, + std::move(auth_required_callback)); + return std::move(login_delegate); +} + void SystemProxyManager::OnSetAuthenticationDetails( const system_proxy::SetAuthenticationDetailsResponse& response) { if (response.has_error_message()) {
diff --git a/chrome/browser/chromeos/policy/system_proxy_manager.h b/chrome/browser/chromeos/policy/system_proxy_manager.h index dbde688..2d131c27 100644 --- a/chrome/browser/chromeos/policy/system_proxy_manager.h +++ b/chrome/browser/chromeos/policy/system_proxy_manager.h
@@ -17,6 +17,8 @@ #include "chrome/browser/extensions/api/settings_private/prefs_util.h" #include "chromeos/dbus/system_proxy/system_proxy_service.pb.h" #include "chromeos/network/network_state_handler_observer.h" +#include "components/user_manager/user_manager.h" +#include "content/public/browser/content_browser_client.h" #include "net/base/auth.h" namespace chromeos { @@ -25,6 +27,10 @@ class SystemProxyNotification; } // namespace chromeos +namespace content { +class LoginDelegate; +} + namespace system_proxy { class SetAuthenticationDetailsResponse; class ShutDownResponse; @@ -81,6 +87,23 @@ // Registers prefs stored in user profiles. static void RegisterProfilePrefs(PrefRegistrySimple* registry); + // Indicates whether the credentials set via the device policy + // SystemProxySettings can be used for proxy authentication in Chrome. The + // following conditions must be true: + // - the current session must be Managed Guest Session (MGS) or Kiosk app; + // - the proxy is set via policy; + // - System-proxy is enabled and credentials are set via policy; + // - `first_auth_attempt` is true; + // - `auth_info.scheme` must be allowed by the SystemProxySettings policy. + bool CanUsePolicyCredentials(const net::AuthChallengeInfo& auth_info, + bool first_auth_attempt); + + // Returns a login delegate that posts `auth_required_callback` with the + // credentials provided by the policy SystemProxySettings. Callers must verify + // that `CanUsePolicyCredentials` is true before calling this method. + std::unique_ptr<content::LoginDelegate> CreateLoginDelegate( + LoginAuthRequiredCallback auth_required_callback); + private: // NetworkStateHandlerObserver implementation void DefaultNetworkChanged(const chromeos::NetworkState* network) override;
diff --git a/chrome/browser/chromeos/policy/system_proxy_manager_browsertest.cc b/chrome/browser/chromeos/policy/system_proxy_manager_browsertest.cc index 45bbc133..06a07168 100644 --- a/chrome/browser/chromeos/policy/system_proxy_manager_browsertest.cc +++ b/chrome/browser/chromeos/policy/system_proxy_manager_browsertest.cc
@@ -17,7 +17,10 @@ #include "chrome/browser/chromeos/policy/system_proxy_manager.h" #include "chrome/browser/chromeos/ui/request_system_proxy_credentials_view.h" #include "chrome/browser/notifications/notification_display_service_tester.h" +#include "chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_test_utils.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/login/login_handler.h" +#include "chrome/browser/ui/login/login_handler_test_utils.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_browser_process.h" @@ -29,6 +32,7 @@ #include "chromeos/dbus/shill/shill_service_client.h" #include "chromeos/dbus/system_proxy/system_proxy_client.h" #include "chromeos/dbus/system_proxy/system_proxy_service.pb.h" +#include "chromeos/login/login_state/login_state.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_state.h" #include "chromeos/network/network_state_handler.h" @@ -46,8 +50,16 @@ #include "components/proxy_config/proxy_prefs.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_service.h" +#include "content/public/browser/storage_partition.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "net/base/proxy_server.h" +#include "net/dns/mock_host_resolver.h" +#include "net/http/http_auth_cache.h" +#include "net/test/embedded_test_server/default_handlers.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/spawned_test_server/spawned_test_server.h" +#include "net/url_request/url_request_context.h" #include "ui/views/controls/label.h" #include "ui/views/controls/textfield/textfield.h" @@ -618,4 +630,167 @@ ExpectSystemCredentialsSent(kUsername, kPassword, {"ntlm"}); } +namespace { +constexpr char kProxyUsername[] = "foo"; +constexpr char kProxyPassword[] = "bar"; +constexpr char kBadUsername[] = "bad-username"; +constexpr char kBadPassword[] = "bad-pwd"; +constexpr char kOriginHostname[] = "a.test"; +} // namespace + +class SystemProxyCredentialsReuseBrowserTest + : public SystemProxyManagerPolicyCredentialsBrowserTest { + public: + SystemProxyCredentialsReuseBrowserTest() + : proxy_server_(std::make_unique<net::SpawnedTestServer>( + net::SpawnedTestServer::TYPE_BASIC_AUTH_PROXY, + base::FilePath())) {} + SystemProxyCredentialsReuseBrowserTest( + const SystemProxyCredentialsReuseBrowserTest&) = delete; + SystemProxyCredentialsReuseBrowserTest& operator=( + const SystemProxyCredentialsReuseBrowserTest&) = delete; + ~SystemProxyCredentialsReuseBrowserTest() override = default; + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + host_resolver()->AddRule(kOriginHostname, "127.0.0.1"); + proxy_server_->set_redirect_connect_to_localhost(true); + ASSERT_TRUE(proxy_server_->Start()); + + https_server_ = std::make_unique<net::EmbeddedTestServer>( + net::EmbeddedTestServer::TYPE_HTTPS); + https_server_->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); + https_server_->ServeFilesFromSourceDirectory("chrome/test/data"); + net::test_server::RegisterDefaultHandlers(https_server_.get()); + ASSERT_TRUE(https_server_->Start()); + } + + protected: + content::WebContents* GetWebContents() const { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + void SetManagedProxy() { + // Configure a proxy via user policy. + base::Value proxy_config(base::Value::Type::DICTIONARY); + proxy_config.SetKey("mode", + base::Value(ProxyPrefs::kFixedServersProxyModeName)); + proxy_config.SetKey( + "server", base::Value(proxy_server_->host_port_pair().ToString())); + browser()->profile()->GetPrefs()->Set(proxy_config::prefs::kProxy, + proxy_config); + RunUntilIdle(); + } + + GURL GetServerUrl(const std::string& page) { + return https_server_->GetURL(kOriginHostname, page); + } + + // Navigates to the test page "/simple.html" and authenticates in the proxy + // login dialog with `username` and `password`. + void LoginWithDialog(const std::string& username, + const std::string& password) { + LoginPromptBrowserTestObserver login_observer; + login_observer.Register(content::Source<content::NavigationController>( + &GetWebContents()->GetController())); + WindowedAuthNeededObserver auth_needed(&GetWebContents()->GetController()); + ui_test_utils::NavigateToURL(browser(), GetServerUrl("/simple.html")); + auth_needed.Wait(); + WindowedAuthSuppliedObserver auth_supplied( + &GetWebContents()->GetController()); + LoginHandler* login_handler = login_observer.handlers().front(); + login_handler->SetAuth(base::ASCIIToUTF16(username), + base::ASCIIToUTF16(password)); + auth_supplied.Wait(); + EXPECT_EQ(1, login_observer.auth_supplied_count()); + } + + void CheckEntryInHttpAuthCache(const std::string& auth_scheme, + const std::string& expected_username, + const std::string& expected_password) { + network::mojom::NetworkContext* network_context = + content::BrowserContext::GetDefaultStoragePartition( + browser()->profile()) + ->GetNetworkContext(); + std::string username; + std::string password; + base::RunLoop loop; + network_context->LookupProxyAuthCredentials( + net::ProxyServer(net::ProxyServer::SCHEME_HTTP, + proxy_server_->host_port_pair()), + auth_scheme, "MyRealm1", + base::BindOnce( + [](std::string* username, std::string* password, + base::OnceClosure closure, + const base::Optional<net::AuthCredentials>& credentials) { + if (credentials) { + *username = base::UTF16ToUTF8(credentials->username()); + *password = base::UTF16ToUTF8(credentials->password()); + } + std::move(closure).Run(); + }, + &username, &password, loop.QuitClosure())); + loop.Run(); + EXPECT_EQ(username, expected_username); + EXPECT_EQ(password, expected_password); + } + + SystemProxyManager* GetSystemProxyManager() { + return g_browser_process->platform_part() + ->browser_policy_connector_chromeos() + ->GetSystemProxyManager(); + } + + std::unique_ptr<net::EmbeddedTestServer> https_server_; + // A proxy server which requires authentication using the 'Basic' + // authentication method. + std::unique_ptr<net::SpawnedTestServer> proxy_server_; +}; + +// Verifies that the policy provided credentials are not used for regular users. +IN_PROC_BROWSER_TEST_F(SystemProxyCredentialsReuseBrowserTest, RegularUser) { + SetManagedProxy(); + SetPolicyCredentials(kProxyUsername, kProxyPassword); + LoginWithDialog(kProxyUsername, kProxyPassword); + CheckEntryInHttpAuthCache("Basic", kProxyUsername, kProxyPassword); +} + +// Verifies that the policy provided credentials are used for MGS. +IN_PROC_BROWSER_TEST_F(SystemProxyCredentialsReuseBrowserTest, + PolicyCredentialsUsed) { + SetManagedProxy(); + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + SetPolicyCredentials(kProxyUsername, kProxyPassword); + ui_test_utils::NavigateToURL(browser(), GetServerUrl("/simple.html")); + CheckEntryInHttpAuthCache("Basic", kProxyUsername, kProxyPassword); +} + +// Verifies that if the policy provided proxy credentials are not correct in a +// MGS, then the user is prompted for credentials. +IN_PROC_BROWSER_TEST_F(SystemProxyCredentialsReuseBrowserTest, + BadPolicyCredentials) { + SetManagedProxy(); + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + SetPolicyCredentials(kBadUsername, kBadPassword); + LoginWithDialog(kProxyUsername, kProxyPassword); + CheckEntryInHttpAuthCache("Basic", kProxyUsername, kProxyPassword); +} + +// Verifies that the policy provided proxy credentials are only used for +// authentication schemes allowed by the SystemProxySettings policy. +IN_PROC_BROWSER_TEST_F(SystemProxyCredentialsReuseBrowserTest, + RestrictedPolicyCredentials) { + SetManagedProxy(); + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + SetPolicyCredentials(kProxyUsername, kProxyPassword, R"("ntlm","digest")"); + LoginWithDialog(kProxyUsername, kProxyPassword); + CheckEntryInHttpAuthCache("Basic", kProxyUsername, kProxyPassword); +} + } // namespace policy
diff --git a/chrome/browser/chromeos/policy/system_proxy_manager_unittest.cc b/chrome/browser/chromeos/policy/system_proxy_manager_unittest.cc index 741002e3..8080a24 100644 --- a/chrome/browser/chromeos/policy/system_proxy_manager_unittest.cc +++ b/chrome/browser/chromeos/policy/system_proxy_manager_unittest.cc
@@ -20,6 +20,8 @@ #include "chromeos/network/network_handler.h" #include "components/arc/arc_prefs.h" #include "components/prefs/pref_service.h" +#include "components/proxy_config/proxy_config_pref_names.h" +#include "components/proxy_config/proxy_prefs.h" #include "content/public/browser/network_service_instance.h" #include "content/public/browser/storage_partition.h" #include "content/public/test/browser_task_environment.h" @@ -43,6 +45,8 @@ namespace { constexpr char kBrowserUsername[] = "browser_username"; constexpr char kBrowserPassword[] = "browser_password"; +constexpr char kPolicyUsername[] = "policy_username"; +constexpr char kPolicyPassword[] = "policy_password"; constexpr char kKerberosActivePrincipalName[] = "kerberos_princ_name"; constexpr char kProxyAuthUrl[] = "http://example.com:3128"; constexpr char kProxyAuthEmptyPath[] = "http://example.com:3128/"; @@ -73,6 +77,22 @@ return network::NetworkService::GetNetworkServiceForTesting(); } +void SetManagedProxy(Profile* profile) { + // Configure a proxy via user policy. + base::Value proxy_config(base::Value::Type::DICTIONARY); + proxy_config.SetKey("mode", + base::Value(ProxyPrefs::kFixedServersProxyModeName)); + proxy_config.SetKey("server", base::Value(kProxyAuthUrl)); + profile->GetPrefs()->Set(proxy_config::prefs::kProxy, proxy_config); +} + +net::AuthChallengeInfo GetAuthInfo() { + net::AuthChallengeInfo auth_info; + auth_info.is_proxy = true; + auth_info.scheme = kScheme; + return auth_info; +} + } // namespace namespace policy { @@ -88,6 +108,7 @@ testing::Test::SetUp(); chromeos::shill_clients::InitializeFakes(); chromeos::NetworkHandler::Initialize(); + chromeos::LoginState::Initialize(); profile_ = std::make_unique<TestingProfile>(); chromeos::SystemProxyClient::InitializeFake(); @@ -95,11 +116,14 @@ chromeos::CrosSettings::Get(), local_state_.Get()); // Listen for pref changes for the primary profile. system_proxy_manager_->StartObservingPrimaryProfilePrefs(profile_.get()); + chromeos::NetworkHandler::Get()->InitializePrefServices( + profile_->GetPrefs(), local_state_.Get()); } void TearDown() override { system_proxy_manager_->StopObservingPrimaryProfilePrefs(); system_proxy_manager_.reset(); + chromeos::LoginState::Shutdown(); chromeos::SystemProxyClient::Shutdown(); chromeos::NetworkHandler::Shutdown(); chromeos::shill_clients::Shutdown(); @@ -334,4 +358,98 @@ .empty()); } +// Verifies that only MGS and Kiosk can use the policy provided credentials. +TEST_F(SystemProxyManagerTest, CanUsePolicyCredentialsUserType) { + SetPolicy(/*system_proxy_enabled=*/true, + /*system_services_username=*/kPolicyUsername, + /*system_services_password=*/kPolicyPassword); + SetManagedProxy(profile_.get()); + + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + + EXPECT_TRUE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/true)); + + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_KIOSK_APP); + + EXPECT_TRUE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/true)); + + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_REGULAR); + + EXPECT_FALSE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/true)); +} + +// Verifies that the policy provided credentials are only used for proxy auth. +TEST_F(SystemProxyManagerTest, CanUsePolicyCredentialsOriginServer) { + SetPolicy(/*system_proxy_enabled=*/true, + /*system_services_username=*/kPolicyUsername, + /*system_services_password=*/kPolicyPassword); + SetManagedProxy(profile_.get()); + + net::AuthChallengeInfo auth_info = GetAuthInfo(); + auth_info.is_proxy = false; + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + + EXPECT_FALSE(system_proxy_manager_->CanUsePolicyCredentials( + auth_info, /*first_auth_attempt=*/true)); +} + +// Verifies that the policy provided credentials are only used for managed +// proxies. +TEST_F(SystemProxyManagerTest, CanUsePolicyCredentialsNoManagedProxy) { + SetPolicy(/*system_proxy_enabled=*/true, + /*system_services_username=*/kPolicyUsername, + /*system_services_password=*/kPolicyPassword); + + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + + EXPECT_FALSE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/true)); +} + +// Verifies that `CanUsePolicyCredentials` returns false if no credentials are +// specified by policy. +TEST_F(SystemProxyManagerTest, NoPolicyCredentials) { + SetPolicy(/*system_proxy_enabled=*/true, + /*system_services_username=*/"", + /*system_services_password=*/""); + SetManagedProxy(profile_.get()); + + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + + EXPECT_FALSE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/true)); +} + +// Verifies that `CanUsePolicyCredentials` is only returning true for the first +// auth attempt. +TEST_F(SystemProxyManagerTest, CanUsePolicyCredentialsMgsMaxTries) { + SetPolicy(/*system_proxy_enabled=*/true, + /*system_services_username=*/kPolicyUsername, + /*system_services_password=*/kPolicyPassword); + SetManagedProxy(profile_.get()); + + chromeos::LoginState::Get()->SetLoggedInState( + chromeos::LoginState::LOGGED_IN_ACTIVE, + chromeos::LoginState::LOGGED_IN_USER_PUBLIC_ACCOUNT_MANAGED); + EXPECT_TRUE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/true)); + EXPECT_FALSE(system_proxy_manager_->CanUsePolicyCredentials( + GetAuthInfo(), /*first_auth_attempt=*/false)); +} + } // namespace policy
diff --git a/chrome/browser/chromeos/scanning/scan_service.cc b/chrome/browser/chromeos/scanning/scan_service.cc index 62d98b2..aa3627b 100644 --- a/chrome/browser/chromeos/scanning/scan_service.cc +++ b/chrome/browser/chromeos/scanning/scan_service.cc
@@ -13,6 +13,7 @@ #include "base/files/file_util.h" #include "base/location.h" #include "base/metrics/histogram_functions.h" +#include "base/optional.h" #include "base/sequenced_task_runner.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" @@ -22,6 +23,7 @@ #include "base/time/time.h" #include "chrome/browser/chromeos/scanning/lorgnette_scanner_manager.h" #include "chrome/browser/chromeos/scanning/scanning_type_converters.h" +#include "chromeos/components/scanning/scanning_uma.h" #include "third_party/skia/include/codec/SkCodec.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkData.h" @@ -221,11 +223,21 @@ return scan_to_path.Append(filename); } -// Records the histograms for scan job success and number of pages scanned. -void RecordScanJobResult(bool success, int num_pages_scanned) { +// Records the histograms based on the scan job result. +void RecordScanJobResult( + bool success, + const base::Optional<scanning::ScanJobFailureReason>& failure_reason, + int num_pages_scanned) { base::UmaHistogramBoolean("Scanning.ScanJobSuccessful", success); - if (success) + if (success) { base::UmaHistogramCounts100("Scanning.NumPagesScanned", num_pages_scanned); + return; + } + + if (failure_reason.has_value()) { + base::UmaHistogramEnumeration("Scanning.ScanJobFailureReason", + failure_reason.value()); + } } } // namespace @@ -272,9 +284,18 @@ mojo::PendingRemote<mojo_ipc::ScanJobObserver> observer, StartScanCallback callback) { const std::string scanner_name = GetScannerName(scanner_id); - if (scanner_name.empty() || !FilePathSupported(settings->scan_to_path)) { + if (scanner_name.empty()) { std::move(callback).Run(false); - RecordScanJobResult(false, /*not used*/ 0); + RecordScanJobResult(false, scanning::ScanJobFailureReason::kScannerNotFound, + /*not used*/ 0); + return; + } + + if (!FilePathSupported(settings->scan_to_path)) { + std::move(callback).Run(false); + RecordScanJobResult(false, + scanning::ScanJobFailureReason::kUnsupportedScanToPath, + /*not used*/ 0); return; } @@ -431,25 +452,33 @@ } void ScanService::OnPdfSaved(const bool success) { - save_failed_ = !success; + page_save_failed_ = !success; } void ScanService::OnPageSaved(const base::FilePath& saved_file_path) { - save_failed_ = save_failed_ || saved_file_path.empty(); - last_scanned_file_path_ = save_failed_ ? base::FilePath() : saved_file_path; + page_save_failed_ = page_save_failed_ || saved_file_path.empty(); + last_scanned_file_path_ = + page_save_failed_ ? base::FilePath() : saved_file_path; } void ScanService::OnAllPagesSaved(bool success) { - save_failed_ = !success || save_failed_; - if (save_failed_) + base::Optional<scanning::ScanJobFailureReason> failure_reason = base::nullopt; + if (!success) { + failure_reason = scanning::ScanJobFailureReason::kUnknownScannerError; last_scanned_file_path_.clear(); + } else if (page_save_failed_) { + failure_reason = scanning::ScanJobFailureReason::kSaveToDiskFailed; + last_scanned_file_path_.clear(); + } - scan_job_observer_->OnScanComplete(!save_failed_, last_scanned_file_path_); - RecordScanJobResult(!save_failed_, num_pages_scanned_); + scan_job_observer_->OnScanComplete(success && !page_save_failed_, + last_scanned_file_path_); + RecordScanJobResult(success && !page_save_failed_, failure_reason, + num_pages_scanned_); } void ScanService::ClearScanState() { - save_failed_ = false; + page_save_failed_ = false; last_scanned_file_path_.clear(); scanned_images_.clear(); num_pages_scanned_ = 0;
diff --git a/chrome/browser/chromeos/scanning/scan_service.h b/chrome/browser/chromeos/scanning/scan_service.h index c561e7a..aac5425 100644 --- a/chrome/browser/chromeos/scanning/scan_service.h +++ b/chrome/browser/chromeos/scanning/scan_service.h
@@ -143,7 +143,7 @@ base::FilePath google_drive_path_; // Indicates whether there was a failure to save scanned images. - bool save_failed_; + bool page_save_failed_; // The scanned images used to create a multipage PDF. std::vector<std::string> scanned_images_;
diff --git a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc index 230dbc0..29f6cb5 100644 --- a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc +++ b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc
@@ -33,12 +33,19 @@ constexpr base::TimeDelta kConnectionStatusChangeTimeout = base::TimeDelta::FromSeconds(10); +// The amount of time by which we can expect a WebRTC upgrade to have been +// completed. According to metrics, 30 seconds is the 95th+ percentile of how +// long it takes to upgrade to WebRTC. +constexpr base::TimeDelta kWebRtcUpgradeDelay = + base::TimeDelta::FromSeconds(30); + // Numerical values should not be reused or changed since this is used by // metrics. enum class ConnectionMedium { kConnectedViaBluetooth = 0, kUpgradedToWebRtc = 1, - kMaxValue = kUpgradedToWebRtc + kDisconnectedInUnder30Seconds = 2, + kMaxValue = kDisconnectedInUnder30Seconds }; void RecordConnectionMediumMetric(ConnectionMedium medium) { @@ -142,7 +149,24 @@ weak_ptr_factory_.GetWeakPtr())); } -void NearbyConnectionBrokerImpl::Disconnect() { +void NearbyConnectionBrokerImpl::Disconnect( + util::NearbyDisconnectionReason reason) { + // Only log a single disconnection reason per connection attempt. Edge cases + // can cause this function to be invoked multiple times. + if (!has_disconnect_reason_been_logged_) { + has_disconnect_reason_been_logged_ = true; + util::RecordNearbyDisconnection(reason); + } + + if (!has_recorded_no_webrtc_metric_ && !has_upgraded_to_webrtc_ && + !time_when_connection_accepted_.is_null() && + (base::Time::Now() - time_when_connection_accepted_) < + kWebRtcUpgradeDelay) { + has_recorded_no_webrtc_metric_ = true; + RecordConnectionMediumMetric( + ConnectionMedium::kDisconnectedInUnder30Seconds); + } + if (!need_to_disconnect_endpoint_) { TransitionToDisconnectedAndInvokeCallback(); return; @@ -190,20 +214,24 @@ void NearbyConnectionBrokerImpl::OnDiscoveryFailure() { DCHECK_EQ(ConnectionStatus::kDiscoveringEndpoint, connection_status_); - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kFailedDiscovery); } void NearbyConnectionBrokerImpl::OnRequestConnectionResult(Status status) { + util::RecordRequestConnectionResult(status); + // In the success case, OnConnectionInitiated() is expected to be called to // continue the flow, so nothing else needs to be done in this callback. if (status == Status::kSuccess) return; PA_LOG(WARNING) << "RequestConnection() failed: " << status; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kFailedRequestingConnection); } void NearbyConnectionBrokerImpl::OnAcceptConnectionResult(Status status) { + util::RecordAcceptConnectionResult(status); + if (status == Status::kSuccess) { DCHECK_EQ(ConnectionStatus::kAcceptingConnection, connection_status_); TransitionToStatus( @@ -212,12 +240,14 @@ } PA_LOG(WARNING) << "AcceptConnection() failed: " << status; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kFailedAcceptingConnection); } void NearbyConnectionBrokerImpl::OnSendPayloadResult( SendMessageCallback callback, Status status) { + util::RecordSendPayloadResult(status); + bool success = status == Status::kSuccess; std::move(callback).Run(success); @@ -228,10 +258,12 @@ return; PA_LOG(WARNING) << "OnSendPayloadResult() failed: " << status; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kSendMessageFailed); } void NearbyConnectionBrokerImpl::OnDisconnectFromEndpointResult(Status status) { + util::RecordDisconnectFromEndpointResult(status); + // If the disconnection was successful, wait for the OnDisconnected() // callback. if (status == Status::kSuccess) @@ -240,7 +272,7 @@ PA_LOG(WARNING) << "Failed to disconnect from endpoint with ID " << remote_endpoint_id_ << ": " << status; need_to_disconnect_endpoint_ = false; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kDisconnectionRequestedByClient); } void NearbyConnectionBrokerImpl::OnConnectionStatusChangeTimeout() { @@ -257,11 +289,32 @@ need_to_disconnect_endpoint_ = true; PA_LOG(WARNING) << "Timeout changing connection status"; - Disconnect(); + util::NearbyDisconnectionReason reason; + switch (connection_status_) { + case ConnectionStatus::kDiscoveringEndpoint: + reason = util::NearbyDisconnectionReason::kTimeoutDuringDiscovery; + break; + case ConnectionStatus::kRequestingConnection: + reason = util::NearbyDisconnectionReason::kTimeoutDuringRequestConnection; + break; + case ConnectionStatus::kAcceptingConnection: + reason = util::NearbyDisconnectionReason::kTimeoutDuringAcceptConnection; + break; + case ConnectionStatus::kWaitingForConnectionToBeAcceptedByRemoteDevice: + reason = + util::NearbyDisconnectionReason::kTimeoutWaitingForConnectionAccepted; + break; + default: + NOTREACHED() << "Unexpected timeout with connection status " + << connection_status_; + reason = util::NearbyDisconnectionReason::kConnectionLost; + break; + } + Disconnect(reason); } void NearbyConnectionBrokerImpl::OnMojoDisconnection() { - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kDisconnectionRequestedByClient); } void NearbyConnectionBrokerImpl::SendMessage(const std::string& message, @@ -339,7 +392,7 @@ } PA_LOG(WARNING) << "Connection rejected: " << status; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kConnectionRejected); } void NearbyConnectionBrokerImpl::OnDisconnected( @@ -354,7 +407,7 @@ PA_LOG(WARNING) << "Connection disconnected unexpectedly"; } need_to_disconnect_endpoint_ = false; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kConnectionLost); } void NearbyConnectionBrokerImpl::OnBandwidthChanged( @@ -369,6 +422,7 @@ PA_LOG(INFO) << "Bandwidth changed: " << medium; if (medium == Medium::kWebRtc) { + has_upgraded_to_webrtc_ = true; RecordConnectionMediumMetric(ConnectionMedium::kUpgradedToWebRtc); DCHECK(!time_when_connection_accepted_.is_null()); @@ -390,7 +444,7 @@ if (!payload->content->is_bytes()) { PA_LOG(WARNING) << "OnPayloadReceived(): Received unexpected payload type " << "(was expecting bytes type). Disconnecting."; - Disconnect(); + Disconnect(util::NearbyDisconnectionReason::kReceivedUnexpectedPayloadType); return; }
diff --git a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.h b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.h index 8b9bbc37..412c43b 100644 --- a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.h +++ b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.h
@@ -13,6 +13,7 @@ #include "base/time/time.h" #include "base/timer/timer.h" #include "chrome/browser/chromeos/secure_channel/nearby_connection_broker.h" +#include "chrome/browser/chromeos/secure_channel/util/histogram_util.h" #include "chromeos/services/nearby/public/mojom/nearby_connections.mojom.h" #include "mojo/public/cpp/bindings/shared_remote.h" @@ -102,7 +103,7 @@ std::unique_ptr<base::OneShotTimer> timer); void TransitionToStatus(ConnectionStatus connection_status); - void Disconnect(); + void Disconnect(util::NearbyDisconnectionReason reason); void TransitionToDisconnectedAndInvokeCallback(); void OnEndpointDiscovered( @@ -167,6 +168,14 @@ // Starts empty, then set in OnEndpointDiscovered(). std::string remote_endpoint_id_; + // Starts as false and changes to true when WebRTC upgrade occurs. + bool has_upgraded_to_webrtc_ = false; + + // Whether or not a metric has been logged to note that a metric has been + // logged indicated that Disconnect() was called before a WebRTC upgrade + // occurred. + bool has_recorded_no_webrtc_metric_ = false; + // Starts as false; set to true in OnConnectionInitiated() and back to false // in OnDisconnected(). bool need_to_disconnect_endpoint_ = false; @@ -174,6 +183,8 @@ // Starts as null; set in OnConnectionAccepted(). base::Time time_when_connection_accepted_; + bool has_disconnect_reason_been_logged_ = false; + base::WeakPtrFactory<NearbyConnectionBrokerImpl> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/chromeos/secure_channel/nearby_connector_impl.cc b/chrome/browser/chromeos/secure_channel/nearby_connector_impl.cc index 66b2ecd..7d4be51 100644 --- a/chrome/browser/chromeos/secure_channel/nearby_connector_impl.cc +++ b/chrome/browser/chromeos/secure_channel/nearby_connector_impl.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.h" #include "chrome/browser/chromeos/secure_channel/nearby_endpoint_finder_impl.h" +#include "chrome/browser/chromeos/secure_channel/util/histogram_util.h" #include "chromeos/components/multidevice/logging/logging.h" #include "chromeos/services/nearby/public/cpp/nearby_process_manager.h" #include "chromeos/services/secure_channel/public/cpp/client/nearby_connector.h" @@ -132,6 +133,12 @@ PA_LOG(WARNING) << "Nearby process stopped unexpectedly. Destroying active " << "connections."; + // Record the disconnection reason for each of the active brokers. + for (size_t i = 0; i < id_to_brokers_map_.size(); ++i) { + util::RecordNearbyDisconnection( + util::NearbyDisconnectionReason::kNearbyProcessCrash); + } + ClearActiveAndPendingConnections(); ProcessQueuedConnectionRequests(); }
diff --git a/chrome/browser/chromeos/secure_channel/nearby_endpoint_finder_impl.cc b/chrome/browser/chromeos/secure_channel/nearby_endpoint_finder_impl.cc index 7f09862..f0bfa65d 100644 --- a/chrome/browser/chromeos/secure_channel/nearby_endpoint_finder_impl.cc +++ b/chrome/browser/chromeos/secure_channel/nearby_endpoint_finder_impl.cc
@@ -6,6 +6,7 @@ #include "base/memory/ptr_util.h" #include "base/rand_util.h" +#include "chrome/browser/chromeos/secure_channel/util/histogram_util.h" #include "chromeos/components/multidevice/logging/logging.h" #include "chromeos/services/secure_channel/public/mojom/nearby_connector.mojom.h" @@ -25,6 +26,8 @@ const size_t kEndpointInfoLength = 4u; void OnStopDiscoveryDestructorResult(Status status) { + util::RecordStopDiscoveryResult(status); + if (status != Status::kSuccess) PA_LOG(WARNING) << "Failed to stop discovery as part of destructor"; } @@ -100,6 +103,8 @@ } void NearbyEndpointFinderImpl::OnStartDiscoveryResult(Status status) { + util::RecordStartDiscoveryResult(status); + if (status != Status::kSuccess) { PA_LOG(WARNING) << "Failed to start Nearby discovery: " << status; is_discovery_active_ = false; @@ -117,6 +122,8 @@ } void NearbyEndpointFinderImpl::OnInjectBluetoothEndpointResult(Status status) { + util::RecordInjectEndpointResult(status); + if (status != Status::kSuccess) { PA_LOG(WARNING) << "Failed to inject Bluetooth endpoint: " << status; NotifyEndpointDiscoveryFailure(); @@ -129,6 +136,8 @@ void NearbyEndpointFinderImpl::OnStopDiscoveryResult( location::nearby::connections::mojom::DiscoveredEndpointInfoPtr info, Status status) { + util::RecordStopDiscoveryResult(status); + is_discovery_active_ = false; if (status != Status::kSuccess) {
diff --git a/chrome/browser/chromeos/secure_channel/util/histogram_util.cc b/chrome/browser/chromeos/secure_channel/util/histogram_util.cc index 74f0db9f..de5adbc 100644 --- a/chrome/browser/chromeos/secure_channel/util/histogram_util.cc +++ b/chrome/browser/chromeos/secure_channel/util/histogram_util.cc
@@ -9,12 +9,60 @@ namespace chromeos { namespace secure_channel { namespace util { +namespace { +using location::nearby::connections::mojom::Status; +} // namespace + +void RecordStartDiscoveryResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.StartDiscovery", + status); +} + +void RecordInjectEndpointResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.InjectEndpoint", + status); +} + +void RecordStopDiscoveryResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.StopDiscovery", status); +} + +void RecordRequestConnectionResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.RequestConnection", + status); +} + +void RecordAcceptConnectionResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.AcceptConnection", + status); +} + +void RecordSendPayloadResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.SendPayload", status); +} + +void RecordDisconnectFromEndpointResult(Status status) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.OperationResult.DisconnectFromEndpoint", + status); +} void LogMessageAction(MessageAction message_action) { base::UmaHistogramEnumeration( "MultiDevice.SecureChannel.Nearby.MessageAction", message_action); } +void RecordNearbyDisconnection(NearbyDisconnectionReason reason) { + base::UmaHistogramEnumeration( + "MultiDevice.SecureChannel.Nearby.DisconnectionReason", reason); +} + } // namespace util } // namespace secure_channel } // namespace chromeos
diff --git a/chrome/browser/chromeos/secure_channel/util/histogram_util.h b/chrome/browser/chromeos/secure_channel/util/histogram_util.h index 559c5137..1c250b2 100644 --- a/chrome/browser/chromeos/secure_channel/util/histogram_util.h +++ b/chrome/browser/chromeos/secure_channel/util/histogram_util.h
@@ -5,10 +5,28 @@ #ifndef CHROME_BROWSER_CHROMEOS_SECURE_CHANNEL_UTIL_HISTOGRAM_UTIL_H_ #define CHROME_BROWSER_CHROMEOS_SECURE_CHANNEL_UTIL_HISTOGRAM_UTIL_H_ +#include "chromeos/services/nearby/public/mojom/nearby_connections_types.mojom.h" + namespace chromeos { namespace secure_channel { namespace util { +// Logs the result of Nearby Connections API functions. +void RecordStartDiscoveryResult( + location::nearby::connections::mojom::Status status); +void RecordInjectEndpointResult( + location::nearby::connections::mojom::Status status); +void RecordStopDiscoveryResult( + location::nearby::connections::mojom::Status status); +void RecordRequestConnectionResult( + location::nearby::connections::mojom::Status status); +void RecordAcceptConnectionResult( + location::nearby::connections::mojom::Status status); +void RecordSendPayloadResult( + location::nearby::connections::mojom::Status status); +void RecordDisconnectFromEndpointResult( + location::nearby::connections::mojom::Status status); + // Enumeration of possible message transfer action via Nearby Connection // library. Keep in sync with corresponding enum in // tools/metrics/histograms/enums.xml. These values are persisted to logs. @@ -22,6 +40,28 @@ // Logs a given message transfer action. void LogMessageAction(MessageAction message_action); +// Reasons why a Nearby Connection may become disconnected. These values are +// persisted to logs. Entries should not be renumbered and numeric values should +// never be reused. +enum class NearbyDisconnectionReason { + kDisconnectionRequestedByClient = 0, + kFailedDiscovery = 1, + kTimeoutDuringDiscovery = 2, + kFailedRequestingConnection = 3, + kTimeoutDuringRequestConnection = 4, + kFailedAcceptingConnection = 5, + kTimeoutDuringAcceptConnection = 6, + kConnectionRejected = 7, + kTimeoutWaitingForConnectionAccepted = 8, + kSendMessageFailed = 9, + kReceivedUnexpectedPayloadType = 10, + kConnectionLost = 11, + kNearbyProcessCrash = 12, + kMaxValue = kNearbyProcessCrash +}; + +void RecordNearbyDisconnection(NearbyDisconnectionReason reason); + } // namespace util } // namespace secure_channel } // namespace chromeos
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc index cf3b88c..4ef2087 100644 --- a/chrome/browser/component_updater/registration.cc +++ b/chrome/browser/component_updater/registration.cc
@@ -105,9 +105,12 @@ // PNaCl on Chrome OS is on rootfs and there is no need to download it. But // Chrome4ChromeOS on Linux doesn't contain PNaCl so enable component // installer when running on Linux. See crbug.com/422121 for more details. - if (!base::SysInfo::IsRunningOnChromeOS()) + if (!base::SysInfo::IsRunningOnChromeOS()) { #endif // BUILDFLAG(IS_CHROMEOS_ASH) RegisterPnaclComponent(cus); +#if BUILDFLAG(IS_CHROMEOS_ASH) + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) #endif // BUILDFLAG(ENABLE_NACL) && !defined(OS_ANDROID) RegisterSubresourceFilterComponent(cus);
diff --git a/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc b/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc index e7b0af9..52a9e666 100644 --- a/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc +++ b/chrome/browser/devtools/devtools_embedder_message_dispatcher.cc
@@ -65,7 +65,7 @@ template <typename H, typename... As> void Apply(const H& handler, As... args) { - handler.Run(args...); + handler.Run(std::forward<As>(args)...); } }; @@ -78,16 +78,16 @@ template <typename H, typename... As> void Apply(const H& handler, As... args) { - tail.template Apply<H, As..., T>(handler, args..., head); + tail.template Apply<H, As..., T>(handler, std::forward<As>(args)..., head); } typename StorageTraits<T>::StorageType head; ParamTuple<Ts...> tail; }; -template<typename... As> -bool ParseAndHandle(const base::Callback<void(As...)>& handler, - const DispatchCallback& callback, +template <typename... As> +bool ParseAndHandle(const base::RepeatingCallback<void(As...)>& handler, + DispatchCallback callback, const base::ListValue& list) { ParamTuple<As...> tuple; if (!tuple.Parse(list, list.begin())) @@ -96,15 +96,15 @@ return true; } -template<typename... As> +template <typename... As> bool ParseAndHandleWithCallback( - const base::Callback<void(const DispatchCallback&, As...)>& handler, - const DispatchCallback& callback, + const base::RepeatingCallback<void(DispatchCallback, As...)>& handler, + DispatchCallback callback, const base::ListValue& list) { ParamTuple<As...> tuple; if (!tuple.Parse(list, list.begin())) return false; - tuple.Apply(handler, callback); + tuple.Apply(handler, std::move(callback)); return true; } @@ -120,38 +120,38 @@ */ class DispatcherImpl : public DevToolsEmbedderMessageDispatcher { public: - ~DispatcherImpl() override {} + ~DispatcherImpl() override = default; - bool Dispatch(const DispatchCallback& callback, + bool Dispatch(DispatchCallback callback, const std::string& method, const base::ListValue* params) override { auto it = handlers_.find(method); - return it != handlers_.end() && it->second.Run(callback, *params); + return it != handlers_.end() && + it->second.Run(std::move(callback), *params); } template<typename... As> void RegisterHandler(const std::string& method, void (Delegate::*handler)(As...), Delegate* delegate) { - handlers_[method] = base::Bind(&ParseAndHandle<As...>, - base::Bind(handler, - base::Unretained(delegate))); + handlers_[method] = base::BindRepeating( + &ParseAndHandle<As...>, + base::BindRepeating(handler, base::Unretained(delegate))); } - template<typename... As> - void RegisterHandlerWithCallback( - const std::string& method, - void (Delegate::*handler)(const DispatchCallback&, As...), - Delegate* delegate) { - handlers_[method] = base::Bind(&ParseAndHandleWithCallback<As...>, - base::Bind(handler, - base::Unretained(delegate))); + template <typename... As> + void RegisterHandlerWithCallback(const std::string& method, + void (Delegate::*handler)(DispatchCallback, + As...), + Delegate* delegate) { + handlers_[method] = base::BindRepeating( + &ParseAndHandleWithCallback<As...>, + base::BindRepeating(handler, base::Unretained(delegate))); } - private: - using Handler = base::Callback<bool(const DispatchCallback&, - const base::ListValue&)>; + using Handler = + base::RepeatingCallback<bool(DispatchCallback, const base::ListValue&)>; using HandlerMap = std::map<std::string, Handler>; HandlerMap handlers_; };
diff --git a/chrome/browser/devtools/devtools_embedder_message_dispatcher.h b/chrome/browser/devtools/devtools_embedder_message_dispatcher.h index d874468..9b36edc 100644 --- a/chrome/browser/devtools/devtools_embedder_message_dispatcher.h +++ b/chrome/browser/devtools/devtools_embedder_message_dispatcher.h
@@ -29,9 +29,9 @@ public: class Delegate { public: - using DispatchCallback = base::Callback<void(const base::Value*)>; + using DispatchCallback = base::OnceCallback<void(const base::Value*)>; - virtual ~Delegate() {} + virtual ~Delegate() = default; virtual void ActivateWindow() = 0; virtual void CloseWindow() = 0; @@ -39,8 +39,7 @@ virtual void SetInspectedPageBounds(const gfx::Rect& rect) = 0; virtual void InspectElementCompleted() = 0; virtual void InspectedURLChanged(const std::string& url) = 0; - virtual void SetIsDocked(const DispatchCallback& callback, - bool is_docked) = 0; + virtual void SetIsDocked(DispatchCallback callback, bool is_docked) = 0; virtual void OpenInNewTab(const std::string& url) = 0; virtual void ShowItemInFolder(const std::string& file_system_path) = 0; virtual void SaveToFile(const std::string& url, @@ -57,7 +56,7 @@ const std::string& file_system_path, const std::string& excluded_folders) = 0; virtual void StopIndexing(int index_request_id) = 0; - virtual void LoadNetworkResource(const DispatchCallback& callback, + virtual void LoadNetworkResource(DispatchCallback callback, const std::string& url, const std::string& headers, int stream_id) = 0; @@ -82,7 +81,7 @@ virtual void OpenRemotePage(const std::string& browser_id, const std::string& url) = 0; virtual void OpenNodeFrontend() = 0; - virtual void GetPreferences(const DispatchCallback& callback) = 0; + virtual void GetPreferences(DispatchCallback callback) = 0; virtual void SetPreference(const std::string& name, const std::string& value) = 0; virtual void RemovePreference(const std::string& name) = 0; @@ -95,25 +94,25 @@ virtual void RecordPerformanceHistogram(const std::string& name, double duration) = 0; virtual void RecordUserMetricsAction(const std::string& name) = 0; - virtual void SendJsonRequest(const DispatchCallback& callback, + virtual void SendJsonRequest(DispatchCallback callback, const std::string& browser_id, const std::string& url) = 0; - virtual void Reattach(const DispatchCallback& callback) = 0; + virtual void Reattach(DispatchCallback callback) = 0; virtual void ReadyForTest() = 0; virtual void ConnectionReady() = 0; virtual void SetOpenNewWindowForPopups(bool value) = 0; virtual void RegisterExtensionsAPI(const std::string& origin, const std::string& script) = 0; - virtual void ShowSurvey(const DispatchCallback& callback, + virtual void ShowSurvey(DispatchCallback callback, const std::string& trigger) = 0; - virtual void CanShowSurvey(const DispatchCallback& callback, + virtual void CanShowSurvey(DispatchCallback callback, const std::string& trigger) = 0; }; using DispatchCallback = Delegate::DispatchCallback; - virtual ~DevToolsEmbedderMessageDispatcher() {} - virtual bool Dispatch(const DispatchCallback& callback, + virtual ~DevToolsEmbedderMessageDispatcher() = default; + virtual bool Dispatch(DispatchCallback callback, const std::string& method, const base::ListValue* params) = 0;
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index 745b7cc..dbb6472c 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -456,12 +456,12 @@ const network::ResourceRequest& resource_request, const net::NetworkTrafficAnnotationTag& traffic_annotation, URLLoaderFactoryHolder url_loader_factory, - const DevToolsUIBindings::DispatchCallback& callback, + DevToolsUIBindings::DispatchCallback callback, base::TimeDelta retry_delay = base::TimeDelta()) { auto resource_loader = std::make_unique<DevToolsUIBindings::NetworkResourceLoader>( stream_id, bindings, resource_request, traffic_annotation, - std::move(url_loader_factory), callback, retry_delay); + std::move(url_loader_factory), std::move(callback), retry_delay); bindings->loaders_.insert(std::move(resource_loader)); } @@ -471,7 +471,7 @@ const network::ResourceRequest& resource_request, const net::NetworkTrafficAnnotationTag& traffic_annotation, URLLoaderFactoryHolder url_loader_factory, - const DispatchCallback& callback, + DispatchCallback callback, base::TimeDelta delay) : stream_id_(stream_id), bindings_(bindings), @@ -481,7 +481,7 @@ std::make_unique<network::ResourceRequest>(resource_request), traffic_annotation)), url_loader_factory_(std::move(url_loader_factory)), - callback_(callback), + callback_(std::move(callback)), retry_delay_(delay) { loader_->SetOnResponseStartedCallback(base::BindOnce( &NetworkResourceLoader::OnResponseStarted, base::Unretained(this))); @@ -538,11 +538,11 @@ << delay << "." << std::endl; NetworkResourceLoader::Create( stream_id_, bindings_, resource_request_, traffic_annotation_, - std::move(url_loader_factory_), callback_, delay); + std::move(url_loader_factory_), std::move(callback_), delay); } else { auto response = BuildObjectForResponse(response_headers_.get(), success, loader_->NetError()); - callback_.Run(response.get()); + std::move(callback_).Run(response.get()); } bindings_->loaders_.erase(bindings_->loaders_.find(this)); } @@ -823,10 +823,10 @@ delegate_->SetInspectedPageBounds(rect); } -void DevToolsUIBindings::SetIsDocked(const DispatchCallback& callback, +void DevToolsUIBindings::SetIsDocked(DispatchCallback callback, bool dock_requested) { delegate_->SetIsDocked(dock_requested); - callback.Run(nullptr); + std::move(callback).Run(nullptr); } void DevToolsUIBindings::InspectElementCompleted() { @@ -851,7 +851,7 @@ base::StringPrintf(kTitleFormat, simplified_url.c_str()))); } -void DevToolsUIBindings::LoadNetworkResource(const DispatchCallback& callback, +void DevToolsUIBindings::LoadNetworkResource(DispatchCallback callback, const std::string& url, const std::string& headers, int stream_id) { @@ -860,7 +860,7 @@ base::DictionaryValue response; response.SetInteger("statusCode", 404); response.SetBoolean("urlValid", false); - callback.Run(&response); + std::move(callback).Run(&response); return; } // Create traffic annotation tag. @@ -941,7 +941,7 @@ base::DictionaryValue response; response.SetBoolean("schemeSupported", false); response.SetInteger("statusCode", 403); - callback.Run(&response); + std::move(callback).Run(&response); return; } } else { @@ -950,9 +950,9 @@ url_loader_factory = partition->GetURLLoaderFactoryForBrowserProcess(); } - NetworkResourceLoader::Create(stream_id, this, resource_request, - traffic_annotation, - std::move(url_loader_factory), callback); + NetworkResourceLoader::Create( + stream_id, this, resource_request, traffic_annotation, + std::move(url_loader_factory), std::move(callback)); } void DevToolsUIBindings::OpenInNewTab(const std::string& url) { @@ -1230,10 +1230,10 @@ delegate_->OpenNodeFrontend(); } -void DevToolsUIBindings::GetPreferences(const DispatchCallback& callback) { +void DevToolsUIBindings::GetPreferences(DispatchCallback callback) { const DictionaryValue* prefs = profile_->GetPrefs()->GetDictionary(prefs::kDevToolsPreferences); - callback.Run(prefs); + std::move(callback).Run(prefs); } void DevToolsUIBindings::SetPreference(const std::string& name, @@ -1255,12 +1255,12 @@ update.Get()->Clear(); } -void DevToolsUIBindings::Reattach(const DispatchCallback& callback) { +void DevToolsUIBindings::Reattach(DispatchCallback callback) { if (agent_host_.get()) { agent_host_->DetachClient(this); InnerAttach(); } - callback.Run(nullptr); + std::move(callback).Run(nullptr); } void DevToolsUIBindings::ReadyForTest() { @@ -1342,28 +1342,28 @@ base::RecordComputedAction(name); } -void DevToolsUIBindings::SendJsonRequest(const DispatchCallback& callback, +void DevToolsUIBindings::SendJsonRequest(DispatchCallback callback, const std::string& browser_id, const std::string& url) { if (!android_bridge_) { - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } - android_bridge_->SendJsonRequest(browser_id, url, - base::Bind(&DevToolsUIBindings::JsonReceived, - weak_factory_.GetWeakPtr(), - callback)); + android_bridge_->SendJsonRequest( + browser_id, url, + base::BindOnce(&DevToolsUIBindings::JsonReceived, + weak_factory_.GetWeakPtr(), std::move(callback))); } -void DevToolsUIBindings::JsonReceived(const DispatchCallback& callback, +void DevToolsUIBindings::JsonReceived(DispatchCallback callback, int result, const std::string& message) { if (result != net::OK) { - callback.Run(nullptr); + std::move(callback).Run(nullptr); return; } base::Value message_value(message); - callback.Run(&message_value); + std::move(callback).Run(&message_value); } void DevToolsUIBindings::DeviceCountChanged(int count) { @@ -1533,32 +1533,34 @@ namespace { -void ShowSurveyCallback(const DevToolsUIBindings::DispatchCallback& callback, +void ShowSurveyCallback(DevToolsUIBindings::DispatchCallback callback, bool survey_shown) { base::DictionaryValue response; response.SetBoolean("surveyShown", survey_shown); - callback.Run(&response); + std::move(callback).Run(&response); } } // namespace -void DevToolsUIBindings::ShowSurvey(const DispatchCallback& callback, +void DevToolsUIBindings::ShowSurvey(DispatchCallback callback, const std::string& trigger) { HatsService* hats_service = HatsServiceFactory::GetForProfile(profile_->GetOriginalProfile(), true); + base::RepeatingCallback<void(const base::Value*)> on_survey = + base::AdaptCallbackForRepeating(std::move(callback)); hats_service->LaunchSurvey( - trigger, base::BindOnce(ShowSurveyCallback, callback, true), - base::BindOnce(ShowSurveyCallback, callback, false)); + trigger, base::BindOnce(ShowSurveyCallback, on_survey, true), + base::BindOnce(ShowSurveyCallback, on_survey, false)); } -void DevToolsUIBindings::CanShowSurvey(const DispatchCallback& callback, +void DevToolsUIBindings::CanShowSurvey(DispatchCallback callback, const std::string& trigger) { HatsService* hats_service = HatsServiceFactory::GetForProfile(profile_->GetOriginalProfile(), true); bool can_show = hats_service->CanShowSurvey(trigger); base::DictionaryValue response; response.SetBoolean("canShowSurvey", can_show); - callback.Run(&response); + std::move(callback).Run(&response); } void DevToolsUIBindings::SetDelegate(Delegate* delegate) {
diff --git a/chrome/browser/devtools/devtools_ui_bindings.h b/chrome/browser/devtools/devtools_ui_bindings.h index 4e88b807..ddd17d16 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.h +++ b/chrome/browser/devtools/devtools_ui_bindings.h
@@ -107,11 +107,11 @@ void SetInspectedPageBounds(const gfx::Rect& rect) override; void InspectElementCompleted() override; void InspectedURLChanged(const std::string& url) override; - void LoadNetworkResource(const DispatchCallback& callback, + void LoadNetworkResource(DispatchCallback callback, const std::string& url, const std::string& headers, int stream_id) override; - void SetIsDocked(const DispatchCallback& callback, bool is_docked) override; + void SetIsDocked(DispatchCallback callback, bool is_docked) override; void OpenInNewTab(const std::string& url) override; void ShowItemInFolder(const std::string& file_system_path) override; void SaveToFile(const std::string& url, @@ -157,23 +157,23 @@ void RecordPerformanceHistogram(const std::string& name, double duration) override; void RecordUserMetricsAction(const std::string& name) override; - void SendJsonRequest(const DispatchCallback& callback, + void SendJsonRequest(DispatchCallback callback, const std::string& browser_id, const std::string& url) override; - void GetPreferences(const DispatchCallback& callback) override; + void GetPreferences(DispatchCallback callback) override; void SetPreference(const std::string& name, const std::string& value) override; void RemovePreference(const std::string& name) override; void ClearPreferences() override; - void Reattach(const DispatchCallback& callback) override; + void Reattach(DispatchCallback callback) override; void ReadyForTest() override; void ConnectionReady() override; void SetOpenNewWindowForPopups(bool value) override; void RegisterExtensionsAPI(const std::string& origin, const std::string& script) override; - void ShowSurvey(const DispatchCallback& callback, + void ShowSurvey(DispatchCallback callback, const std::string& trigger) override; - void CanShowSurvey(const DispatchCallback& callback, + void CanShowSurvey(DispatchCallback callback, const std::string& trigger) override; void EnableRemoteDeviceCounter(bool enable); @@ -194,7 +194,7 @@ void DidNavigateMainFrame(); void FrontendLoaded(); - void JsonReceived(const DispatchCallback& callback, + void JsonReceived(DispatchCallback callback, int result, const std::string& message); void DevicesDiscoveryConfigUpdated();
diff --git a/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc b/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc index fe22c062..ae1b741 100644 --- a/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc +++ b/chrome/browser/enterprise/reporting/extension_request/extension_request_notification_unittest.cc
@@ -81,7 +81,6 @@ #else request_notification.Show(base::BindOnce(&OnNotificationClosed, false)); #endif - task_environment()->RunUntilIdle(); EXPECT_FALSE(GetNotification().has_value()); }
diff --git a/chrome/browser/error_reporting/BUILD.gn b/chrome/browser/error_reporting/BUILD.gn index 15cff0c9..2faabc2 100644 --- a/chrome/browser/error_reporting/BUILD.gn +++ b/chrome/browser/error_reporting/BUILD.gn
@@ -39,6 +39,7 @@ "//base/test:test_support", "//build:chromeos_buildflags", "//chrome/common:constants", + "//components/crash/content/browser/error_reporting", "//components/crash/content/browser/error_reporting:mock_crash_endpoint", ] }
diff --git a/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.cc b/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.cc index 69ecc89c..5437218c 100644 --- a/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.cc +++ b/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.cc
@@ -6,12 +6,22 @@ #include "base/check.h" #include "base/logging.h" +#include "components/crash/content/browser/error_reporting/javascript_error_report.h" #include "components/crash/content/browser/error_reporting/mock_crash_endpoint.h" MockChromeJsErrorReportProcessor::MockChromeJsErrorReportProcessor() = default; MockChromeJsErrorReportProcessor::~MockChromeJsErrorReportProcessor() = default; +void MockChromeJsErrorReportProcessor::SendErrorReport( + JavaScriptErrorReport error_report, + base::OnceClosure completion_callback, + content::BrowserContext* browser_context) { + ++send_count_; + ChromeJsErrorReportProcessor::SendErrorReport( + std::move(error_report), std::move(completion_callback), browser_context); +} + void MockChromeJsErrorReportProcessor::SetAsDefault() { LOG(INFO) << "MockChromeJsErrorReportProcessor installed as error processor"; JsErrorReportProcessor::SetDefault(this);
diff --git a/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h b/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h index ca84262..015ca699 100644 --- a/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h +++ b/chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h
@@ -21,6 +21,13 @@ public: MockChromeJsErrorReportProcessor(); + // JsErrorReportProcessor: + void SendErrorReport(JavaScriptErrorReport error_report, + base::OnceClosure completion_callback, + content::BrowserContext* browser_context) override; + + int send_count() const { return send_count_; } + // Controls what is returned from GetCrashEndpoint() override. void SetCrashEndpoint(std::string crash_endpoint); // Controls what is returned from GetCrashEndpointStaging() override. @@ -61,6 +68,8 @@ private: ~MockChromeJsErrorReportProcessor() override; + // Number of times SendErrorReport has been called. + int send_count_ = 0; std::string crash_endpoint_; std::string crash_endpoint_staging_; #if !BUILDFLAG(IS_CHROMEOS_ASH) && !BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/error_reporting/webui_js_error_reporting_browsertest.cc b/chrome/browser/error_reporting/webui_js_error_reporting_browsertest.cc index c0ae65075..ac14030 100644 --- a/chrome/browser/error_reporting/webui_js_error_reporting_browsertest.cc +++ b/chrome/browser/error_reporting/webui_js_error_reporting_browsertest.cc
@@ -4,6 +4,7 @@ #include <memory> +#include "base/containers/contains.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/error_reporting/mock_chrome_js_error_report_processor.h" @@ -26,6 +27,8 @@ #include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_response.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/page_transition_types.h" @@ -41,6 +44,83 @@ // escapes. constexpr char kPageLoadMessage[] = "WebUI%20JS%20Error%3A%20printing%20error%20on%20page%20load"; + +// A simple webpage that generates a JavaScript error on load. +constexpr char kJavaScriptErrorPage[] = R"( +<html> + <head> + <meta charset="utf-8"> + <title>Bad Page</title> + </head> + <body> + Text + <script> + console.error('special error message for WebUIJSErrorReportingTest'); + </script> + </body> +</html> +)"; + +// The error message printed by kJavaScriptErrorPage +constexpr char kWebpageErrorMessage[] = + "special error message for WebUIJSErrorReportingTest"; + +// Callback for the error_page_test_server_. Tells the server to always return +// the contents of kJavaScriptErrorPage. +std::unique_ptr<net::test_server::HttpResponse> ReturnErrorPage( + const net::test_server::HttpRequest&) { + auto http_response = std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_OK); + http_response->set_content(kJavaScriptErrorPage); + http_response->set_content_type("text/html"); + return http_response; +} + +// A class that waits for a log message like +// [4193947:4193947:0108/114152.942981:INFO:CONSOLE(10)] "special error message +// for WebUIJSErrorReportingTest", source: http://127.0.0.1:36521/index.html +// (10) +// to appear and then calls a callback (usually a RunLoop quit closure) +class ScopedLogMessageWatcher { + public: + explicit ScopedLogMessageWatcher(base::RepeatingClosure callback) + : callback_(std::move(callback)) { + previous_handler_ = logging::GetLogMessageHandler(); + // base::LogMessageHandlerFunction must be a pure function, not a functor, + // so we need a global to find this object again. + CHECK(current_handler_ == nullptr); + current_handler_ = this; + logging::SetLogMessageHandler(&ScopedLogMessageWatcher::MessageHandler); + } + ScopedLogMessageWatcher(const ScopedLogMessageWatcher&) = delete; + ScopedLogMessageWatcher& operator=(const ScopedLogMessageWatcher&) = delete; + ~ScopedLogMessageWatcher() { + CHECK(current_handler_ == this); + current_handler_ = nullptr; + logging::SetLogMessageHandler(previous_handler_); + } + + private: + static bool MessageHandler(int severity, + const char* file, + int line, + size_t message_start, + const std::string& str) { + CHECK(current_handler_ != nullptr); + if (base::Contains(str, kWebpageErrorMessage)) { + current_handler_->callback_.Run(); + } + if (current_handler_->previous_handler_ != nullptr) { + return (*current_handler_->previous_handler_)(severity, file, line, + message_start, str); + } + return false; + } + static ScopedLogMessageWatcher* current_handler_; + base::RepeatingClosure callback_; + logging::LogMessageHandlerFunction previous_handler_; +}; +ScopedLogMessageWatcher* ScopedLogMessageWatcher::current_handler_ = nullptr; } // namespace class WebUIJSErrorReportingTest : public InProcessBrowserTest { @@ -49,6 +129,14 @@ CHECK(error_url_.is_valid()); } + void SetUpOnMainThread() override { + error_page_test_server_.RegisterRequestHandler( + base::BindRepeating(&ReturnErrorPage)); + EXPECT_TRUE(error_page_test_server_.Start()); + + InProcessBrowserTest::SetUpOnMainThread(); + } + void SetUpInProcessBrowserTestFixture() override { scoped_feature_list_.InitAndEnableFeatureWithParameters( features::kSendWebUIJavaScriptErrorReports, @@ -58,6 +146,10 @@ } protected: + // NoErrorsAfterNavigation needs a second embedded test server to serve up + // its error page, since embedded_test_server() is in use by the + // MockCrashEndpoint. + net::test_server::EmbeddedTestServer error_page_test_server_; base::test::ScopedFeatureList scoped_feature_list_; const GURL error_url_; }; @@ -171,3 +263,41 @@ EXPECT_EQ(endpoint.report_count(), 2); EXPECT_THAT(report.query, HasSubstr(kPageLoadMessage)); } + +// Show that navigating from a WebUI page to a http page that produces +// JavaScript errors on load does not create an error report. +IN_PROC_BROWSER_TEST_F(WebUIJSErrorReportingTest, NoErrorsAfterNavigation) { + MockCrashEndpoint endpoint(embedded_test_server()); + ScopedMockChromeJsErrorReportProcessor mock_processor(endpoint); + + NavigateParams navigate(browser(), error_url_, ui::PAGE_TRANSITION_TYPED); + ui_test_utils::NavigateToURL(&navigate); + + // Wait for page load error report. + MockCrashEndpoint::Report report = endpoint.WaitForReport(); + EXPECT_EQ(endpoint.report_count(), 1); + EXPECT_EQ(mock_processor.processor().send_count(), 1); + + { + base::RunLoop run_loop; + ScopedLogMessageWatcher log_watcher(run_loop.QuitClosure()); + + NavigateParams navigate_to_http( + browser(), error_page_test_server_.GetURL("/index.html"), + ui::PAGE_TRANSITION_TYPED); + ui_test_utils::NavigateToURL(&navigate_to_http); + + run_loop.Run(); // Run until the error message is seen on the console. + } + + // Now run more to make sure the error reporter system doesn't have an + // in-flight error report. + { + base::RunLoop run_loop2; + run_loop2.RunUntilIdle(); + } + + // Count should not change. + EXPECT_EQ(endpoint.report_count(), 1); + EXPECT_EQ(mock_processor.processor().send_count(), 1); +}
diff --git a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc index c437624..7f7767a 100644 --- a/chrome/browser/extensions/chrome_component_extension_resource_manager.cc +++ b/chrome/browser/extensions/chrome_component_extension_resource_manager.cc
@@ -21,8 +21,13 @@ #include "content/public/browser/browser_thread.h" #include "extensions/common/constants.h" #include "pdf/buildflags.h" +#include "ppapi/buildflags/buildflags.h" #include "ui/base/resource/resource_bundle.h" +#if BUILDFLAG(ENABLE_PLUGINS) +#include "chrome/grit/pdf_resources_map.h" +#endif + #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/keyboard/ui/resources/keyboard_resource_util.h" #include "base/command_line.h" @@ -111,6 +116,11 @@ kComponentExtensionResourcesSize); AddComponentResourceEntries(kExtraComponentExtensionResources, base::size(kExtraComponentExtensionResources)); + +#if BUILDFLAG(ENABLE_PLUGINS) + AddComponentResourceEntries(kPdfResources, kPdfResourcesSize); +#endif + #if BUILDFLAG(IS_CHROMEOS_ASH) // Add Files app JS modules resources. AddComponentResourceEntries(kFileManagerResources, kFileManagerResourcesSize); @@ -153,28 +163,13 @@ void ChromeComponentExtensionResourceManager::Data::AddComponentResourceEntries( const GritResourceMap* entries, size_t size) { - base::FilePath gen_folder_path = base::FilePath().AppendASCII( - "@out_folder@/gen/chrome/browser/resources/"); - gen_folder_path = gen_folder_path.NormalizePathSeparators(); - for (size_t i = 0; i < size; ++i) { base::FilePath resource_path = base::FilePath().AppendASCII(entries[i].name); resource_path = resource_path.NormalizePathSeparators(); - if (!gen_folder_path.IsParent(resource_path)) { - DCHECK(!base::Contains(path_to_resource_id_, resource_path)); - path_to_resource_id_[resource_path] = entries[i].value; - } else { - // If the resource is a generated file, strip the generated folder's path, - // so that it can be served from a normal URL (as if it were not - // generated). - base::FilePath effective_path = - base::FilePath().AppendASCII(resource_path.AsUTF8Unsafe().substr( - gen_folder_path.value().length())); - DCHECK(!base::Contains(path_to_resource_id_, effective_path)); - path_to_resource_id_[effective_path] = entries[i].value; - } + DCHECK(!base::Contains(path_to_resource_id_, resource_path)); + path_to_resource_id_[resource_path] = entries[i].value; } }
diff --git a/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc b/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc index 62f973f..8d169a5 100644 --- a/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc +++ b/chrome/browser/extensions/chrome_component_extension_resource_manager_unittest.cc
@@ -80,38 +80,4 @@ #endif } -TEST_F(ChromeComponentExtensionResourceManagerTest, - IsComponentExtensionResource_Generated) { - // Check that the file being used for testing is indeed a generated resource. - int generated_resource_id = IDR_PDF_SHARED_VARS_JS; - bool found_resource = false; - for (size_t i = 0; i < kComponentExtensionResourcesSize; ++i) { - if (kComponentExtensionResources[i].value == generated_resource_id) { - ASSERT_TRUE(base::StartsWith(kComponentExtensionResources[i].name, - "@out_folder@", - base::CompareCase::SENSITIVE)); - found_resource = true; - break; - } - } - ASSERT_TRUE(found_resource); - - const ComponentExtensionResourceManager* resource_manager = - ExtensionsBrowserClient::Get()->GetComponentExtensionResourceManager(); - ASSERT_TRUE(resource_manager); - - base::FilePath resources_dir; - base::PathService::Get(chrome::DIR_RESOURCES, &resources_dir); - - base::FilePath extension_path = resources_dir.AppendASCII("pdf"); - base::FilePath resource_path = - base::FilePath().AppendASCII("elements/shared-vars.js"); - - // Check that the resource is classified as a component resource. - int resource_id = 0; - ASSERT_TRUE(resource_manager->IsComponentExtensionResource( - extension_path, resource_path, &resource_id)); - ASSERT_EQ(generated_resource_id, resource_id); -} - } // namespace extensions
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc b/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc index 373a41f5..75ff7dd 100644 --- a/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc +++ b/chrome/browser/extensions/forced_extensions/force_installed_metrics_unittest.cc
@@ -26,7 +26,6 @@ #include "extensions/browser/pref_names.h" #include "extensions/browser/updater/safe_manifest_parser.h" #include "extensions/common/extension.h" -#include "extensions/common/extension_builder.h" #include "extensions/common/manifest.h" #include "extensions/common/value_builder.h" #include "net/base/net_errors.h" @@ -122,6 +121,7 @@ namespace extensions { +using ExtensionStatus = ForceInstalledTracker::ExtensionStatus; using testing::_; using testing::Return; @@ -200,13 +200,13 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsInstalled) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); histogram_tester_.ExpectTotalCount(kLoadTimeStats, 0); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); histogram_tester_.ExpectTotalCount(kLoadTimeStats, 0); - force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::LOADED); histogram_tester_.ExpectTotalCount(kLoadTimeStats, 1); histogram_tester_.ExpectTotalCount(kReadyTimeStats, 0); @@ -227,8 +227,8 @@ TEST_F(ForceInstalledMetricsTest, ExtensionSettingsOverrideForcedList) { SetupForceList(true /*is_from_store */); SetupExtensionManagementPref(); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::LOADED); // ForceInstalledMetrics shuts down timer because all extension are either // loaded or failed. EXPECT_FALSE(fake_timer_->IsRunning()); @@ -239,8 +239,9 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsInstallationTimedOut) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - registry()->AddEnabled(ext1.get()); + scoped_refptr<const Extension> ext = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); + registry()->AddEnabled(ext.get()); EXPECT_TRUE(fake_timer_->IsRunning()); fake_timer_->Fire(); // Metrics are reported due to timeout. @@ -267,8 +268,8 @@ task_environment_.FastForwardBy(manifest_download_time); install_stage_tracker()->ReportDownloadingStage( kExtensionId1, ExtensionDownloaderDelegate::Stage::MANIFEST_LOADED); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::MANIFEST_INVALID); // ForceInstalledMetrics shuts down timer because all extension are either @@ -286,8 +287,8 @@ ReportDownloadingManifestStage(); const base::TimeDelta install_time = base::TimeDelta::FromMilliseconds(200); ReportInstallationStarted(install_time); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::MANIFEST_INVALID); // ForceInstalledMetrics shuts down timer because all extension are either @@ -308,8 +309,8 @@ kExtensionId1, ExtensionDownloaderDelegate::Stage::FINISHED); install_stage_tracker()->ReportInstallationStage( kExtensionId1, InstallStageTracker::Stage::INSTALLING); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::MANIFEST_INVALID); // ForceInstalledMetrics shuts down timer because all extension are either @@ -351,8 +352,8 @@ install_stage_tracker()->ReportCRXInstallationStage( kExtensionId1, InstallationStage::kComplete); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::MANIFEST_INVALID); // ForceInstalledMetrics shuts down timer because all extension are either @@ -380,11 +381,13 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsInstalledButNotLoadedUniqueDisableReason) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); registry()->AddDisabled(ext1.get()); ExtensionPrefs::Get(profile())->AddDisableReason( kExtensionId1, disable_reason::DisableReason::DISABLE_NOT_VERIFIED); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics should still keep running as kExtensionId1 is @@ -400,13 +403,15 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsInstalledButNotLoadedMultipleDisableReason) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); registry()->AddDisabled(ext1.get()); ExtensionPrefs::Get(profile())->AddDisableReasons( kExtensionId1, disable_reason::DisableReason::DISABLE_NOT_VERIFIED | disable_reason::DisableReason::DISABLE_UNSUPPORTED_REQUIREMENT); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics should still keep running as kExtensionId1 is @@ -424,9 +429,11 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsInstalledButNotLoadedNoDisableReason) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); registry()->AddEnabled(ext1.get()); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics should still keep running as kExtensionId1 is @@ -439,9 +446,11 @@ TEST_F(ForceInstalledMetricsTest, ExtensionForceInstalledAndBlocklisted) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); registry()->AddBlocklisted(ext1.get()); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics should still keep running as kExtensionId1 is @@ -475,9 +484,8 @@ EXPECT_TRUE(fake_timer_->IsRunning()); SetupForceList(true /*is_from_store */); - auto ext = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext.get()); - force_installed_tracker()->OnExtensionReady(profile(), ext.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::READY); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::INVALID_ID); // ForceInstalledMetrics shuts down timer because kExtensionId1 was loaded and @@ -551,7 +559,8 @@ kExtensionId1, CrxInstallError(SandboxedUnpackerFailureReason::CRX_HEADER_INVALID, base::string16())); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics shuts down timer because all extension are either @@ -576,7 +585,8 @@ kExtensionId1, CrxInstallError(SandboxedUnpackerFailureReason::CRX_HEADER_INVALID, base::string16())); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics shuts down timer because all extension are either @@ -602,7 +612,8 @@ kExtensionId1, CrxInstallError(SandboxedUnpackerFailureReason::CRX_HEADER_INVALID, base::string16())); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); registry()->AddEnabled(ext2.get()); force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); // ForceInstalledMetrics shuts down timer because all extension are either @@ -649,12 +660,12 @@ TEST_F(ForceInstalledMetricsTest, ExtensionLoadedThenFailedWithAlreadyInstalledError) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId1, InstallStageTracker::FailureReason::ALREADY_INSTALLED); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::LOADED); // ForceInstalledMetrics shuts down timer because all extension are either // loaded or failed. EXPECT_FALSE(fake_timer_->IsRunning()); @@ -668,14 +679,12 @@ // after READY state is not reflected in the statistics. TEST_F(ForceInstalledMetricsTest, ExtensionsReady) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); - force_installed_tracker()->OnExtensionReady(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::READY); install_stage_tracker()->ReportFailure( kExtensionId1, InstallStageTracker::FailureReason::ALREADY_INSTALLED); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); - force_installed_tracker()->OnExtensionReady(profile(), ext2.get()); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::READY); // ForceInstalledMetrics shuts down timer because all extension are either // loaded or failed. EXPECT_FALSE(fake_timer_->IsRunning()); @@ -690,9 +699,8 @@ // extensions are failed. TEST_F(ForceInstalledMetricsTest, AllExtensionsNotReady) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); - force_installed_tracker()->OnExtensionReady(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::READY); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::INVALID_ID); // ForceInstalledMetrics shuts down timer because all extension are either @@ -708,9 +716,8 @@ TEST_F(ForceInstalledMetricsTest, ExtensionsPreviousInstallationStageReportedAgain) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportInstallationStage( kExtensionId2, InstallStageTracker::Stage::CREATED); install_stage_tracker()->ReportInstallationStage( @@ -729,9 +736,8 @@ // reported again after INSTALLING stage. TEST_F(ForceInstalledMetricsTest, ExtensionsDownloadingStageReportedAgain) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportInstallationStage( kExtensionId2, InstallStageTracker::Stage::DOWNLOADING); install_stage_tracker()->ReportInstallationStage( @@ -775,9 +781,8 @@ TEST_F(ForceInstalledMetricsTest, ExtensionStuckInCreatedStage) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportInstallationStage( kExtensionId2, InstallStageTracker::Stage::CREATED); install_stage_tracker()->ReportInstallCreationStage( @@ -937,9 +942,8 @@ // Errors occurred because the fetched update manifest was invalid. TEST_F(ForceInstalledMetricsTest, ExtensionManifestInvalid) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportManifestInvalidFailure( kExtensionId2, ExtensionDownloaderDelegate::FailureData( @@ -957,9 +961,8 @@ // "error-unknownApplication" is considered as a misconfiguration. TEST_F(ForceInstalledMetricsTest, ExtensionManifestInvalidAppStatusError) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportManifestInvalidFailure( kExtensionId2, ExtensionDownloaderDelegate::FailureData( @@ -986,9 +989,8 @@ TEST_F(ForceInstalledMetricsTest, NonMisconfigurationFailureNotPresentKioskModeOnlyError) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportCrxInstallError( kExtensionId2, InstallStageTracker::FailureReason::CRX_INSTALL_ERROR_DECLINED, @@ -1013,9 +1015,8 @@ ListBuilder().Append("extension").Append("theme").Build(); prefs()->SetManagedPref(pref_names::kAllowedTypes, std::move(list)); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); // Hosted app is not a valid extension type, so this should report an error. install_stage_tracker()->ReportExtensionType(kExtensionId2, Manifest::Type::TYPE_HOSTED_APP); @@ -1044,9 +1045,8 @@ ListBuilder().Append("extension").Append("theme").Build(); prefs()->SetManagedPref(pref_names::kAllowedTypes, std::move(list)); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportExtensionType(kExtensionId2, Manifest::Type::TYPE_EXTENSION); install_stage_tracker()->ReportCrxInstallError( @@ -1091,9 +1091,8 @@ prefs()->SetManagedPref(arc::prefs::kArcEnabled, std::make_unique<base::Value>(true)); SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::REPLACED_BY_ARC_APP); // ForceInstalledMetrics shuts down timer because all extension are either @@ -1112,9 +1111,8 @@ prefs()->SetManagedPref(arc::prefs::kArcEnabled, std::make_unique<base::Value>(false)); SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::REPLACED_BY_ARC_APP); // ForceInstalledMetrics shuts down timer because all extension are either @@ -1131,9 +1129,8 @@ TEST_F(ForceInstalledMetricsTest, NonMisconfigurationFailureNotPresentNotPerformingNewInstallError) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::NOT_PERFORMING_NEW_INSTALL); @@ -1150,9 +1147,8 @@ TEST_F(ForceInstalledMetricsTest, NonMisconfigurationFailureNotPresentCrxFetchUrlEmptyError) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportInfoOnNoUpdatesFailure(kExtensionId2, ""); install_stage_tracker()->ReportFailure( kExtensionId2, InstallStageTracker::FailureReason::CRX_FETCH_URL_EMPTY); @@ -1168,9 +1164,8 @@ TEST_F(ForceInstalledMetricsTest, NonMisconfigurationFailurePresentCrxFetchUrlEmptyError) { SetupForceList(true /*is_from_store */); - auto extension = - ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), extension.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); install_stage_tracker()->ReportInfoOnNoUpdatesFailure(kExtensionId2, "rate limit"); install_stage_tracker()->ReportFailure( @@ -1201,7 +1196,8 @@ kExtensionId1, ExtensionDownloaderDelegate::CacheStatus::CACHE_HIT); install_stage_tracker()->ReportDownloadingCacheStatus( kExtensionId2, ExtensionDownloaderDelegate::CacheStatus::CACHE_MISS); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); registry()->AddEnabled(ext1.get()); EXPECT_TRUE(fake_timer_->IsRunning()); fake_timer_->Fire();
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_test_base.cc b/chrome/browser/extensions/forced_extensions/force_installed_test_base.cc index 25abd55b..2b5d322 100644 --- a/chrome/browser/extensions/forced_extensions/force_installed_test_base.cc +++ b/chrome/browser/extensions/forced_extensions/force_installed_test_base.cc
@@ -8,7 +8,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/extensions/external_provider_impl.h" -#include "chrome/browser/extensions/forced_extensions/force_installed_tracker.h" #include "chrome/browser/extensions/forced_extensions/install_stage_tracker.h" #include "chrome/test/base/testing_browser_process.h" #include "components/policy/core/common/policy_service_impl.h" @@ -16,7 +15,6 @@ #include "components/sync_preferences/testing_pref_service_syncable.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/pref_names.h" -#include "extensions/common/extension.h" #include "extensions/common/extension_builder.h" #include "testing/gmock/include/gmock/gmock.h" @@ -107,4 +105,23 @@ base::RunLoop().RunUntilIdle(); } +scoped_refptr<const Extension> ForceInstalledTestBase::CreateNewExtension( + const std::string& extension_name, + const std::string& extension_id, + const ForceInstalledTracker::ExtensionStatus& status) { + auto ext = ExtensionBuilder(extension_name).SetID(extension_id).Build(); + switch (status) { + case ForceInstalledTracker::ExtensionStatus::PENDING: + case ForceInstalledTracker::ExtensionStatus::FAILED: + break; + case ForceInstalledTracker::ExtensionStatus::LOADED: + force_installed_tracker()->OnExtensionLoaded(profile(), ext.get()); + break; + case ForceInstalledTracker::ExtensionStatus::READY: + force_installed_tracker()->OnExtensionLoaded(profile(), ext.get()); + force_installed_tracker()->OnExtensionReady(profile(), ext.get()); + } + return ext; +} + } // namespace extensions
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_test_base.h b/chrome/browser/extensions/forced_extensions/force_installed_test_base.h index 61247c95..eac74ad 100644 --- a/chrome/browser/extensions/forced_extensions/force_installed_test_base.h +++ b/chrome/browser/extensions/forced_extensions/force_installed_test_base.h
@@ -5,10 +5,12 @@ #ifndef CHROME_BROWSER_EXTENSIONS_FORCED_EXTENSIONS_FORCE_INSTALLED_TEST_BASE_H_ #define CHROME_BROWSER_EXTENSIONS_FORCED_EXTENSIONS_FORCE_INSTALLED_TEST_BASE_H_ +#include "chrome/browser/extensions/forced_extensions/force_installed_tracker.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "content/public/test/browser_task_environment.h" +#include "extensions/common/extension.h" #include "testing/gtest/include/gtest/gtest.h" namespace sync_preferences { @@ -19,7 +21,6 @@ class ExtensionRegistry; class InstallStageTracker; -class ForceInstalledTracker; // This class is extended by tests to provide a setup for tracking installation // of force extensions. It also provides helper functions for creating and @@ -44,6 +45,14 @@ // kInstallForceList preference. void SetupEmptyForceList(); + // Creates a new extension with |extension_id| and |extension_name| and fakes + // its status by calling one of ForceInstalledTracker's + // ExtensionRegistryObserver override. + scoped_refptr<const Extension> CreateNewExtension( + const std::string& extension_name, + const std::string& extension_id, + const ForceInstalledTracker::ExtensionStatus& status); + Profile* profile() const { return profile_; } sync_preferences::TestingPrefServiceSyncable* prefs() const { return prefs_; }
diff --git a/chrome/browser/extensions/forced_extensions/force_installed_tracker_unittest.cc b/chrome/browser/extensions/forced_extensions/force_installed_tracker_unittest.cc index 14b3f1fdc..f6a67cf5 100644 --- a/chrome/browser/extensions/forced_extensions/force_installed_tracker_unittest.cc +++ b/chrome/browser/extensions/forced_extensions/force_installed_tracker_unittest.cc
@@ -8,11 +8,12 @@ #include "base/values.h" #include "chrome/browser/extensions/forced_extensions/force_installed_test_base.h" #include "extensions/common/extension.h" -#include "extensions/common/extension_builder.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { +using ExtensionStatus = ForceInstalledTracker::ExtensionStatus; + class ForceInstalledTrackerTest : public ForceInstalledTestBase, public ForceInstalledTracker::Observer { public: @@ -56,8 +57,10 @@ // become ready for use. TEST_F(ForceInstalledTrackerTest, AllExtensionsInstalled) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::PENDING); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::PENDING); EXPECT_FALSE(loaded_called_); EXPECT_FALSE(ready_called_); EXPECT_FALSE(force_installed_tracker()->IsDoneLoading()); @@ -81,8 +84,8 @@ // all extensions have either successfully loaded or failed. TEST_F(ForceInstalledTrackerTest, ExtensionPendingInstall) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); EXPECT_FALSE(loaded_called_); EXPECT_FALSE(ready_called_); EXPECT_FALSE(force_installed_tracker()->IsDoneLoading()); @@ -100,10 +103,10 @@ // Start with a non-empty force-list, and install them, which triggers // observer. SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - auto ext2 = ExtensionBuilder(kExtensionName2).SetID(kExtensionId2).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); - force_installed_tracker()->OnExtensionLoaded(profile(), ext2.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); + scoped_refptr<const Extension> ext2 = CreateNewExtension( + kExtensionName2, kExtensionId2, ExtensionStatus::LOADED); EXPECT_TRUE(loaded_called_); force_installed_tracker()->OnExtensionReady(profile(), ext1.get()); @@ -119,8 +122,8 @@ // either successfully loaded or failed. TEST_F(ForceInstalledTrackerTest, ExtensionsInstallationFailed) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); force_installed_tracker()->OnExtensionInstallationFailed( kExtensionId2, InstallStageTracker::FailureReason::INVALID_ID); EXPECT_TRUE(loaded_called_); @@ -134,22 +137,22 @@ TEST_F(ForceInstalledTrackerTest, ExtensionsStatus) { SetupForceList(true /*is_from_store */); EXPECT_EQ(force_installed_tracker()->extensions().at(kExtensionId1).status, - ForceInstalledTracker::ExtensionStatus::PENDING); + ExtensionStatus::PENDING); EXPECT_EQ(force_installed_tracker()->extensions().at(kExtensionId2).status, - ForceInstalledTracker::ExtensionStatus::PENDING); + ExtensionStatus::PENDING); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::LOADED); force_installed_tracker()->OnExtensionInstallationFailed( kExtensionId2, InstallStageTracker::FailureReason::INVALID_ID); EXPECT_EQ(force_installed_tracker()->extensions().at(kExtensionId1).status, - ForceInstalledTracker::ExtensionStatus::LOADED); + ExtensionStatus::LOADED); EXPECT_EQ(force_installed_tracker()->extensions().at(kExtensionId2).status, - ForceInstalledTracker::ExtensionStatus::FAILED); + ExtensionStatus::FAILED); force_installed_tracker()->OnExtensionReady(profile(), ext1.get()); EXPECT_EQ(force_installed_tracker()->extensions().at(kExtensionId1).status, - ForceInstalledTracker::ExtensionStatus::READY); + ExtensionStatus::READY); } // This test verifies that resetting the policy before all force installed @@ -165,9 +168,8 @@ // installed extension is either ready for use or failed. TEST_F(ForceInstalledTrackerTest, AllExtensionsReady) { SetupForceList(true /*is_from_store */); - auto ext1 = ExtensionBuilder(kExtensionName1).SetID(kExtensionId1).Build(); - force_installed_tracker()->OnExtensionLoaded(profile(), ext1.get()); - force_installed_tracker()->OnExtensionReady(profile(), ext1.get()); + scoped_refptr<const Extension> ext1 = CreateNewExtension( + kExtensionName1, kExtensionId1, ExtensionStatus::READY); force_installed_tracker()->OnExtensionInstallationFailed( kExtensionId2, InstallStageTracker::FailureReason::INVALID_ID); EXPECT_TRUE(loaded_called_);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 84cee16..ab694912 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -92,7 +92,7 @@ { "name": "allow-sync-xhr-in-page-dismissal", "owners": [ "kdillon@chromium.org" ], - "expiry_milestone": 88 + "expiry_milestone": 93 }, { "name": "android-default-browser-promo", @@ -2152,6 +2152,11 @@ "expiry_milestone": 85 }, { + "name": "enable-resampling-scroll-events-experimental-prediction", + "owners": [ "input-dev" ], + "expiry_milestone": 90 + }, + { "name": "enable-resource-loading-hints", "owners": [ "//components/data_reduction_proxy/OWNERS" ], // This flag is used for frequent manual testing and should not be removed. @@ -3977,12 +3982,12 @@ { "name": "printer-status", "owners": [ "gavinwill", "cros-peripherals@google.com" ], - "expiry_milestone": 88 + "expiry_milestone": 91 }, { "name": "printer-status-dialog", "owners": [ "gavinwill", "cros-peripherals@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 91 }, { "name": "privacy-advisor",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 86fdd59..bc67fc02 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -89,11 +89,6 @@ const char kEditPasswordsInSettingsDescription[] = "Enables password editing in settings."; -const char kEnableBloomName[] = "Enable Bloom Integration"; -const char kEnableBloomDescription[] = - "Enables native support for bloom, an experimental vertical knowledge " - "search feature."; - const char kEnableBluetoothSerialPortProfileInSerialApiName[] = "Enable Bluetooth Serial Port Profile in Serial API"; const char kEnableBluetoothSerialPortProfileInSerialApiDescription[] = @@ -988,6 +983,11 @@ "Enable resampling scroll events"; const char kEnableResamplingScrollEventsDescription[] = "Predicts the scroll amount at vsync time based on previous input"; +const char kEnableResamplingScrollEventsExperimentalPredictionName[] = + "Enable experimental prediction for scroll events"; +const char kEnableResamplingScrollEventsExperimentalPredictionDescription[] = + "Predicts the scroll amount after the vsync time to more closely match " + "when the frame is visible."; const char kEnableTabSearchFlagId[] = "enable-tab-search"; const char kEnableTabSearchName[] = "Enable Tab Search";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 0e09cfe..a887fc5 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -88,9 +88,6 @@ extern const char kEditPasswordsInSettingsName[]; extern const char kEditPasswordsInSettingsDescription[]; -extern const char kEnableBloomName[]; -extern const char kEnableBloomDescription[]; - extern const char kEnableBluetoothSerialPortProfileInSerialApiName[]; extern const char kEnableBluetoothSerialPortProfileInSerialApiDescription[]; @@ -579,6 +576,9 @@ extern const char kEnableResamplingInputEventsDescription[]; extern const char kEnableResamplingScrollEventsName[]; extern const char kEnableResamplingScrollEventsDescription[]; +extern const char kEnableResamplingScrollEventsExperimentalPredictionName[]; +extern const char + kEnableResamplingScrollEventsExperimentalPredictionDescription[]; extern const char kEnableSubresourceRedirectName[]; extern const char kEnableSubresourceRedirectDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 2aee130..a072dac 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -182,6 +182,7 @@ &kEphemeralTabUsingBottomSheet, &kExploreSites, &kFocusOmniboxInIncognitoTabIntents, + &kGPayAppDynamicUpdate, &kHandleMediaIntents, &kHomepagePromoCard, &kHorizontalTabSwitcherAndroid, @@ -508,6 +509,9 @@ const base::Feature kExploreSites{"ExploreSites", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kGPayAppDynamicUpdate{"GPayAppDynamicUpdate", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kHandleMediaIntents{"HandleMediaIntents", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index ba566d48..740781d9 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -79,6 +79,7 @@ extern const base::Feature kEphemeralTabUsingBottomSheet; extern const base::Feature kExploreSites; extern const base::Feature kFocusOmniboxInIncognitoTabIntents; +extern const base::Feature kGPayAppDynamicUpdate; extern const base::Feature kHandleMediaIntents; extern const base::Feature kHomepagePromoCard; extern const base::Feature kHorizontalTabSwitcherAndroid;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 11a15702..42fbe65 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -316,6 +316,7 @@ public static final String FILLING_PASSWORDS_FROM_ANY_ORIGIN = "FillingPasswordsFromAnyOrigin"; public static final String FOCUS_OMNIBOX_IN_INCOGNITO_TAB_INTENTS = "FocusOmniboxInIncognitoTabIntents"; + public static final String GPAY_APP_DYNAMIC_UPDATE = "GPayAppDynamicUpdate"; public static final String GRANT_NOTIFICATIONS_TO_DSE = "GrantNotificationsToDSE"; public static final String HANDLE_MEDIA_INTENTS = "HandleMediaIntents"; public static final String HIDE_FROM_API_3_TRANSITIONS_FROM_HISTORY =
diff --git a/chrome/browser/history/domain_diversity_reporter_factory.cc b/chrome/browser/history/domain_diversity_reporter_factory.cc index 56f4280..1f47d0cbb 100644 --- a/chrome/browser/history/domain_diversity_reporter_factory.cc +++ b/chrome/browser/history/domain_diversity_reporter_factory.cc
@@ -39,6 +39,10 @@ HistoryServiceFactory::GetForProfile(profile, ServiceAccessType::EXPLICIT_ACCESS); + // Only build DomainDiversityReporter service with a valid |history_service|. + if (!history_service) + return nullptr; + return std::make_unique<DomainDiversityReporter>( history_service, profile->GetPrefs(), base::DefaultClock::GetInstance()); }
diff --git a/chrome/browser/lacros/account_manager_facade_lacros.cc b/chrome/browser/lacros/account_manager_facade_lacros.cc index ad77517..dbaa6f30 100644 --- a/chrome/browser/lacros/account_manager_facade_lacros.cc +++ b/chrome/browser/lacros/account_manager_facade_lacros.cc
@@ -38,6 +38,18 @@ return is_initialized_; } +void AccountManagerFacadeLacros::ShowAddAccountDialog( + const AccountAdditionSource& source, + base::OnceCallback<void(const AccountAdditionResult& result)> callback) { + // TODO(crbug.com/1140469): implement this. +} + +void AccountManagerFacadeLacros::ShowReauthAccountDialog( + const AccountAdditionSource& source, + const std::string& email) { + // TODO(crbug.com/1140469): implement this. +} + void AccountManagerFacadeLacros::OnVersionCheck(uint32_t version) { if (version < kMinVersionWithObserver) { std::move(init_finished_).Run();
diff --git a/chrome/browser/lacros/account_manager_facade_lacros.h b/chrome/browser/lacros/account_manager_facade_lacros.h index 485efd7..6103c2f 100644 --- a/chrome/browser/lacros/account_manager_facade_lacros.h +++ b/chrome/browser/lacros/account_manager_facade_lacros.h
@@ -29,6 +29,12 @@ // AccountManagerFacade overrides: bool IsInitialized() override; + void ShowAddAccountDialog( + const AccountAdditionSource& source, + base::OnceCallback<void(const AccountAdditionResult& result)> callback) + override; + void ShowReauthAccountDialog(const AccountAdditionSource& source, + const std::string& email) override; // crosapi::mojom::AccountManagerObserver overrides: void OnTokenUpserted(crosapi::mojom::AccountPtr account) override;
diff --git a/chrome/browser/lookalikes/lookalike_url_service.cc b/chrome/browser/lookalikes/lookalike_url_service.cc index 76236ed..72c67a66 100644 --- a/chrome/browser/lookalikes/lookalike_url_service.cc +++ b/chrome/browser/lookalikes/lookalike_url_service.cc
@@ -23,6 +23,7 @@ #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/lookalikes/core/lookalike_url_util.h" +#include "components/site_engagement/content/site_engagement_score.h" #include "components/url_formatter/spoof_checks/top_domains/top_domain_util.h" #include "components/url_formatter/url_formatter.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" @@ -120,16 +121,14 @@ void LookalikeUrlService::OnFetchEngagedSites( EngagedSitesCallback callback, std::vector<site_engagement::mojom::SiteEngagementDetails> details) { - site_engagement::SiteEngagementService* service = - site_engagement::SiteEngagementService::Get(profile_); engaged_sites_.clear(); for (const site_engagement::mojom::SiteEngagementDetails& detail : details) { if (!detail.origin.SchemeIsHTTPOrHTTPS()) { continue; } // Ignore sites with an engagement score below threshold. - if (!service->IsEngagementAtLeast(detail.origin, - blink::mojom::EngagementLevel::MEDIUM)) { + if (detail.total_score < + site_engagement::SiteEngagementScore::GetMediumEngagementBoundary()) { continue; } const DomainInfo domain_info = GetDomainInfo(detail.origin);
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc index bcc1e59..b775afac 100644 --- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc +++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -559,13 +559,48 @@ ); #if defined(OS_WIN) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - // Records whether or not BackupRefPtr and/or PCScan is enabled. + // Records whether or not PartitionAlloc-Everywhere is enabled, and whether + // PCScan is enabled on top of it. This is meant for a 3-way experiment with 2 + // binaries: + // - binary A: deployed to 33% users, with PA-E and PCScan off. + // - binary B: deployed to 66% users, with PA-E on, half of which having + // PCScan on + // + // NOTE, deliberately don't use ALLOW_PCSCAN which depends on bitness. In the + // 32-bit case, PCScan is always disabled, but we'll deliberately misrepresent + // it as enabled here (and later ignored when analyzing results), in order to + // keep each population at 33%. + ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial( + "PartitionAllocEverywhereAndPCScan", +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + base::FeatureList::IsEnabled( + base::features::kPartitionAllocPCScanBrowserOnly) + ? "EnabledWithPCScan" + : "EnabledWithoutPCScan" +#else + "Disabled" +#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + ); +#endif // defined(OS_WIN) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + +#if defined(OS_WIN) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + // Records whether or not BackupRefPtr and/or PCScan is enabled. This is meant + // for a 3-way experiment with 2 binaries: + // - binary A: deployed to 66% users, with half of them having PCScan on and + // half off (BackupRefPtr fully off) + // - binary B: deployed to 33% users, with BackupRefPtr on (PCSCan fully off) + // + // NOTE, deliberately don't use ALLOW_PCSCAN which depends on bitness. In the + // 32-bit case, PCScan is always disabled, but we'll deliberately misrepresent + // it as enabled here (and later ignored when analyzing results), in order to + // keep each population at 33%. ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial( "BackupRefPtrAndPCScan", #if ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR "BackupRefPtrEnabled" #else - base::features::IsPartitionAllocPCScanBrowserOnlyEnabled() + base::FeatureList::IsEnabled( + base::features::kPartitionAllocPCScanBrowserOnly) ? "PCScanEnabled" : "Disabled" #endif
diff --git a/chrome/browser/metrics/tab_stats_tracker.cc b/chrome/browser/metrics/tab_stats_tracker.cc index 3dcdb667..c16e545 100644 --- a/chrome/browser/metrics/tab_stats_tracker.cc +++ b/chrome/browser/metrics/tab_stats_tracker.cc
@@ -182,6 +182,7 @@ TabStatsTracker::~TabStatsTracker() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); BrowserList::GetInstance()->RemoveObserver(this); + base::PowerMonitor::RemoveObserver(this); } // static
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc index d22a81fa..556a4da1 100644 --- a/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc +++ b/chrome/browser/nearby_sharing/nearby_sharing_service_factory.cc
@@ -79,13 +79,11 @@ if (!chromeos::ProfileHelper::IsPrimaryProfile(profile)) { NS_LOG(VERBOSE) << __func__ - << ": Nearby Sharing service is skipping non-primary profile: " - << profile->GetProfileUserName(); + << ": Nearby Sharing service is skipping non-primary profile"; return nullptr; } NS_LOG(VERBOSE) << __func__ - << "Nearby Sharing service is forcing active profile: " - << profile->GetProfileUserName(); + << "Nearby Sharing service is forcing primary profile"; // Force active profile for ChromeOS for now. process_manager.SetActiveProfile(profile); #endif @@ -97,8 +95,8 @@ auto nearby_connections_manager = std::make_unique<NearbyConnectionsManagerImpl>(&process_manager, profile); - NS_LOG(VERBOSE) << __func__ << ": creating NearbySharingService for profile: " - << profile->GetProfileUserName(); + NS_LOG(VERBOSE) << __func__ + << ": creating NearbySharingService for primary profile"; return new NearbySharingServiceImpl( pref_service, notification_display_service, profile,
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc index 0d6834b4..fabea20 100644 --- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc +++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
@@ -889,8 +889,7 @@ void NearbySharingServiceImpl::OnNearbyProfileChanged(Profile* profile) { // TODO(crbug.com/1084576): Notify UI about the new active profile. if (profile) { - NS_LOG(VERBOSE) << __func__ << ": Active Nearby profile changed to: " - << profile->GetProfileUserName(); + NS_LOG(VERBOSE) << __func__ << ": Active Nearby profile changed"; } else { NS_LOG(VERBOSE) << __func__ << ": Active Nearby profile cleared"; } @@ -900,8 +899,8 @@ void NearbySharingServiceImpl::OnNearbyProcessStarted() { DCHECK(profile_); if (process_manager_->IsActiveProfile(profile_)) { - NS_LOG(VERBOSE) << __func__ << ": Nearby process started for profile: " - << profile_->GetProfileUserName(); + NS_LOG(VERBOSE) << __func__ + << ": Nearby process started for active profile"; } } @@ -909,8 +908,8 @@ DCHECK(profile_); InvalidateSurfaceState(); if (process_manager_->IsActiveProfile(profile_)) { - NS_LOG(VERBOSE) << __func__ << ": Nearby process stopped for profile: " - << profile_->GetProfileUserName(); + NS_LOG(VERBOSE) << __func__ + << ": Nearby process stopped for active profile"; } } @@ -1414,8 +1413,7 @@ if (!process_manager_->IsActiveProfile(profile_)) { NS_LOG(VERBOSE) << __func__ - << ": Stopping discovery because profile was not active: " - << profile_->GetProfileUserName(); + << ": Stopping discovery because profile was not active"; StopScanning(); return; } @@ -1487,8 +1485,7 @@ StopFastInitiationAdvertising(); NS_LOG(VERBOSE) << __func__ - << ": Stopping fast init advertising because profile was not active: " - << profile_->GetProfileUserName(); + << ": Stopping fast init advertising because profile was not active"; return; } @@ -1557,8 +1554,7 @@ if (!process_manager_->IsActiveProfile(profile_)) { NS_LOG(VERBOSE) << __func__ - << ": Stopping advertising because profile was not active: " - << profile_->GetProfileUserName(); + << ": Stopping advertising because profile was not active"; StopAdvertising(); return; }
diff --git a/chrome/browser/net/trust_token_usecounter_browsertest.cc b/chrome/browser/net/trust_token_usecounter_browsertest.cc index 7761755..c17c637 100644 --- a/chrome/browser/net/trust_token_usecounter_browsertest.cc +++ b/chrome/browser/net/trust_token_usecounter_browsertest.cc
@@ -137,4 +137,34 @@ blink::mojom::WebFeature::kTrustTokenIframe, 1); } +IN_PROC_BROWSER_TEST_F(TrustTokenUseCountersBrowsertest, CountsIframeUseViaSetattribute) { + base::HistogramTester histograms; + + GURL start_url(server_.GetURL("/iframe.html")); + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), start_url)); + + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + // It's important to set the trust token arguments before updating src, as + // the latter triggers a load. It's also important to JsReplace the trustToken + // argument here, because iframe.trustToken expects a (properly escaped) + // JSON-encoded string as its value, not a JS object. + EXPECT_TRUE(ExecJs(web_contents, + JsReplace( + R"( const myFrame = document.getElementById("test"); + myFrame.setAttribute('trustToken', $1); + myFrame.src = $2;)", + R"({"type": "token-request"})", "/page404.html"))); + TestNavigationObserver load_observer(web_contents); + load_observer.Wait(); + + // Navigate away in order to flush use counters. + EXPECT_TRUE( + ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL))); + + histograms.ExpectBucketCount("Blink.UseCounter.Features", + blink::mojom::WebFeature::kTrustTokenIframe, 1); +} + } // namespace content
diff --git a/chrome/browser/paint_preview/paint_preview_browsertest.cc b/chrome/browser/paint_preview/paint_preview_browsertest.cc index c5ab507b..d4bc4ff 100644 --- a/chrome/browser/paint_preview/paint_preview_browsertest.cc +++ b/chrome/browser/paint_preview/paint_preview_browsertest.cc
@@ -24,17 +24,44 @@ #include "components/paint_preview/common/test_utils.h" #include "components/ukm/test_ukm_recorder.h" #include "content/public/browser/notification_types.h" +#include "content/public/browser/render_process_host.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/metrics/public/cpp/ukm_builders.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/core/SkStream.h" #include "url/gurl.h" namespace paint_preview { +class NoOpPaintPreviewRecorder : public mojom::PaintPreviewRecorder { + public: + NoOpPaintPreviewRecorder() = default; + ~NoOpPaintPreviewRecorder() override = default; + + NoOpPaintPreviewRecorder(const NoOpPaintPreviewRecorder&) = delete; + NoOpPaintPreviewRecorder& operator=(const NoOpPaintPreviewRecorder&) = delete; + + void CapturePaintPreview( + mojom::PaintPreviewCaptureParamsPtr params, + mojom::PaintPreviewRecorder::CapturePaintPreviewCallback callback) + override { + callback_ = std::move(callback); + } + + void BindRequest(mojo::ScopedInterfaceEndpointHandle handle) { + binding_.Bind(mojo::PendingAssociatedReceiver<mojom::PaintPreviewRecorder>( + std::move(handle))); + } + + private: + mojom::PaintPreviewRecorder::CapturePaintPreviewCallback callback_; + mojo::AssociatedReceiver<mojom::PaintPreviewRecorder> binding_{this}; +}; + // Test harness for a integration test of paint previews. In this test: // - Each RenderFrame has an instance of PaintPreviewRecorder attached. // - Each WebContents has an instance of PaintPreviewClient attached. @@ -42,6 +69,10 @@ class PaintPreviewBrowserTest : public InProcessBrowserTest, public testing::WithParamInterface<RecordingPersistence> { + public: + PaintPreviewBrowserTest(const PaintPreviewBrowserTest&) = delete; + PaintPreviewBrowserTest& operator=(const PaintPreviewBrowserTest&) = delete; + protected: PaintPreviewBrowserTest() = default; ~PaintPreviewBrowserTest() override = default; @@ -92,6 +123,15 @@ return params; } + void OverrideInterface(NoOpPaintPreviewRecorder* service) { + blink::AssociatedInterfaceProvider* remote_interfaces = + GetWebContents()->GetMainFrame()->GetRemoteAssociatedInterfaces(); + remote_interfaces->OverrideBinderForTesting( + mojom::PaintPreviewRecorder::Name_, + base::BindRepeating(&NoOpPaintPreviewRecorder::BindRequest, + base::Unretained(service))); + } + void WaitForLoadStopWithoutSuccessCheck() { // In many cases, the load may have finished before we get here. Only wait // if the tab still has a pending navigation. @@ -134,10 +174,6 @@ base::ScopedTempDir temp_dir_; net::EmbeddedTestServer http_server_; net::EmbeddedTestServer http_server_different_origin_; - - private: - PaintPreviewBrowserTest(const PaintPreviewBrowserTest&) = delete; - PaintPreviewBrowserTest& operator=(const PaintPreviewBrowserTest&) = delete; }; IN_PROC_BROWSER_TEST_P(PaintPreviewBrowserTest, CaptureFrame) { @@ -324,6 +360,79 @@ loop.Run(); } +// https://crbug.com/1146573 reproduction. If a renderer crashes, +// WebContentsObserver::RenderFrameDeleted. Paint preview implements this in an +// observer which in turn calls DecrementCapturerCount which can cause the +// WebContents to be reloaded on Android where we have auto-reload. This reload +// occurs *during* crash handling, leaving the frame in an invalid state and +// leading to a crash when it subsequently unloaded. +// This is fixed by deferring it to a PostTask. +// Flaky on Mac. TODO(https://crbug.com/1160608): Enabled this test. +#if defined(OS_MAC) +#define MAYBE_DontReloadInRenderProcessExit \ + DISABLED_DontReloadInRenderProcessExit +#else +#define MAYBE_DontReloadInRenderProcessExit DontReloadInRenderProcessExit +#endif +IN_PROC_BROWSER_TEST_P(PaintPreviewBrowserTest, + MAYBE_DontReloadInRenderProcessExit) { + LoadPage(http_server_.GetURL("a.com", "/title1.html")); + + content::WebContents* web_contents = GetWebContents(); + + // Override remote interfaces with a no-op. + NoOpPaintPreviewRecorder noop_recorder; + OverrideInterface(&noop_recorder); + + CreateClient(); + auto* client = PaintPreviewClient::FromWebContents(web_contents); + // Do this twice to simulate conditions for crash. + web_contents->IncrementCapturerCount(gfx::Size(), true); + web_contents->IncrementCapturerCount(gfx::Size(), true); + + // A callback that causes the frame to reload and end up in an invalid state + // if it is allowed to run during crash handling. + base::RunLoop loop; + auto params = MakeParams(); + bool did_run = false; + client->CapturePaintPreview( + params, web_contents->GetMainFrame(), + // This callback is now posted so it shouldn't cause a crash. + base::BindOnce( + [](content::WebContents* web_contents, bool* did_run_ptr, + base::UnguessableToken guid, mojom::PaintPreviewStatus status, + std::unique_ptr<CaptureResult> result) { + EXPECT_EQ(status, mojom::PaintPreviewStatus::kFailed); + EXPECT_EQ(result, nullptr); + // On Android crashed frames are marked as needing reload. + web_contents->GetController().SetNeedsReload(); + web_contents->DecrementCapturerCount(true); + web_contents->DecrementCapturerCount(true); + *did_run_ptr = true; + }, + web_contents, &did_run) + .Then(loop.QuitClosure())); + + // Crash the renderer. + { + base::ScopedAllowBlockingForTesting scope; + content::RenderProcessHost* process = + GetWebContents()->GetMainFrame()->GetProcess(); + content::RenderProcessHostWatcher crash_observer( + process, content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); + process->Shutdown(0); + crash_observer.Wait(); + } + + // The browser would have crashed before the loop exited if the callback was + // not posted. + if (!did_run) + loop.Run(); + + // Now navigate away and ensure that the frame unloads successfully. + LoadPage(http_server_.GetURL("a.com", "/title2.html")); +} + INSTANTIATE_TEST_SUITE_P(All, PaintPreviewBrowserTest, testing::Values(RecordingPersistence::kFileSystem,
diff --git a/chrome/browser/password_manager/android/password_accessory_controller_impl_unittest.cc b/chrome/browser/password_manager/android/password_accessory_controller_impl_unittest.cc index fbe65737..574391a8 100644 --- a/chrome/browser/password_manager/android/password_accessory_controller_impl_unittest.cc +++ b/chrome/browser/password_manager/android/password_accessory_controller_impl_unittest.cc
@@ -217,6 +217,7 @@ void TearDown() override { if (mock_password_store_) mock_password_store_->ShutdownOnUIThread(); + ChromeRenderViewHostTestHarness::TearDown(); } void CreateSheetController( @@ -869,9 +870,9 @@ } void TearDown() override { - PasswordAccessoryControllerTest::TearDown(); test_store_->ShutdownOnUIThread(); task_environment()->RunUntilIdle(); + PasswordAccessoryControllerTest::TearDown(); } void DisableFeature() { @@ -882,14 +883,13 @@ protected: PasswordStore* CreateInternalPasswordStore() override { + test_store_ = CreateAndUseTestPasswordStore(profile()); return test_store_.get(); } private: base::test::ScopedFeatureList scoped_feature_list_; - TestingProfile profile_; - scoped_refptr<TestPasswordStore> test_store_ = - CreateAndUseTestPasswordStore(&profile_); + scoped_refptr<TestPasswordStore> test_store_; }; TEST_F(PasswordAccessoryControllerWithTestStoreTest, AddsShowOtherPasswords) {
diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref.cc b/chrome/browser/password_manager/generated_password_leak_detection_pref.cc index a016c56f..1a78cd6e 100644 --- a/chrome/browser/password_manager/generated_password_leak_detection_pref.cc +++ b/chrome/browser/password_manager/generated_password_leak_detection_pref.cc
@@ -34,7 +34,11 @@ status_labels.message_type == sync_ui_util::SYNC_ERROR || status_labels.message_type == sync_ui_util::PASSWORDS_ONLY_SYNC_ERROR; - return identity_manager->HasPrimaryAccount() && !sync_error; + // Password leak detection only requires a signed in account and a functioning + // sync service, it does not require sync consent. + return identity_manager->HasPrimaryAccount( + signin::ConsentLevel::kNotRequired) && + !sync_error; } // Returns whether the effective value of the Safe Browsing preferences for @@ -141,14 +145,16 @@ identity_manager_observer_.RemoveAll(); } -void GeneratedPasswordLeakDetectionPref::OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) { - NotifyObservers(kGeneratedPasswordLeakDetectionPref); -} - -void GeneratedPasswordLeakDetectionPref::OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) { - NotifyObservers(kGeneratedPasswordLeakDetectionPref); +void GeneratedPasswordLeakDetectionPref::OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event_details) { + switch (event_details.GetEventTypeFor(signin::ConsentLevel::kSync)) { + case signin::PrimaryAccountChangeEvent::Type::kSet: + case signin::PrimaryAccountChangeEvent::Type::kCleared: + NotifyObservers(kGeneratedPasswordLeakDetectionPref); + break; + case signin::PrimaryAccountChangeEvent::Type::kNone: + break; + } } void GeneratedPasswordLeakDetectionPref::OnExtendedAccountInfoUpdated(
diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref.h b/chrome/browser/password_manager/generated_password_leak_detection_pref.h index f57e601..9cfe2b2 100644 --- a/chrome/browser/password_manager/generated_password_leak_detection_pref.h +++ b/chrome/browser/password_manager/generated_password_leak_detection_pref.h
@@ -39,10 +39,8 @@ void OnSourcePreferencesChanged(); // IdentityManager::Observer implementation. - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override; - void OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) override; + void OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event_details) override; void OnExtendedAccountInfoUpdated(const AccountInfo& info) override; void OnExtendedAccountInfoRemoved(const AccountInfo& info) override;
diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc b/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc index 1dd05989..79df1ce 100644 --- a/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc +++ b/chrome/browser/password_manager/generated_password_leak_detection_pref_unittest.cc
@@ -6,6 +6,8 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/extensions/api/settings_private/generated_pref_test_base.h" #include "chrome/browser/extensions/api/settings_private/generated_prefs_factory.h" +#include "chrome/browser/signin/chrome_signin_client_factory.h" +#include "chrome/browser/signin/chrome_signin_client_test_util.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/test/base/testing_profile.h" @@ -15,15 +17,30 @@ #include "components/sync/driver/test_sync_service.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/test/browser_task_environment.h" +#include "services/network/test/test_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace { +constexpr char kTestProfileName[] = "test@test.com"; + std::unique_ptr<KeyedService> BuildTestSyncService( content::BrowserContext* context) { return std::make_unique<syncer::TestSyncService>(); } +std::unique_ptr<TestingProfile> BuildTestProfile( + network::TestURLLoaderFactory& url_loader_factory) { + TestingProfile::Builder profile_builder; + profile_builder.SetProfileName(kTestProfileName); + profile_builder.AddTestingFactory( + ChromeSigninClientFactory::GetInstance(), + base::BindRepeating(&BuildChromeSigninClientWithURLLoader, + &url_loader_factory)); + return IdentityTestEnvironmentProfileAdaptor:: + CreateProfileForIdentityTestEnvironment(profile_builder); +} + } // namespace namespace settings_api = extensions::api::settings_private; @@ -31,8 +48,12 @@ class GeneratedPasswordLeakDetectionPrefTest : public testing::Test { public: + GeneratedPasswordLeakDetectionPrefTest() { + identity_test_env()->SetTestURLLoaderFactory(&test_url_loader_factory_); + } + signin::IdentityTestEnvironment* identity_test_env() { - return identity_test_env_adaptor_->identity_test_env(); + return identity_test_env_adaptor_.identity_test_env(); } sync_preferences::TestingPrefServiceSyncable* prefs() { @@ -46,18 +67,16 @@ content::BrowserTaskEnvironment task_environment_; private: + network::TestURLLoaderFactory test_url_loader_factory_; std::unique_ptr<TestingProfile> profile_ = - IdentityTestEnvironmentProfileAdaptor:: - CreateProfileForIdentityTestEnvironment({}); + BuildTestProfile(test_url_loader_factory_); syncer::TestSyncService* sync_service_ = static_cast<syncer::TestSyncService*>( ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( profile(), base::BindRepeating(&BuildTestSyncService))); - std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> - identity_test_env_adaptor_ = - std::make_unique<IdentityTestEnvironmentProfileAdaptor>( - profile_.get()); + IdentityTestEnvironmentProfileAdaptor identity_test_env_adaptor_{ + profile_.get()}; }; TEST_F(GeneratedPasswordLeakDetectionPrefTest, NotifyPrefUpdates) { @@ -68,7 +87,10 @@ // Check that the observer fires for identity updates. identity_test_env()->EnableRemovalOfExtendedAccountInfo(); - identity_test_env()->MakePrimaryAccountAvailable("test@test.com"); + + // Create a sync consented account so revoking the refresh token also triggers + // the preference updated observer. + identity_test_env()->MakePrimaryAccountAvailable(kTestProfileName); EXPECT_EQ(test_observer.GetUpdatedPrefName(), kGeneratedPasswordLeakDetectionPref); @@ -120,7 +142,7 @@ prefs()->SetDefaultPrefValue( password_manager::prefs::kPasswordLeakDetectionEnabled, base::Value(false)); - identity_test_env()->MakePrimaryAccountAvailable("test@test.com"); + identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kTestProfileName); // Check setting the generated pref updates the underlying preference. EXPECT_EQ(pref.SetPref(std::make_unique<base::Value>(true).get()), @@ -161,7 +183,7 @@ // Check when signed in and Safe Browsing set to standard, both user control // and the pref are enabled. - identity_test_env()->MakePrimaryAccountAvailable("test@test.com"); + identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kTestProfileName); prefs()->SetUserPref(prefs::kSafeBrowsingEnabled, std::make_unique<base::Value>(true)); prefs()->SetUserPref(prefs::kSafeBrowsingEnhanced, @@ -215,7 +237,7 @@ // Check that the preference cannot be changed when the backing preference is // managed, but the preference could otherwise be changed. - identity_test_env()->MakePrimaryAccountAvailable("test@test.com"); + identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(kTestProfileName); prefs()->SetUserPref(prefs::kSafeBrowsingEnabled, std::make_unique<base::Value>(true)); prefs()->SetUserPref(prefs::kSafeBrowsingEnhanced,
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc index b0abe2a..21d62c0 100644 --- a/chrome/browser/pdf/pdf_extension_test.cc +++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -918,7 +918,7 @@ IN_PROC_BROWSER_TEST_F(PDFExtensionJSUpdatesEnabledTest, ViewerPropertiesDialogTest) { - RunTestsInJsModule("viewer_properties_dialog_test.js", "test.pdf"); + RunTestsInJsModule("viewer_properties_dialog_test.js", "document_info.pdf"); } IN_PROC_BROWSER_TEST_F(PDFExtensionJSUpdatesEnabledTest, ViewerThumbnailBar) {
diff --git a/chrome/browser/policy/messaging_layer/public/report_client.cc b/chrome/browser/policy/messaging_layer/public/report_client.cc index 70d7589..9a955938 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client.cc +++ b/chrome/browser/policy/messaging_layer/public/report_client.cc
@@ -44,7 +44,7 @@ #include "content/public/browser/browser_thread.h" #include "services/network/public/cpp/shared_url_loader_factory.h" -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/login/users/chrome_user_manager.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" @@ -66,7 +66,7 @@ void GetCloudPolicyClient( base::OnceCallback<void(StatusOr<policy::CloudPolicyClient*>)> get_client_cb) { -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) policy::CloudPolicyManager* cloud_policy_manager = g_browser_process->platform_part() ->browser_policy_connector_chromeos()
diff --git a/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc b/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc index e68fca6..ff1a5af 100644 --- a/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc +++ b/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc
@@ -9,6 +9,7 @@ #include "base/task/post_task.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "build/build_config.h" #include "chrome/browser/policy/messaging_layer/public/report_queue.h" #include "chrome/browser/policy/messaging_layer/public/report_queue_configuration.h" #include "chrome/browser/policy/messaging_layer/util/status.h" @@ -22,7 +23,7 @@ #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/test/base/testing_profile.h" #include "components/user_manager/scoped_user_manager.h" @@ -73,7 +74,7 @@ class ReportClientTest : public testing::Test { public: void SetUp() override { -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) // Set up fake primary profile. auto mock_user_manager = std::make_unique<testing::NiceMock<chromeos::FakeChromeUserManager>>(); @@ -101,7 +102,7 @@ } void TearDown() override { -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) user_manager_.reset(); profile_.reset(); #endif // OS_CHROMEOS @@ -110,7 +111,7 @@ protected: content::BrowserTaskEnvironment task_envrionment_; std::unique_ptr<ReportingClient::TestEnvironment> test_reporting_; -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) std::unique_ptr<TestingProfile> profile_; std::unique_ptr<user_manager::ScopedUserManager> user_manager_; #endif // OS_CHROMEOS
diff --git a/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h b/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h index d9d0ffbf..b12f5c2 100644 --- a/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h +++ b/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service.h
@@ -11,6 +11,7 @@ #include "base/sequence_checker.h" #include "base/task/post_task.h" #include "base/task_runner.h" +#include "build/build_config.h" #include "chrome/browser/policy/messaging_layer/util/status.h" #include "chrome/browser/policy/messaging_layer/util/status_macros.h" #include "chrome/browser/policy/messaging_layer/util/statusor.h" @@ -20,7 +21,7 @@ #include "components/policy/proto/record_constants.pb.h" #include "net/base/backoff_entry.h" -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) #include "chrome/browser/profiles/profile.h" #endif // OS_CHROMEOS
diff --git a/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc b/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc index 11bae9c0..befb6e0 100644 --- a/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc +++ b/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc
@@ -11,6 +11,7 @@ #include "base/test/task_environment.h" #include "base/test/test_mock_time_task_runner.h" #include "base/values.h" +#include "build/build_config.h" #include "chrome/browser/policy/messaging_layer/upload/record_handler_impl.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/cloud/dm_token.h" @@ -22,7 +23,7 @@ #include "content/public/test/browser_task_environment.h" #include "services/network/test/test_network_connection_tracker.h" -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/test/base/testing_profile.h" #include "components/user_manager/scoped_user_manager.h" @@ -174,7 +175,7 @@ protected: void SetUp() override { -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) // Set up fake primary profile. auto mock_user_manager = std::make_unique<testing::NiceMock<chromeos::FakeChromeUserManager>>(); @@ -193,7 +194,7 @@ } void TearDown() override { -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) user_manager_.reset(); profile_.reset(); #endif // OS_CHROMEOS @@ -202,7 +203,7 @@ bool need_encryption_key() const { return GetParam(); } content::BrowserTaskEnvironment task_envrionment_; -#ifdef OS_CHROMEOS +#if defined(OS_CHROMEOS) std::unique_ptr<TestingProfile> profile_; std::unique_ptr<user_manager::ScopedUserManager> user_manager_; #endif // OS_CHROMEOS
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc index 4767426..e0ba027 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_browsertest.cc
@@ -1339,10 +1339,11 @@ {"DataLength", 0}, /* only checked for > 0 */ {"FetchDurationMS", 0}, /* only checked for > 0 */ {"NavigationStartToFetchStartMS", 0}, /* only checked for > 0 */ + {"ISPFilteringStatus", 0}, {"LinkClicked", 1}, {"LinkPosition", 1}, {"ResourceType", 1}, - {"Status", 14}, + {"Status", 0}, }}, // not eligible url #1 UkmEntry{srp_source_id,
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc index 63df222..7d02dca 100644 --- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc +++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_url_loader_interceptor.cc
@@ -182,6 +182,10 @@ std::move(on_success_callback))); return; } + // Inform the metrics collector that the main frame HTML was used and probing + // was disabled. + ReportProbeResult(frame_tree_node_id_, url_, + PrefetchProxyProbeResult::kNoProbing); EnsureCookiesCopiedAndInterceptPrefetchedNavigation( tentative_resource_request, std::move(prefetch));
diff --git a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc b/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc index d54b871..3cccbe0e 100644 --- a/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc +++ b/chrome/browser/prefetch/search_prefetch/streaming_search_prefetch_url_loader.cc
@@ -270,8 +270,8 @@ return; } - if (!forwarding_client_) { - DCHECK(streaming_prefetch_request_); + if (streaming_prefetch_request_) { + DCHECK(!forwarding_client_); if (status.error_code == net::OK) { streaming_prefetch_request_->MarkPrefetchAsComplete(); } else {
diff --git a/chrome/browser/profiles/profile_browsertest.cc b/chrome/browser/profiles/profile_browsertest.cc index 58e9e54..11c48ce 100644 --- a/chrome/browser/profiles/profile_browsertest.cc +++ b/chrome/browser/profiles/profile_browsertest.cc
@@ -48,6 +48,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/ui_test_utils.h" #include "components/prefs/pref_service.h" #include "components/version_info/version_info.h" @@ -947,17 +948,38 @@ #if !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH) // TODO(https://crbug.com/1125474): Expand to cover ChromeOS. -IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, ProfileLifetimeTestUnderOneMinute) { +class GuestProfileLifetimeBrowserTest + : public ProfileBrowserTest, + public testing::WithParamInterface<bool> { + public: + GuestProfileLifetimeBrowserTest() : is_ephemeral_(GetParam()) { + // Change the value if Ephemeral is not supported. + is_ephemeral_ &= + TestingProfile::SetScopedFeatureListForEphemeralGuestProfiles( + scoped_feature_list_, is_ephemeral_); + } + + bool is_ephemeral() const { return is_ephemeral_; } + + private: + bool is_ephemeral_; + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_P(GuestProfileLifetimeBrowserTest, UnderOneMinute) { base::HistogramTester tester; Browser* browser = CreateGuestBrowser(); BrowserCloseObserver close_observer(browser); BrowserList::CloseAllBrowsersWithProfile(browser->profile()); close_observer.Wait(); - tester.ExpectUniqueSample("Profile.Guest.OTR.Lifetime", 0, 1); + tester.ExpectUniqueSample("Profile.Guest.OTR.Lifetime", 0, + is_ephemeral() ? 0 : 1); + tester.ExpectUniqueSample("Profile.Guest.Ephemeral.Lifetime", 0, + is_ephemeral() ? 1 : 0); } -IN_PROC_BROWSER_TEST_F(ProfileBrowserTest, ProfileLifetimeTestOneHour) { +IN_PROC_BROWSER_TEST_P(GuestProfileLifetimeBrowserTest, OneHour) { base::HistogramTester tester; Browser* browser = CreateGuestBrowser(); BrowserCloseObserver close_observer(browser); @@ -966,9 +988,16 @@ base::Time::Now() - base::TimeDelta::FromSeconds(60) * 60); BrowserList::CloseAllBrowsersWithProfile(browser->profile()); close_observer.Wait(); - tester.ExpectUniqueSample("Profile.Guest.OTR.Lifetime", 60, 1); + tester.ExpectUniqueSample("Profile.Guest.OTR.Lifetime", 60, + is_ephemeral() ? 0 : 1); + tester.ExpectUniqueSample("Profile.Guest.Ephemeral.Lifetime", 60, + is_ephemeral() ? 1 : 0); } +INSTANTIATE_TEST_SUITE_P(AllGuestTypes, + GuestProfileLifetimeBrowserTest, + /*is_ephemeral=*/testing::Bool()); + class EphemeralGuestProfileBrowserTest : public ProfileBrowserTest { public: EphemeralGuestProfileBrowserTest() { @@ -990,30 +1019,6 @@ EXPECT_TRUE(guest_profile->IsEphemeralGuestProfile()); } -IN_PROC_BROWSER_TEST_F(EphemeralGuestProfileBrowserTest, - ProfileLifetimeTestUnderOneMinute) { - base::HistogramTester tester; - Browser* browser = CreateGuestBrowser(); - BrowserCloseObserver close_observer(browser); - - BrowserList::CloseAllBrowsersWithProfile(browser->profile()); - close_observer.Wait(); - tester.ExpectUniqueSample("Profile.Guest.Ephemeral.Lifetime", 0, 1); -} - -IN_PROC_BROWSER_TEST_F(EphemeralGuestProfileBrowserTest, - ProfileLifetimeTestOneHour) { - base::HistogramTester tester; - Browser* browser = CreateGuestBrowser(); - BrowserCloseObserver close_observer(browser); - - browser->profile()->SetCreationTimeForTesting( - base::Time::Now() - base::TimeDelta::FromSeconds(60) * 60); - BrowserList::CloseAllBrowsersWithProfile(browser->profile()); - close_observer.Wait(); - tester.ExpectUniqueSample("Profile.Guest.Ephemeral.Lifetime", 60, 1); -} - // Tests if ephemeral Guest profile paths are persistent as long as one does not // close all Guest browsers. IN_PROC_BROWSER_TEST_F(EphemeralGuestProfileBrowserTest,
diff --git a/chrome/browser/profiles/profile_keep_alive_types.h b/chrome/browser/profiles/profile_keep_alive_types.h index 23e6ce6..1979c14 100644 --- a/chrome/browser/profiles/profile_keep_alive_types.h +++ b/chrome/browser/profiles/profile_keep_alive_types.h
@@ -9,22 +9,29 @@ // Refers to what a ScopedProfileKeepAlive's lifetime is tied to, to help // debugging. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// +// Keep this in sync with ProfileKeepAliveOrigin in enums.xml. enum class ProfileKeepAliveOrigin { // When a Profile gets created by ProfileManager, it initially has this type // of keep-alive. This ensures that the Profile has a refcount >=1, at least // until RemoveKeepAlive() gets called. // // When a kBrowserWindow keep-alive gets added, this one gets removed. - kWaitingForFirstBrowserWindow, + kWaitingForFirstBrowserWindow = 0, // This Profile has browser windows open. - kBrowserWindow, + kBrowserWindow = 1, // This Profile is running extensions with persistent background scripts. - kBackgroundMode, + kBackgroundMode = 2, // A child off-the-record profile holds a strong reference to its parent. - kOffTheRecordProfile, + kOffTheRecordProfile = 3, + + kMaxValue = kOffTheRecordProfile, }; std::ostream& operator<<(std::ostream& out,
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 23380358..381c6b3 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -363,6 +363,11 @@ } #endif +bool IsEphemeral(Profile* profile) { + return profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) || + profile->IsEphemeralGuestProfile(); +} + } // namespace ProfileManager::ProfileManager(const base::FilePath& user_data_dir) @@ -378,6 +383,20 @@ ProfileManager::~ProfileManager() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + if (base::FeatureList::IsEnabled(features::kDestroyProfileOnBrowserClose)) { + // Ideally, all the keepalives should've been cleared already. Report + // metrics for incorrect usage of ScopedProfileKeepAlive. + for (const auto& path_and_profile_info : profiles_info_) { + const ProfileInfo* profile_info = path_and_profile_info.second.get(); + for (const auto& origin_and_count : profile_info->keep_alives) { + ProfileKeepAliveOrigin origin = origin_and_count.first; + int count = origin_and_count.second; + if (count > 0) { + UMA_HISTOGRAM_ENUMERATION("Profile.KeepAliveLeakAtShutdown", origin); + } + } + } + } } // static @@ -1278,8 +1297,10 @@ int& waiting_for_first_browser_window = info->keep_alives[ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow]; - if (waiting_for_first_browser_window != 0) + if (origin == ProfileKeepAliveOrigin::kBrowserWindow && + waiting_for_first_browser_window != 0) { waiting_for_first_browser_window = 0; + } } void ProfileManager::RemoveKeepAlive(const Profile* profile, @@ -1544,8 +1565,7 @@ DCHECK(base::Contains(profiles_info_, profile_dir)); Profile* profile = GetProfileByPath(profile_dir); - bool ephemeral = - profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles); + bool ephemeral = IsEphemeral(profile); // Remove from |profiles_info_|, eventually causing the Profile object's // destruction. @@ -1894,12 +1914,10 @@ storage.GetProfileAttributesWithPath(profile->GetPath(), &entry); DCHECK(has_entry); - if (profile->IsEphemeralGuestProfile()) { - profile->GetPrefs()->SetBoolean(prefs::kForceEphemeralProfiles, true); + if (profile->IsEphemeralGuestProfile()) entry->SetIsGuest(true); - } - if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) + if (IsEphemeral(profile)) entry->SetIsEphemeral(true); entry->SetSignedInWithCredentialProvider( @@ -1956,7 +1974,7 @@ // Some profiles might become ephemeral after they are created. // Don't persist the System Profile as one of the last actives, it should // never get a browser. - if (!(*it)->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) && + if (!IsEphemeral(*it) && profile_paths.find(profile_path) == profile_paths.end() && profile_path != base::FilePath(chrome::kSystemProfileDir).AsUTF8Unsafe()) { @@ -1971,10 +1989,8 @@ DCHECK(browser); Profile* profile = browser->profile(); DCHECK(profile); - bool is_ephemeral = - profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles); - if (!profile->IsOffTheRecord() && !is_ephemeral && !browser->is_type_app() && - ++browser_counts_[profile] == 1) { + if (!profile->IsOffTheRecord() && !IsEphemeral(profile) && + !browser->is_type_app() && ++browser_counts_[profile] == 1) { active_profiles_.push_back(profile); SaveActiveProfiles(); } @@ -2021,7 +2037,7 @@ base::FilePath path = profile->GetPath(); if (IsProfileDirectoryMarkedForDeletion(path)) { // Do nothing if the profile is already being deleted. - } else if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) { + } else if (IsEphemeral(profile)) { // Avoid scheduling deletion if it's a testing profile that is not // registered with profile manager. if (profile->AsTestingProfile() && @@ -2101,7 +2117,7 @@ // Don't remember ephemeral profiles as last because they are not going to // persist after restart. - if (last_active->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) + if (IsEphemeral(last_active)) return; profile_manager_->UpdateLastUser(last_active);
diff --git a/chrome/browser/profiles/profile_manager_browsertest.cc b/chrome/browser/profiles/profile_manager_browsertest.cc index 0f309041..ca5acac7 100644 --- a/chrome/browser/profiles/profile_manager_browsertest.cc +++ b/chrome/browser/profiles/profile_manager_browsertest.cc
@@ -17,6 +17,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/apps/platform_apps/shortcut_manager.h" #include "chrome/browser/password_manager/password_store_factory.h" +#include "chrome/browser/policy/policy_test_utils.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" @@ -25,6 +26,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_browser_process.h" @@ -33,6 +35,8 @@ #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/browser/password_store_consumer.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browsing_data_remover.h" #include "content/public/test/browser_test.h" @@ -748,3 +752,54 @@ ->GetFilePath(prefs::kSaveFileDefaultDirectory) .empty()); } + +#if !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH) +class EphemeralGuestProfilePolicyTest + : public policy::PolicyTest, + public ::testing::WithParamInterface<bool> { + public: + EphemeralGuestProfilePolicyTest() { + scoped_feature_list_.InitAndEnableFeature( + features::kEnableEphemeralGuestProfilesOnDesktop); + } + + protected: + void SetUp() override { + // Shortcut deletion delays tests shutdown on Win-7 and results in time out. + // See crbug.com/1073451. +#if defined(OS_WIN) + AppShortcutManager::SuppressShortcutsForTesting(); +#endif + InProcessBrowserTest::SetUp(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +// TODO(https://crbug.com/1125474): Remove this comment! +// If this test times out on Windows7 (or flaky on Windows 10), please disable +// it and assign the bug to rhalavati@. +IN_PROC_BROWSER_TEST_P(EphemeralGuestProfilePolicyTest, + TestsForceEphemeralProfilesPolicy) { + policy::PolicyMap policies; + SetPolicy(&policies, policy::key::kForceEphemeralProfiles, + base::Value(GetParam())); + UpdateProviderPolicy(policies); + + Profile* guest = CreateGuestBrowser()->profile(); + EXPECT_TRUE(guest->IsEphemeralGuestProfile()); + + ProfileManager* profile_manager = g_browser_process->profile_manager(); + ProfileAttributesEntry* entry; + EXPECT_TRUE(profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(guest->GetPath(), &entry)); + EXPECT_TRUE(entry->IsGuest()); + EXPECT_TRUE(entry->IsEphemeral()); +} + +INSTANTIATE_TEST_SUITE_P(AllGuestProfileTypes, + EphemeralGuestProfilePolicyTest, + /*policy_is_enforced=*/testing::Bool()); + +#endif // !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 54206f0..a7aa1de 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -68,6 +68,10 @@ ] } + if (enable_pdf) { + public_deps += [ "pdf:pdf_resources" ] + } + if (enable_print_preview) { public_deps += [ "print_preview:print_preview_resources" ] } @@ -78,6 +82,7 @@ deps = [ "accessibility:closure_compile", "components:closure_compile", + "domain_reliability_internals:closure_compile", "engagement:closure_compile", "interventions_internals:closure_compile", "media:closure_compile", @@ -178,10 +183,6 @@ grit("component_extension_resources") { source = "component_extension_resources.grd" - if (enable_pdf) { - deps = [ "//chrome/browser/resources/pdf:web_components" ] - } - defines = chrome_grit_defines if (enable_hangout_services_extension) { defines += [ "enable_hangout_services_extension" ]
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_webui_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_webui_test_base.js index 388f973..e7ea065 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_webui_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_webui_test_base.js
@@ -2,8 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -GEN_INCLUDE(['../../common/testing/assert_additions.js']); -GEN_INCLUDE(['common.js', '../../common/testing/callback_helper.js']); +// clang-format off +GEN_INCLUDE([ + '../../common/testing/assert_additions.js', + '../../common/testing/common.js', + '../../common/testing/callback_helper.js' +]); +// clang-format on /** * Base test fixture for ChromeVox webui tests. Run in a Blink renderer.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/common.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/common.js index eaa3c5b9..bcaa3524 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/common.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/common.js
@@ -99,18 +99,3 @@ }); } } - -/** - * Similar to |TEST_F|. Generates a test for the given |testFixture|, - * |testName|, and |testFunction|. - * Used this variant when an |isAsync| fixture wants to temporarily mix in an - * sync test. - * @param {string} testFixture Fixture name. - * @param {string} testName Test name. - * @param {function} testFunction The test impl. - */ -function SYNC_TEST_F(testFixture, testName, testFunction) { - TEST_F(testFixture, testName, function() { - this.newCallback(testFunction)(); - }); -}
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/common.js b/chrome/browser/resources/chromeos/accessibility/common/testing/common.js new file mode 100644 index 0000000..242025a --- /dev/null +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/common.js
@@ -0,0 +1,20 @@ +// Copyright 2021 The Chromium 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 File containing test framework helper functions. */ + +/** + * Similar to |TEST_F|. Generates a test for the given |testFixture|, + * |testName|, and |testFunction|. + * Used this variant when an |isAsync| fixture wants to temporarily mix in a + * sync test. + * @param {string} testFixture Fixture name. + * @param {string} testName Test name. + * @param {function} testFunction The test impl. + */ +function SYNC_TEST_F(testFixture, testName, testFunction) { + TEST_F(testFixture, testName, function() { + this.newCallback(testFunction)(); + }); +}
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js index f8c710f7..3f55300 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js
@@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -GEN_INCLUDE(['assert_additions.js', 'callback_helper.js', 'doc_utils.js']); +GEN_INCLUDE( + ['assert_additions.js', 'callback_helper.js', 'common.js', 'doc_utils.js']); /** * Base test fixture for end to end tests (tests that need a full extension @@ -167,18 +168,3 @@ * No UI in the background context. */ E2ETestBase.prototype.runAccessibilityChecks = false; - -/** - * Similar to |TEST_F|. Generates a test for the given |testFixture|, - * |testName|, and |testFunction|. - * Used this variant when an |isAsync| fixture wants to temporarily mix in an - * sync test. - * @param {string} testFixture Fixture name. - * @param {string} testName Test name. - * @param {function} testFunction The test impl. - */ -function SYNC_TEST_F(testFixture, testName, testFunction) { - TEST_F(testFixture, testName, function() { - this.newCallback(testFunction)(); - }); -}
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn index 5a312ef..9f2f436 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/BUILD.gn
@@ -77,6 +77,7 @@ js2gtest("select_to_speak_extjs_tests") { test_type = "extension" sources = [ + # These are end-to-end tests. "paragraph_utils_overflow_test.js", "select_to_speak_keystroke_selection_test.js", "select_to_speak_mouse_selection_test.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb index 3ba3d8fc..af65a0f 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
@@ -371,7 +371,7 @@ <translation id="3587482841069643663">All</translation> <translation id="3589661172894441357">Glossary</translation> <translation id="3591784666823501596">Royal Blue</translation> -<translation id="3594207934078151302">Medium Sea Green</translation> +<translation id="3594207934078151302">Medium sea green</translation> <translation id="3599054940393788245">Not inside math</translation> <translation id="360241989769010433">Acknowledgements</translation> <translation id="3616016838842055984">If you reach an item that you want to click, press Search + Space. Try it now to continue.</translation> @@ -561,7 +561,7 @@ <translation id="5045870649377683106">Now, find the left shift key, which is directly above the control key. To continue, press the left shift key.</translation> <translation id="5050015258024679800">Previous level 4 heading</translation> <translation id="5054047268577924192">Previous list item</translation> -<translation id="5085453135206054947">Pale Violet Red</translation> +<translation id="5085453135206054947">Pale violet red</translation> <translation id="5087864757604726239">back</translation> <translation id="5102981729317424850">Tool bar</translation> <translation id="5105050547967751155">rq</translation> @@ -1019,7 +1019,7 @@ <translation id="8625173877182443267">No next level 6 heading</translation> <translation id="8628186274519446680">Tomato</translation> <translation id="8638532244051952400">Announce current cell co-ordinates</translation> -<translation id="8640369214276455272">White Smoke</translation> +<translation id="8640369214276455272">White smoke</translation> <translation id="8651481478098336970">volume mute</translation> <translation id="8653646212587894517">Show links list</translation> <translation id="8656888282555543604">Enable braille logging</translation> @@ -1084,7 +1084,7 @@ <translation id="9192904702577636854">Marquee</translation> <translation id="9205282956404529648">Type to auto complete</translation> <translation id="9208241857935108694">Antique White</translation> -<translation id="9220679313820249046">Orange Red</translation> +<translation id="9220679313820249046">Orange red</translation> <translation id="9223032053830369045">Dark Red</translation> <translation id="923331726185079994">ChromeVox Updated</translation> <translation id="93384979447910801">Dark Sea Green</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/preference_manager.js b/chrome/browser/resources/chromeos/accessibility/switch_access/preference_manager.js index 1a4ada6..0f38196 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/preference_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/preference_manager.js
@@ -62,6 +62,22 @@ return null; } + /** + * Get the preference value for the given name, or |null| if the value is not + * a dictionary or does not exist. + * + * @param {SAConstants.Preference} name + * @return {Object|null} + * @private + */ + getDict_(name) { + const pref = this.preferences_.get(name); + if (pref && pref.type === chrome.settingsPrivate.PrefType.DICTIONARY) { + return /** @type {Object} */ (pref.value); + } + return null; + } + /** @private */ init_() { chrome.settingsPrivate.onPrefsChanged.addListener( @@ -77,19 +93,26 @@ * @private */ settingsAreConfigured_() { - const selectSetting = - this.getNumber_(SAConstants.Preference.SELECT_SETTING); - const nextSetting = this.getNumber_(SAConstants.Preference.NEXT_SETTING); - const previousSetting = - this.getNumber_(SAConstants.Preference.PREVIOUS_SETTING); + const selectPref = + this.getDict_(SAConstants.Preference.SELECT_DEVICE_KEY_CODES); + const selectSet = selectPref ? Object.keys(selectPref).length : false; + + const nextPref = + this.getDict_(SAConstants.Preference.NEXT_DEVICE_KEY_CODES); + const nextSet = nextPref ? Object.keys(nextPref).length : false; + + const previousPref = + this.getDict_(SAConstants.Preference.PREVIOUS_DEVICE_KEY_CODES); + const previousSet = previousPref ? Object.keys(previousPref).length : false; + const autoScanEnabled = !!this.getBoolean_(SAConstants.Preference.AUTO_SCAN_ENABLED); - if (!selectSetting) { + if (!selectSet) { return false; } - if (nextSetting || previousSetting) { + if (nextSet || previousSet) { return true; }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js index 73696c6..c3c3847 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_constants.js
@@ -92,9 +92,11 @@ AUTO_SCAN_TIME: 'settings.a11y.switch_access.auto_scan.speed_ms', AUTO_SCAN_KEYBOARD_TIME: 'settings.a11y.switch_access.auto_scan.keyboard.speed_ms', - NEXT_SETTING: 'settings.a11y.switch_access.next.setting', - PREVIOUS_SETTING: 'settings.a11y.switch_access.previous.setting', - SELECT_SETTING: 'settings.a11y.switch_access.select.setting', + NEXT_DEVICE_KEY_CODES: 'settings.a11y.switch_access.next.device_key_codes', + PREVIOUS_DEVICE_KEY_CODES: + 'settings.a11y.switch_access.previous.device_key_codes', + SELECT_DEVICE_KEY_CODES: + 'settings.a11y.switch_access.select.device_key_codes', }, // =========================== Sub-objects ===========================
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome.js b/chrome/browser/resources/chromeos/login/oobe_welcome.js index 084f1f6..b324a27 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome.js +++ b/chrome/browser/resources/chromeos/login/oobe_welcome.js
@@ -129,7 +129,13 @@ * @private {number} * @const */ - DEFAULT_CHROMEVOX_HINT_TIMEOUT_MS_: {type: Number, value: 40 * 1000} + DEFAULT_CHROMEVOX_HINT_TIMEOUT_MS_: {type: Number, value: 40 * 1000}, + + /** + * Tracks if we've given the ChromeVox hint yet. + * @private + */ + chromeVoxHintGiven_: {type: Boolean, value: false} }, /** Overridden from LoginScreenBehavior. */ @@ -668,7 +674,7 @@ * @private */ onVoiceNotLoaded_() { - if (!this.voicesChangedListenerMaybeGiveChromeVoxHint_) { + if (this.voicesChangedListenerMaybeGiveChromeVoxHint_ === undefined) { // Add voiceschanged listener that tries to give the hint when new voices // are loaded. this.voicesChangedListenerMaybeGiveChromeVoxHint_ = @@ -700,6 +706,14 @@ * @private */ giveChromeVoxHint_(locale, options, isDefaultHint) { + if (this.chromeVoxHintGiven_) { + // Only give the hint once. + // Due to event listeners/timeouts, there is the chance that this gets + // called multiple times. + return; + } + + this.chromeVoxHintGiven_ = true; if (isDefaultHint) { console.warn( 'No voice available for ' + loadTimeData.getString('language') +
diff --git a/chrome/browser/resources/component_extension_resources.grd b/chrome/browser/resources/component_extension_resources.grd index e475112..d56d4e6 100644 --- a/chrome/browser/resources/component_extension_resources.grd +++ b/chrome/browser/resources/component_extension_resources.grd
@@ -93,9 +93,6 @@ <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_JS" file="chromeos/arc_support/recommend_app_list_view.js" type="BINDATA" /> <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML" file="chromeos/arc_support/recommend_app_list_view.html" type="chrome_html" flattenhtml="true" /> </if> - <if expr="enable_plugins"> - <part file="pdf/pdf_resources.grdp" /> - </if> <include name="IDR_CRYPTOTOKEN_UTIL_JS" file="cryptotoken/util.js" type="BINDATA" /> <include name="IDR_CRYPTOTOKEN_B64_JS" file="cryptotoken/b64.js" type="BINDATA" /> <include name="IDR_CRYPTOTOKEN_COUNTDOWN_JS" file="cryptotoken/countdown.js" type="BINDATA" />
diff --git a/chrome/browser/resources/domain_reliability_internals/BUILD.gn b/chrome/browser/resources/domain_reliability_internals/BUILD.gn new file mode 100644 index 0000000..fede7099 --- /dev/null +++ b/chrome/browser/resources/domain_reliability_internals/BUILD.gn
@@ -0,0 +1,17 @@ +# Copyright 2021 The Chromium 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 = [ ":domain_reliability_internals" ] +} + +js_library("domain_reliability_internals") { + deps = [ + "//third_party/jstemplate:jstemplate", + "//ui/webui/resources/js:cr", + "//ui/webui/resources/js:util", + ] +}
diff --git a/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.html b/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.html index 16ef608..bacb13f2 100644 --- a/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.html +++ b/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.html
@@ -4,8 +4,9 @@ <meta charset="utf-8"> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> <link rel="stylesheet" href="domain_reliability_internals.css"> - <script src="chrome://resources/js/cr.js"></script> <script src="chrome://resources/js/assert.js"></script> + <script src="chrome://resources/js/promise_resolver.js"></script> + <script src="chrome://resources/js/cr.js"></script> <script src="chrome://resources/js/util.js"></script> <script src="chrome://resources/js/jstemplate_compiled.js"></script> <script src="domain_reliability_internals.js"></script>
diff --git a/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.js b/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.js index 8d475fb4..b9fa8e2 100644 --- a/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.js +++ b/chrome/browser/resources/domain_reliability_internals/domain_reliability_internals.js
@@ -6,17 +6,14 @@ 'use strict'; function initialize() { - chrome.send('updateData'); - } - - function onDataUpdated(data) { - jstProcess(new JsEvalContext(data), $('template')); + cr.sendWithPromise('updateData').then(data => { + jstProcess(new JsEvalContext(data), $('template')); + }); } // Return an object with all of the exports. return { initialize: initialize, - onDataUpdated: onDataUpdated, }; });
diff --git a/chrome/browser/resources/media/BUILD.gn b/chrome/browser/resources/media/BUILD.gn index a11a2c2..4d0a7b9 100644 --- a/chrome/browser/resources/media/BUILD.gn +++ b/chrome/browser/resources/media/BUILD.gn
@@ -2,15 +2,32 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//chrome/common/features.gni") import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/grit_rule.gni") +import("//ui/webui/resources/tools/generate_grd.gni") + +generate_grd("build_grd") { + grd_prefix = "webrtc_logs" + out_grd = "$target_gen_dir/webrtc_logs_resources.grd" + input_files = [ + "webrtc_logs.css", + "webrtc_logs.html", + "webrtc_logs.js", + ] + input_files_base_dir = rebase_path(".", "//") +} grit("webrtc_logs_resources") { - source = "webrtc_logs_resources.grd" - + source = "$target_gen_dir/webrtc_logs_resources.grd" + deps = [ ":build_grd" ] + enable_input_discovery_for_gn_analyze = false + defines = chrome_grit_defines use_brotli = true outputs = [ "grit/webrtc_logs_resources.h", + "grit/webrtc_logs_resources_map.cc", + "grit/webrtc_logs_resources_map.h", "webrtc_logs_resources.pak", ] output_dir = "$root_gen_dir/chrome"
diff --git a/chrome/browser/resources/media/webrtc_logs_resources.grd b/chrome/browser/resources/media/webrtc_logs_resources.grd deleted file mode 100644 index 030e50f..0000000 --- a/chrome/browser/resources/media/webrtc_logs_resources.grd +++ /dev/null
@@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<grit latest_public_release="0" - current_release="1" - output_all_resource_defines="false"> - <outputs> - <output filename="grit/webrtc_logs_resources.h" type="rc_header"> - <emit emit_type="prepend"></emit> - </output> - <output filename="webrtc_logs_resources.pak" type="data_package" /> - </outputs> - <release seq="1"> - <includes> - <include name="IDR_WEBRTC_LOGS_HTML" - file="webrtc_logs.html" - flattenhtml="true" - allowexternalscript="true" - type="BINDATA" /> - <include name="IDR_WEBRTC_LOGS_JS" - file="webrtc_logs.js" - type="BINDATA" /> - </includes> - </release> -</grit>
diff --git a/chrome/browser/resources/ntp4/BUILD.gn b/chrome/browser/resources/ntp4/BUILD.gn index 8efe057..d6459b3d 100644 --- a/chrome/browser/resources/ntp4/BUILD.gn +++ b/chrome/browser/resources/ntp4/BUILD.gn
@@ -19,7 +19,6 @@ "//ui/webui/resources/js/cr/event_target.js", "//ui/webui/resources/js/cr/ui.js", "//ui/webui/resources/js/cr/ui/bubble.js", - "//ui/webui/resources/js/cr/ui/card_slider.js", "//ui/webui/resources/js/cr/ui/command.js", "//ui/webui/resources/js/cr/ui/context_menu_handler.js", "//ui/webui/resources/js/cr/ui/drag_wrapper.js", @@ -29,7 +28,6 @@ "//ui/webui/resources/js/cr/ui/menu_button.js", "//ui/webui/resources/js/cr/ui/menu_item.js", "//ui/webui/resources/js/cr/ui/position_util.js", - "//ui/webui/resources/js/cr/ui/touch_handler.js", "//ui/webui/resources/js/event_tracker.js", "//ui/webui/resources/js/icon.js", "//ui/webui/resources/js/load_time_data.js", @@ -37,12 +35,14 @@ "//ui/webui/resources/js/promise_resolver.js", "//ui/webui/resources/js/util.js", "apps_page.js", + "card_slider.js", "dot_list.js", "nav_dot.js", "new_tab.js", "page_list_view.js", "page_switcher.js", "tile_page.js", + "touch_handler.js", "trash.js", ]
diff --git a/ui/webui/resources/js/cr/ui/card_slider.js b/chrome/browser/resources/ntp4/card_slider.js similarity index 97% rename from ui/webui/resources/js/cr/ui/card_slider.js rename to chrome/browser/resources/ntp4/card_slider.js index af7e590..ccb363f 100644 --- a/ui/webui/resources/js/cr/ui/card_slider.js +++ b/chrome/browser/resources/ntp4/card_slider.js
@@ -23,7 +23,7 @@ // Use an anonymous function to enable strict mode just for this file (which // will be concatenated with other files when embedded in Chrome -cr.define('cr.ui', function() { +cr.define('ntp', function() { 'use strict'; /** @@ -67,10 +67,10 @@ this.cardWidth_ = cardWidth; /** - * @type {!cr.ui.TouchHandler} + * @type {!ntp.TouchHandler} * @private */ - this.touchHandler_ = new cr.ui.TouchHandler(this.container_); + this.touchHandler_ = new ntp.TouchHandler(this.container_); } @@ -146,7 +146,7 @@ // available. Note that this has minimal impact in the common case of // no touch events (eg. we're mainly just adding listeners for events that // will never trigger). - const TouchHandler = cr.ui.TouchHandler; + const TouchHandler = ntp.TouchHandler; this.container_.addEventListener( TouchHandler.EventType.TOUCH_START, this.onTouchStart_.bind(this)); this.container_.addEventListener( @@ -611,7 +611,7 @@ * @private */ onTouchStart_(e) { - e = /** @type {!cr.ui.TouchHandler.Event} */ (e); + e = /** @type {!ntp.TouchHandler.Event} */ (e); this.container_.style.transition = ''; e.enableDrag = true; }, @@ -623,7 +623,7 @@ * @private */ onDragStart_(e) { - e = /** @type {!cr.ui.TouchHandler.Event} */ (e); + e = /** @type {!ntp.TouchHandler.Event} */ (e); e.enableDrag = this.cardCount > 1 && Math.abs(e.dragDeltaX) > Math.abs(e.dragDeltaY); }, @@ -635,7 +635,7 @@ * @private */ onDragMove_(e) { - e = /** @type {!cr.ui.TouchHandler.Event} */ (e); + e = /** @type {!ntp.TouchHandler.Event} */ (e); let deltaX = e.dragDeltaX; // If dragging beyond the first or last card then apply a backoff so the // dragging feels stickier than usual. @@ -653,7 +653,7 @@ * @private */ onDragEnd_(e) { - e = /** @type {!cr.ui.TouchHandler.Event} */ (e); + e = /** @type {!ntp.TouchHandler.Event} */ (e); const deltaX = e.dragDeltaX; const velocity = this.touchHandler_.getEndVelocity().x; const newX = this.currentLeft_ + deltaX;
diff --git a/chrome/browser/resources/ntp4/new_tab.html b/chrome/browser/resources/ntp4/new_tab.html index 9eccd0db..d753a9a 100644 --- a/chrome/browser/resources/ntp4/new_tab.html +++ b/chrome/browser/resources/ntp4/new_tab.html
@@ -38,7 +38,6 @@ <script src="../../../../ui/webui/resources/js/cr/event_target.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui/bubble.js"></script> -<script src="../../../../ui/webui/resources/js/cr/ui/card_slider.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui/context_menu_handler.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui/drag_wrapper.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui/focus_manager.js"></script> @@ -46,13 +45,14 @@ <script src="../../../../ui/webui/resources/js/cr/ui/menu.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui/position_util.js"></script> <script src="../../../../ui/webui/resources/js/cr/ui/menu_button.js"></script> -<script src="../../../../ui/webui/resources/js/cr/ui/touch_handler.js"></script> <script src="../../../../ui/webui/resources/js/icon.js"></script> <script src="tile_page.js"></script> <script src="apps_page.js"></script> <script src="dot_list.js"></script> <script src="trash.js"></script> +<script src="touch_handler.js"></script> +<script src="card_slider.js"></script> <script src="page_list_view.js"></script> <script src="page_switcher.js"></script>
diff --git a/chrome/browser/resources/ntp4/page_list_view.js b/chrome/browser/resources/ntp4/page_list_view.js index 099cefb..6d7696c 100644 --- a/chrome/browser/resources/ntp4/page_list_view.js +++ b/chrome/browser/resources/ntp4/page_list_view.js
@@ -62,7 +62,7 @@ PageListView.prototype = { /** * The CardSlider object to use for changing app pages. - * @type {cr.ui.CardSlider|undefined} + * @type {ntp.CardSlider|undefined} */ cardSlider: undefined, @@ -184,7 +184,7 @@ // Initialize the cardSlider without any cards at the moment. this.sliderFrame = cardSliderFrame; - this.cardSlider = new cr.ui.CardSlider( + this.cardSlider = new ntp.CardSlider( this.sliderFrame, this.pageList, this.sliderFrame.offsetWidth); // Prevent touch events from triggering any sort of native scrolling if
diff --git a/ui/webui/resources/js/cr/ui/touch_handler.js b/chrome/browser/resources/ntp4/touch_handler.js similarity index 99% rename from ui/webui/resources/js/cr/ui/touch_handler.js rename to chrome/browser/resources/ntp4/touch_handler.js index d713539..392b17d 100644 --- a/ui/webui/resources/js/cr/ui/touch_handler.js +++ b/chrome/browser/resources/ntp4/touch_handler.js
@@ -31,7 +31,7 @@ // Use an anonymous function to enable strict mode just for this file (which // will be concatenated with other files when embedded in Chrome) -cr.define('cr.ui', function() { +cr.define('ntp', function() { 'use strict'; /**
diff --git a/chrome/browser/resources/pdf/BUILD.gn b/chrome/browser/resources/pdf/BUILD.gn index da52f99..dd25aa9 100644 --- a/chrome/browser/resources/pdf/BUILD.gn +++ b/chrome/browser/resources/pdf/BUILD.gn
@@ -3,9 +3,122 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") +import("//chrome/common/features.gni") import("//pdf/features.gni") import("//third_party/closure_compiler/compile_js.gni") +import("//tools/grit/grit_rule.gni") +import("//tools/grit/preprocess_if_expr.gni") import("//tools/polymer/html_to_js.gni") +import("//ui/webui/resources/tools/generate_grd.gni") + +preprocess_folder = "preprocessed" +preprocess_manifest = "preprocessed_manifest.json" +preprocess_gen_manifest = "preprocessed_gen_manifest.json" + +assert(enable_pdf, "enable_pdf check failed") + +preprocess_if_expr("preprocess") { + in_folder = "./" + out_folder = "$target_gen_dir/$preprocess_folder" + out_manifest = "$target_gen_dir/$preprocess_manifest" + in_files = [ + "bookmark_type.js", + "browser_api.js", + "constants.js", + "controller.js", + "gesture_detector.js", + "index.css", + "index.html", + "local_storage_proxy.js", + "main.js", + "metrics.js", + "navigator.js", + "open_pdf_params_parser.js", + "pdf_scripting_api.js", + "pdf_viewer_base.js", + "pdf_viewer_utils.js", + "toolbar_manager.js", + "viewport.js", + "viewport_scroller.js", + "zoom_manager.js", + ] + + if (is_chromeos) { + in_files += [ + "ink_controller.js", + "ink/index.html", + "ink/ink_api.js", + ] + } +} + +preprocess_if_expr("preprocess_generated") { + deps = [ ":web_components" ] + in_folder = target_gen_dir + out_folder = "$target_gen_dir/$preprocess_folder" + out_manifest = "$target_gen_dir/$preprocess_gen_manifest" + in_files = [ + "elements/icons.js", + "elements/shared-css.js", + "elements/shared-vars.js", + "elements/viewer-bookmark.js", + "elements/viewer-document-outline.js", + "elements/viewer-download-controls.js", + "elements/viewer-error-screen.js", + "elements/viewer-page-selector.js", + "elements/viewer-password-screen.js", + "elements/viewer-pdf-sidenav.js", + "elements/viewer-pdf-toolbar.js", + "elements/viewer-pdf-toolbar-new.js", + "elements/viewer-properties-dialog.js", + "elements/viewer-thumbnail-bar.js", + "elements/viewer-thumbnail.js", + "elements/viewer-toolbar-dropdown.js", + "elements/viewer-zoom-button.js", + "elements/viewer-zoom-toolbar.js", + "pdf_viewer.js", + "pdf_viewer_shared_style.js", + ] + if (is_chromeos) { + in_files += [ + "elements/viewer-annotations-bar.js", + "elements/viewer-annotations-mode-dialog.js", + "elements/viewer-form-warning.js", + "elements/viewer-ink-host.js", + "elements/viewer-pen-options.js", + ] + } +} + +generate_grd("build_grd") { + deps = [ + ":preprocess", + ":preprocess_generated", + ] + manifest_files = [ + "$target_gen_dir/$preprocess_manifest", + "$target_gen_dir/$preprocess_gen_manifest", + ] + grd_prefix = "pdf" + out_grd = "$target_gen_dir/resources.grd" + resource_path_prefix = "pdf" +} + +grit("pdf_resources") { + defines = chrome_grit_defines + + enable_input_discovery_for_gn_analyze = false + source = "$target_gen_dir/resources.grd" + deps = [ ":build_grd" ] + + outputs = [ + "grit/pdf_resources.h", + "grit/pdf_resources_map.cc", + "grit/pdf_resources_map.h", + "pdf_resources.pak", + ] + output_dir = "$root_gen_dir/chrome" +} assert(enable_pdf, "enable_pdf check failed") @@ -26,7 +139,7 @@ group("closure_compile") { deps = [ - ":pdf_resources", + ":closure_compile_local", "elements:closure_compile", ] if (is_chromeos_ash) { @@ -220,7 +333,7 @@ ] } -js_type_check("pdf_resources") { +js_type_check("closure_compile_local") { is_polymer3 = true deps = [ ":annotation_tool",
diff --git a/chrome/browser/resources/pdf/constants.js b/chrome/browser/resources/pdf/constants.js index 37f8027..9baa2a5 100644 --- a/chrome/browser/resources/pdf/constants.js +++ b/chrome/browser/resources/pdf/constants.js
@@ -18,6 +18,18 @@ }; /** + * @typedef {{ + * title: string, + * author: string, + * subject: string, + * creator: string, + * producer: string, + * canSerializeDocument: boolean, + * }} + */ +export let DocumentMetadata; + +/** * Enumeration of page fitting types. * @enum {string} */
diff --git a/chrome/browser/resources/pdf/elements/BUILD.gn b/chrome/browser/resources/pdf/elements/BUILD.gn index 698d8aa..8586b6e 100644 --- a/chrome/browser/resources/pdf/elements/BUILD.gn +++ b/chrome/browser/resources/pdf/elements/BUILD.gn
@@ -157,6 +157,7 @@ js_library("viewer-properties-dialog") { deps = [ + "..:constants", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m", ]
diff --git a/chrome/browser/resources/pdf/elements/viewer-properties-dialog.html b/chrome/browser/resources/pdf/elements/viewer-properties-dialog.html index bfc31ed..cf85812 100644 --- a/chrome/browser/resources/pdf/elements/viewer-properties-dialog.html +++ b/chrome/browser/resources/pdf/elements/viewer-properties-dialog.html
@@ -46,15 +46,21 @@ </tr> <tr> <td class="name">$i18n{propertiesTitle}</td> - <td class="value" id="title">-</td> + <td class="value" id="title"> + [[getOrPlaceholder_(documentMetadata.title)]] + </td> </tr> <tr> <td class="name">$i18n{propertiesAuthor}</td> - <td class="value" id="author">-</td> + <td class="value" id="author"> + [[getOrPlaceholder_(documentMetadata.author)]] + </td> </tr> <tr> <td class="name">$i18n{propertiesSubject}</td> - <td class="value" id="subject">-</td> + <td class="value" id="subject"> + [[getOrPlaceholder_(documentMetadata.subject)]] + </td> </tr> <tr> <td class="name">$i18n{propertiesKeywords}</td> @@ -70,11 +76,15 @@ </tr> <tr class="break"> <td class="name">$i18n{propertiesApplication}</td> - <td class="value" id="application">-</td> + <td class="value" id="application"> + [[getOrPlaceholder_(documentMetadata.creator)]] + </td> </tr> <tr> <td class="name">$i18n{propertiesPdfProducer}</td> - <td class="value" id="pdf-producer">-</td> + <td class="value" id="pdf-producer"> + [[getOrPlaceholder_(documentMetadata.producer)]] + </td> </tr> <tr> <td class="name">$i18n{propertiesPdfVersion}</td>
diff --git a/chrome/browser/resources/pdf/elements/viewer-properties-dialog.js b/chrome/browser/resources/pdf/elements/viewer-properties-dialog.js index ec71763..869678f 100644 --- a/chrome/browser/resources/pdf/elements/viewer-properties-dialog.js +++ b/chrome/browser/resources/pdf/elements/viewer-properties-dialog.js
@@ -8,6 +8,8 @@ import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {DocumentMetadata} from '../constants.js'; + export class ViewerPropertiesDialogElement extends PolymerElement { static get is() { return 'viewer-properties-dialog'; @@ -17,6 +19,13 @@ return html`{__html_template__}`; } + static get properties() { + return { + /** @type {!DocumentMetadata} */ + documentMetadata: Object, + }; + } + /** * @return {!CrDialogElement} * @private @@ -26,6 +35,15 @@ this.shadowRoot.querySelector('cr-dialog')); } + /** + * @param {string} value + * @return {string} + * @private + */ + getOrPlaceholder_(value) { + return value || '-'; + } + /** @private */ onClickClose_() { this.getDialog_().close();
diff --git a/chrome/browser/resources/pdf/pdf_resources.grdp b/chrome/browser/resources/pdf/pdf_resources.grdp deleted file mode 100644 index 1016c65f..0000000 --- a/chrome/browser/resources/pdf/pdf_resources.grdp +++ /dev/null
@@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<grit-part> - <!-- Note that resources included here that are used in Print Preview - also must be included in print_preview_ui.cc such these resources - will be exposed to PDF in print preview. --> - <include name="IDR_PDF_INDEX_HTML" file="pdf/index.html" type="BINDATA" preprocess="true" /> - <include name="IDR_PDF_INDEX_CSS" file="pdf/index.css" type="BINDATA" /> - <include name="IDR_PDF_MAIN_JS" file="pdf/main.js" type="BINDATA" preprocess="true" /> - <include name="IDR_PDF_PDF_VIEWER_UTILS_JS" file="pdf/pdf_viewer_utils.js" type="BINDATA" /> - <include name="IDR_PDF_PDF_VIEWER_BASE_JS" file="pdf/pdf_viewer_base.js" type="BINDATA" /> - <include name="IDR_PDF_PDF_VIEWER_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/pdf_viewer.js" use_base_dir="false" type="BINDATA" preprocess="true" /> - <include name="IDR_PDF_PDF_VIEWER_SHARED_STYLE_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/pdf_viewer_shared_style.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_BOOKMARK_TYPE_JS" file="pdf/bookmark_type.js" type="BINDATA" /> - <include name="IDR_PDF_CONSTANTS_JS" file="pdf/constants.js" type="BINDATA" /> - <include name="IDR_PDF_CONTROLLER_JS" file="pdf/controller.js" type="BINDATA" /> - <include name="IDR_PDF_TOOLBAR_MANAGER_JS" file="pdf/toolbar_manager.js" type="BINDATA" /> - <include name="IDR_PDF_VIEWPORT_JS" file="pdf/viewport.js" type="BINDATA" /> - <include name="IDR_PDF_OPEN_PDF_PARAMS_PARSER_JS" file="pdf/open_pdf_params_parser.js" type="BINDATA" /> - <include name="IDR_PDF_NAVIGATOR_JS" file="pdf/navigator.js" type="BINDATA" /> - <include name="IDR_PDF_VIEWPORT_SCROLLER_JS" file="pdf/viewport_scroller.js" type="BINDATA" /> - <include name="IDR_PDF_PDF_SCRIPTING_API_JS" file="pdf/pdf_scripting_api.js" type="BINDATA" /> - <include name="IDR_PDF_ZOOM_MANAGER_JS" file="pdf/zoom_manager.js" type="BINDATA" /> - <include name="IDR_PDF_GESTURE_DETECTOR_JS" file="pdf/gesture_detector.js" type="BINDATA" /> - <include name="IDR_PDF_BROWSER_API_JS" file="pdf/browser_api.js" type="BINDATA" /> - <include name="IDR_PDF_METRICS_JS" file="pdf/metrics.js" type="BINDATA" /> - <include name="IDR_PDF_LOCAL_STORAGE_PROXY_JS" file="pdf/local_storage_proxy.js" type="BINDATA" /> - <include name="IDR_PDF_ELEMENTS_SHARED_CSS_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/shared-css.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_SHARED_VARS_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/shared-vars.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_ICONS_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/icons.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_BOOKMARK_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-bookmark.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_DOCUMENT_OUTLINE_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-document-outline.js" use_base_dir="false" type="BINDATA"/> - <include name="IDR_PDF_VIEWER_DOWNLOADS_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-download-controls.js" use_base_dir="false" type="BINDATA"/> - <include name="IDR_PDF_VIEWER_ERROR_SCREEN_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-error-screen.js" use_base_dir="false" type="BINDATA" /> - <if expr="chromeos"> - <include name="IDR_PDF_VIEWER_ANNOTATIONS_MODE_DIALOG_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-annotations-mode-dialog.js" use_base_dir="false" type="BINDATA"/> - <include name="IDR_PDF_VIEWER_ANNOTATIONS_BAR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-annotations-bar.js" use_base_dir="false" type="BINDATA"/> - <include name="IDR_PDF_VIEWER_INK_CONTROLLER_JS" file="pdf/ink_controller.js" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_INK_INDEX_HTML" file="pdf/ink/index.html" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_INK_INK_API_JS" file="pdf/ink/ink_api.js" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_INK_HOST_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-ink-host.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_PEN_OPTIONS_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-pen-options.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_FORM_WARNING_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-form-warning.js" use_base_dir="false" type="BINDATA" /> - </if> - <include name="IDR_PDF_VIEWER_PAGE_SELECTOR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-page-selector.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_PASSWORD_SCREEN_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-password-screen.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_PDF_SIDENAV_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-pdf-sidenav.js" use_base_dir="false" type="BINDATA"/> - <include name="IDR_PDF_VIEWER_PDF_TOOLBAR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar.js" use_base_dir="false" type="BINDATA" preprocess="true"/> - <include name="IDR_PDF_VIEWER_PDF_TOOLBAR_NEW_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-pdf-toolbar-new.js" use_base_dir="false" type="BINDATA" preprocess="true"/> - <include name="IDR_PDF_VIEWER_PROPERTIES_DIALOG_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-properties-dialog.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_THUMBNAIL_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-thumbnail.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_THUMBNAIL_BAR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-thumbnail-bar.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_TOOLBAR_DROPDOWN_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_ZOOM_BUTTON_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-zoom-button.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PDF_VIEWER_ZOOM_SELECTOR_JS" file="${root_gen_dir}/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.js" use_base_dir="false" type="BINDATA" /> -</grit-part>
diff --git a/chrome/browser/resources/pdf/pdf_viewer.html b/chrome/browser/resources/pdf/pdf_viewer.html index e54a03f1b..ae8986eb 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.html +++ b/chrome/browser/resources/pdf/pdf_viewer.html
@@ -226,6 +226,7 @@ <template is="dom-if" if="[[showPropertiesDialog_]]" restamp> <viewer-properties-dialog id="properties-dialog" + document-metadata="[[documentMetadata_]]" on-close="onPropertiesDialogClose_"> </viewer-properties-dialog> </template>
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js index ee362d9..71b59c0 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.js +++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -24,7 +24,7 @@ import {Bookmark} from './bookmark_type.js'; import {BrowserApi} from './browser_api.js'; -import {Attachment, FittingType, Point, SaveRequestType} from './constants.js'; +import {Attachment, DocumentMetadata, FittingType, Point, SaveRequestType} from './constants.js'; import {PluginController} from './controller.js'; import {ViewerPdfSidenavElement} from './elements/viewer-pdf-sidenav.js'; import {ViewerPdfToolbarNewElement} from './elements/viewer-pdf-toolbar-new.js'; @@ -65,15 +65,6 @@ /** * @typedef {{ * type: string, - * title: string, - * canSerializeDocument: boolean, - * }} - */ -let MetadataMessageData; - -/** - * @typedef {{ - * type: string, * messageId: string, * page: number, * }} @@ -184,6 +175,12 @@ value: false, }, + /** @private {!DocumentMetadata} */ + documentMetadata_: { + type: Object, + value: () => {}, + }, + /** @private */ hadPassword_: { type: Boolean, @@ -940,7 +937,9 @@ destinationData.zoom); return; case 'metadata': - this.setDocumentMetadata_(/** @type {!MetadataMessageData} */ (data)); + this.setDocumentMetadata_( + /** @type {{ metadataData: !DocumentMetadata }} */ (data) + .metadataData); return; case 'setIsEditing': // Editing mode can only be entered once, and cannot be exited. @@ -1056,13 +1055,15 @@ /** * Sets document metadata from the current controller. - * @param {!MetadataMessageData} metadata + * @param {!DocumentMetadata} metadata * @private */ setDocumentMetadata_(metadata) { - this.title_ = metadata.title || getFilenameFromURL(this.originalUrl); + this.documentMetadata_ = metadata; + this.title_ = + this.documentMetadata_.title || getFilenameFromURL(this.originalUrl); document.title = this.title_; - this.canSerializeDocument_ = metadata.canSerializeDocument; + this.canSerializeDocument_ = this.documentMetadata_.canSerializeDocument; } /**
diff --git a/chrome/browser/resources/settings/chromeos/device_page/power.html b/chrome/browser/resources/settings/chromeos/device_page/power.html index 53919601..d4e3df7 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/power.html +++ b/chrome/browser/resources/settings/chromeos/device_page/power.html
@@ -53,35 +53,55 @@ </div> </div> - <div id="powerIdleLabel" - class$="cr-row [[getFirst_(batteryStatus_.present)]]" - aria-label="true"> - $i18n{powerIdleLabel} - </div> - <div class="cr-row indented first"> - <div class="flex" aria-hidden="true"> - $i18n{powerIdleWhileChargingLabel} + <div class$="cr-row [[getFirst_(batteryStatus_.present)]]"> + <div id="powerIdleLabel" class="flex" aria-label="true"> + $i18n{powerIdleLabel} </div> - <template is="dom-if" if="[[acIdleManaged_]]" restamp> - <cr-policy-indicator id="acIdleManagedIndicator" - indicator-type="devicePolicy" - icon-aria-label="$i18n{powerIdleWhileChargingAriaLabel}"> - </cr-policy-indicator> - </template> - <select id="acIdleSelect" class="md-select" - on-change="onAcIdleSelectChange_" - disabled="[[shouldAcIdleSelectBeDisabled_]]" - aria-label="$i18n{powerIdleWhileChargingAriaLabel}" - deep-link-focus-id$="[[Setting.kPowerIdleBehaviorWhileCharging]]"> - <template is="dom-repeat" items="[[acIdleOptions_]]"> - <option value="[[item.value]]" selected="[[item.selected]]"> - [[item.name]] - </option> + <template is="dom-if" if="[[!batteryStatus_.present]]" restamp> + <template is="dom-if" if="[[acIdleManaged_]]" restamp> + <cr-policy-indicator id="noBatteryAcIdleManagedIndicator" + indicator-type="devicePolicy" + icon-aria-label="$i18n{powerIdleWhileChargingAriaLabel}"> + </cr-policy-indicator> </template> - </select> + <select id="noBatteryAcIdleSelect" class="md-select" + on-change="onAcIdleSelectChange_" + disabled="[[shouldAcIdleSelectBeDisabled_]]" + aria-label="$i18n{powerIdleWhileChargingAriaLabel}" + deep-link-focus-id$="[[Setting.kPowerIdleBehaviorWhileCharging]]"> + <template is="dom-repeat" items="[[acIdleOptions_]]"> + <option value="[[item.value]]" selected="[[item.selected]]"> + [[item.name]] + </option> + </template> + </select> + </template> </div> <template is="dom-if" if="[[batteryStatus_.present]]" restamp> + <div id="acIdleSettingBox" class="cr-row indented first"> + <div class="flex" aria-hidden="true"> + $i18n{powerIdleWhileChargingLabel} + </div> + <template is="dom-if" if="[[acIdleManaged_]]" restamp> + <cr-policy-indicator id="acIdleManagedIndicator" + indicator-type="devicePolicy" + icon-aria-label="$i18n{powerIdleWhileChargingAriaLabel}"> + </cr-policy-indicator> + </template> + <select id="acIdleSelect" class="md-select" + on-change="onAcIdleSelectChange_" + disabled="[[shouldAcIdleSelectBeDisabled_]]" + aria-label="$i18n{powerIdleWhileChargingAriaLabel}" + deep-link-focus-id$="[[Setting.kPowerIdleBehaviorWhileCharging]]"> + <template is="dom-repeat" items="[[acIdleOptions_]]"> + <option value="[[item.value]]" selected="[[item.selected]]"> + [[item.name]] + </option> + </template> + </select> + </div> + <div id="batteryIdleSettingBox" class="cr-row indented"> <div class="flex" aria-hidden="true"> $i18n{powerIdleWhileOnBatteryLabel}
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html index a0ab4d6b..b8e4fca 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
@@ -71,13 +71,13 @@ aria-labelledby="add-wifi-label"></cr-icon-button> </div> </template> - <div actionable$="[[vpnIsEnabled_]]" class="list-item" + <div actionable$="[[!vpnIsProhibited_]]" class="list-item" on-click="onAddVPNTap_"> <div class="start settings-box-text" id="add-vpn-label" aria-hidden="true"> $i18n{internetAddVPN} </div> - <template is="dom-if" if="[[!vpnIsEnabled_]]"> + <template is="dom-if" if="[[vpnIsProhibited_]]"> <cr-policy-indicator id="vpnPolicyIndicator" icon-aria-label="$i18n{networkVpnBuiltin}" indicator-type="devicePolicy" @@ -86,7 +86,7 @@ </template> <cr-icon-button class="icon-add-circle" aria-labelledby="add-vpn-label" - disabled="[[!vpnIsEnabled_]]"> + disabled="[[vpnIsProhibited_]]"> </cr-icon-button> </div> <template is="dom-repeat" items="[[vpnProviders_]]">
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js index cede6b2..ad4acad 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -81,10 +81,10 @@ }, /** - * False if VPN is disabled by policy. + * True if VPN is prohibited by policy. * @private {boolean} */ - vpnIsEnabled_: { + vpnIsProhibited_: { type: Boolean, value: false, }, @@ -502,9 +502,9 @@ } const vpn = this.deviceStates[mojom.NetworkType.kVPN]; - this.vpnIsEnabled_ = !!vpn && + this.vpnIsProhibited_ = !!vpn && vpn.deviceState === - chromeos.networkConfig.mojom.DeviceStateType.kEnabled; + chromeos.networkConfig.mojom.DeviceStateType.kProhibited; if (this.detailType_ && !this.deviceStates[this.detailType_]) { // If the device type associated with the current network has been @@ -541,7 +541,7 @@ /** @private */ onAddVPNTap_() { - if (this.vpnIsEnabled_) { + if (!this.vpnIsProhibited_) { this.showConfig_( true /* configAndConnect */, chromeos.networkConfig.mojom.NetworkType.kVPN);
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn index e0a992e2..adc43275 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -129,9 +129,9 @@ # ":os_a11y_page.m", ":os_a11y_page_browser_proxy.m", - ":switch_access_action_assignment_dialog.m", ":switch_access_constants.m", + # ":switch_access_subpage.m", ":switch_access_subpage_browser_proxy.m", ":tts_subpage.m",
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.html index c400a80c..f422a454 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.html +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.html
@@ -91,7 +91,7 @@ class$="icon [[computeIcon_(assignment, assignmentState_)]]-icon" aria-label="[[computeIconLabel_(assignment, assignmentState_)]]"> </iron-icon> - [[assignment.key]] + [[getLabelForAssignment_(assignment)]] </div> </template> </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js index ebabb01..bec226129 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js
@@ -37,18 +37,6 @@ }; /** - * Possible device types for Switch Access. - * @enum {string} - * @private - */ -/* #export */ const SwitchAccessDeviceType = { - INTERNAL: 'internal', - USB: 'usb', - BLUETOOTH: 'bluetooth', - UNKNOWN: 'unknown' -}; - -/** * Various icons representing the state of a given key assignment. * @enum {string} */ @@ -59,9 +47,44 @@ }; /** - * @typedef {!Array<!Object<string, !Array<!SwitchAccessDeviceType>>>} + * Mapping of a stringified key code to a list of Switch Access device types + * for that key code. + * @typedef {!Object<string, !Array<!SwitchAccessDeviceType>>} */ -let SwitchAccessKeyAssignmentInfoList; +let SwitchAccessKeyAssignmentInfoMapping; + +/** + * @param {!SwitchAccessDeviceType} deviceType + * @return {string} + */ +/* #export */ function getLabelForDeviceType(deviceType) { + switch (deviceType) { + case SwitchAccessDeviceType.INTERNAL: + return I18nBehavior.i18nAdvanced( + 'switchAccessInternalDeviceTypeLabel', {}); + case SwitchAccessDeviceType.USB: + return I18nBehavior.i18nAdvanced('switchAccessUsbDeviceTypeLabel', {}); + case SwitchAccessDeviceType.BLUETOOTH: + return I18nBehavior.i18nAdvanced( + 'switchAccessBluetoothDeviceTypeLabel', {}); + case SwitchAccessDeviceType.UNKNOWN: + return I18nBehavior.i18nAdvanced( + 'switchAccessUnknownDeviceTypeLabel', {}); + } + throw new Error('Invalid device type.'); +} + +/** + * Converts assignment object to pretty-formatted label. + * E.g. {key: 'Escape', device: 'usb'} -> 'Escape (USB)' + * @param {{key: string, device: !SwitchAccessDeviceType}} assignment + * @return {string} + */ +/* #export */ function getLabelForAssignment(assignment) { + return I18nBehavior.i18nAdvanced('switchAndDeviceType', { + substitutions: [assignment.key, getLabelForDeviceType(assignment.device)] + }); +} Polymer({ is: 'settings-switch-access-action-assignment-dialog', @@ -93,8 +116,7 @@ /** * Assignments for the current action. - * @private {Array<!{key: string, devices: - * !Array<!SwitchAccessDeviceType>}>} + * @private {!Array<{key: string, device: !SwitchAccessDeviceType}>} */ assignments_: { type: Array, @@ -113,12 +135,14 @@ /** * A dictionary containing all Switch Access key codes (mapped from * actions). - * Each key code is another object, mapping a stringified key code to a list - * of Switch Access device types for that key code. + * TODO: Consider changing from list of devices to a set/map of devices, + * to guarantee uniqueness and better represent the underlying state (a + * device either is or isn't associated with a given key code, and order of + * devices doesn't matter) * @private {{ - * select: SwitchAccessKeyAssignmentInfoList, - * next: SwitchAccessKeyAssignmentInfoList, - * previous: SwitchAccessKeyAssignmentInfoList + * select: SwitchAccessKeyAssignmentInfoMapping, + * next: SwitchAccessKeyAssignmentInfoMapping, + * previous: SwitchAccessKeyAssignmentInfoMapping * }} */ keyCodes_: { @@ -150,14 +174,14 @@ /** @private {!string} */ currentKey_: String, - /** @private {!string} */ - unexpectedKey_: String, - /** @private {?number} */ currentKeyCode_: { type: Number, value: null, }, + + /** @private {!SwitchAccessDeviceType} */ + currentDeviceType_: String, }, /** @private {?SwitchAccessSubpageBrowserProxy} */ @@ -234,6 +258,7 @@ handleKeyEventInWaitForKey_(event) { this.currentKeyCode_ = event.keyCode; this.currentKey_ = event.key; + this.currentDeviceType_ = event.device; if (!this.currentKey_) { this.assignmentState_ = AssignmentState.WARN_UNRECOGNIZED_KEY; @@ -242,7 +267,9 @@ // Check for pre-existing assignments in actions other than the current one. for (const action of Object.values(SwitchAccessCommand)) { - if (!this.keyCodes_[action][event.keyCode]) { + if (!this.keyCodes_[action][event.keyCode] || + !this.keyCodes_[action][event.keyCode].includes( + this.currentDeviceType_)) { continue; } @@ -261,7 +288,9 @@ return; } this.assignmentState_ = AssignmentState.WAIT_FOR_CONFIRMATION; - this.push('assignments_', this.currentKey_); + this.push( + 'assignments_', + {key: this.currentKey_, device: this.currentDeviceType_}); }, /** @@ -272,21 +301,30 @@ * @private */ handleKeyEventInWaitForConfirmation_(event) { - if (this.currentKeyCode_ === event.keyCode) { - // Confirmed. - // TODO: resolve to specific device type once UI is hooked up; - // |event.device| has the Switch Access device type. - this.keyCodes_[this.action][this.currentKeyCode_] = [ - SwitchAccessDeviceType.INTERNAL, SwitchAccessDeviceType.USB, - SwitchAccessDeviceType.BLUETOOTH - ]; - this.$.switchAccessActionAssignmentDialog.close(); + if (this.currentKeyCode_ !== event.keyCode || + this.currentDeviceType_ !== event.device) { + this.assignmentState_ = AssignmentState.WARN_NOT_CONFIRMED; return; } - // Not confirmed. - this.unexpectedKey_ = event.key; - this.assignmentState_ = AssignmentState.WARN_NOT_CONFIRMED; + // Save the key to |this.keyCodes_| for inclusion into prefs later. + const keyAssignmentInfoMapping = this.keyCodes_[this.action]; + if (!keyAssignmentInfoMapping) { + throw new Error('Expected valid pref for action: ' + this.action); + } + let devices = keyAssignmentInfoMapping[this.currentKeyCode_]; + if (!devices) { + // |this.currentKeyCode_| was not set as a switch key for |this.action| + // before. + devices = []; + keyAssignmentInfoMapping[this.currentKeyCode_] = devices; + } + if (!devices.includes(event.device)) { + // A new device for the current key code has been added. + devices.push(event.device); + } + + this.$.switchAccessActionAssignmentDialog.close(); }, /** @@ -297,14 +335,18 @@ * @private */ handleKeyEventInWaitForConfirmationRemoval_(event) { - if (this.currentKeyCode_ !== event.keyCode) { - this.unexpectedKey_ = event.key; + if (this.currentKeyCode_ !== event.keyCode || + this.currentDeviceType_ !== event.device) { this.assignmentState_ = AssignmentState.WARN_NOT_CONFIRMED_REMOVAL; return; } - // Remove this key code. - delete this.keyCodes_[this.action][this.currentKeyCode_]; + // Remove this device type for this key code. + const devices = this.keyCodes_[this.action][this.currentKeyCode_]; + devices.splice(devices.indexOf(event.device), 1); + if (!devices.length) { + delete this.keyCodes_[this.action][this.currentKeyCode_]; + } this.$.switchAccessActionAssignmentDialog.close(); }, @@ -315,8 +357,8 @@ }, /** - * @param {!Object<SwitchAccessCommand, !Array<!{key: string, devices: - * !Array<SwitchAccessDeviceType>}>>} value + * @param {!Object<SwitchAccessCommand, !Array<{key: string, device: + * !SwitchAccessDeviceType}>>} value * @private */ onAssignmentsChanged_(value) { @@ -342,6 +384,15 @@ }, /** + * @param {{key: string, device: !SwitchAccessDeviceType}} assignment + * @return {string} + * @private + */ + getLabelForAssignment_(assignment) { + return getLabelForAssignment(assignment); + }, + + /** * @param {SwitchAccessCommand} action * @return {string} * @private @@ -355,12 +406,13 @@ /** * Returns the image to use for the assignment's icon. The value must match * one of iron-icon's os-settings:(*) icon names. - * @param {string} assignment + * @param {{key: string, device: !SwitchAccessDeviceType}} assignment * @return {AssignmentIcon} * @private */ computeIcon_(assignment) { - if (assignment !== this.currentKey_) { + if (assignment.key !== this.currentKey_ || + assignment.device !== this.currentDeviceType_) { return AssignmentIcon.ASSIGNED; } @@ -382,7 +434,7 @@ /** * Returns the icon label describing the icon for the specified assignment. - * @param {string} assignment + * @param {{key: string, device: !SwitchAccessDeviceType}} assignment * @return {string} * @private */ @@ -403,7 +455,7 @@ /** * @param {!AssignmentState} assignmentState - * @param {!Array<string>} assignments + * @param {!Array<{key: string, device: !SwitchAccessDeviceType}>} assignments * @return {string} * @private */
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_constants.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_constants.js index 9cfc8ab..7e574d9 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_constants.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_constants.js
@@ -11,3 +11,14 @@ PREVIOUS: 'previous', SELECT: 'select' }; + +/** + * Possible device types for Switch Access. + * @enum {string} + */ +/* #export */ const SwitchAccessDeviceType = { + INTERNAL: 'internal', + USB: 'usb', + BLUETOOTH: 'bluetooth', + UNKNOWN: 'unknown' +}; \ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html index 37fe6a0..31c1ab8 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.html
@@ -12,7 +12,7 @@ <link rel="import" href="../../settings_shared_css.html"> <link rel="import" href="switch_access_action_assignment_dialog.html"> <link rel="import" href="switch_access_constants.html"> -+<link rel="import" href="switch_access_subpage_browser_proxy.html"> +<link rel="import" href="switch_access_subpage_browser_proxy.html"> <dom-module id="settings-switch-access-subpage"> <template>
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js index 807aab2..7f808de 100644 --- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
@@ -49,21 +49,21 @@ notify: true, }, - /** @private {Array<string>} */ + /** @private {!Array<{key: string, device: !SwitchAccessDeviceType}>} */ selectAssignments_: { type: Array, value: [], notify: true, }, - /** @private {Array<string>} */ + /** @private {!Array<{key: string, device: !SwitchAccessDeviceType}>} */ nextAssignments_: { type: Array, value: [], notify: true, }, - /** @private {Array<string>} */ + /** @private {!Array<{key: string, device: !SwitchAccessDeviceType}>} */ previousAssignments_: { type: Array, value: [], @@ -202,23 +202,34 @@ }, /** - * @param {!Object<SwitchAccessCommand, !Array<string>>} value + * @param {!Object<SwitchAccessCommand, !Array<{key: string, device: + * !SwitchAccessDeviceType}>>} value * @private */ onAssignmentsChanged_(value) { - // TODO: include |v.devices| for each key in UI. - this.selectAssignments_ = value[SwitchAccessCommand.SELECT].map(v => v.key); - this.nextAssignments_ = value[SwitchAccessCommand.NEXT].map(v => v.key); - this.previousAssignments_ = - value[SwitchAccessCommand.PREVIOUS].map(v => v.key); + this.selectAssignments_ = value[SwitchAccessCommand.SELECT]; + this.nextAssignments_ = value[SwitchAccessCommand.NEXT]; + this.previousAssignments_ = value[SwitchAccessCommand.PREVIOUS]; }, /** - * @param {!Array<string>} switches List of switch names - * @return {string} (e.g. 'Alt, Backspace, Enter, and 4 more switches') + * @param {{key: string, device: !SwitchAccessDeviceType}} assignment + * @return {string} * @private */ - getAssignSwitchSubLabel_(switches) { + getLabelForAssignment_(assignment) { + return getLabelForAssignment(assignment); + }, + + /** + * @param {!Array<{key: string, device: !SwitchAccessDeviceType}>} assignments + * List of assignments + * @return {string} (e.g. 'Alt (USB), Backspace, Enter, and 4 more switches') + * @private + */ + getAssignSwitchSubLabel_(assignments) { + const switches = + assignments.map(assignment => this.getLabelForAssignment_(assignment)); switch (switches.length) { case 0: return this.i18n('assignSwitchSubLabel0Switches');
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 54f6737..a0639fbb 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -106,7 +106,7 @@ "chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_account_manager_browser_proxy.html|NearbyAccountManagerBrowserProxy,NearbyAccountManagerBrowserProxyImpl", "chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_manager.html|setReceiveManagerForTesting,getReceiveManager,observeReceiveManager", "chrome/browser/resources/settings/chromeos/nearby_share_page/types.html|NearbyShareDataUsage,dataUsageStringToEnum", - "chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_constants.html|SwitchAccessCommand", + "chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_constants.html|SwitchAccessCommand,SwitchAccessDeviceType", "chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage_browser_proxy.html|SwitchAccessSubpageBrowserProxy,SwitchAccessSubpageBrowserProxyImpl", "chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage_browser_proxy.html|TtsSubpageBrowserProxy,TtsSubpageBrowserProxyImpl", "chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.html|generateOptions,getFirstPartyInputMethodEngineId,getOptionLabelName,getOptionMenuItems,getOptionUiType,getOptionUrl,hasOptionsPageInSettings,InputToolCode,isNumberValue,OPTION_DEFAULT,OptionType,UiType",
diff --git a/chrome/browser/resources/settings/privacy_page/BUILD.gn b/chrome/browser/resources/settings/privacy_page/BUILD.gn index 2b2f09e..b671664 100644 --- a/chrome/browser/resources/settings/privacy_page/BUILD.gn +++ b/chrome/browser/resources/settings/privacy_page/BUILD.gn
@@ -146,7 +146,6 @@ "..:route", "..:router.m", "../controls:settings_toggle_button.m", - "../people_page:sync_browser_proxy.m", "../prefs:prefs_behavior.m", "../site_settings:constants", "../site_settings:site_data_details_subpage", @@ -235,7 +234,6 @@ "..:metrics_browser_proxy", "..:route", "..:router.m", - "../people_page:sync_browser_proxy.m", "../prefs:prefs_behavior.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//ui/webui/resources/js:assert.m",
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html index 73d18d0..8dbac3f 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -95,8 +95,7 @@ associated-control="[[$$('#securityLinkRow')]]" learn-more-url="$i18n{safeBrowsingHelpCenterURL}"> <settings-security-page prefs="{{prefs}}" - focus-config="[[focusConfig_]]" - sync-status="[[syncStatus]]"> + focus-config="[[focusConfig_]]"> </settings-security-page> </settings-subpage> </template>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js index 1a31634..4d48941 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_page.js +++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -28,7 +28,6 @@ import {HatsBrowserProxyImpl} from '../hats_browser_proxy.js'; import {loadTimeData} from '../i18n_setup.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyElementInteractions} from '../metrics_browser_proxy.js'; -import {SyncBrowserProxyImpl, SyncStatus} from '../people_page/sync_browser_proxy.m.js'; import {PrefsBehavior} from '../prefs/prefs_behavior.m.js'; import {routes} from '../route.js'; import {RouteObserverBehavior, Router} from '../router.m.js'; @@ -66,12 +65,6 @@ notify: true, }, - /** - * The current sync status, supplied by SyncBrowserProxy. - * @type {?SyncStatus} - */ - syncStatus: Object, - /** @private */ isGuest_: { type: Boolean, @@ -236,11 +229,6 @@ 'onBlockAutoplayStatusChanged', this.onBlockAutoplayStatusChanged_.bind(this)); - SyncBrowserProxyImpl.getInstance().getSyncStatus().then( - this.handleSyncStatus_.bind(this)); - this.addWebUIListener( - 'sync-status-changed', this.handleSyncStatus_.bind(this)); - SiteSettingsPrefsBrowserProxyImpl.getInstance() .getCookieSettingDescription() .then(description => this.cookieSettingDescription_ = description); @@ -249,15 +237,6 @@ description => this.cookieSettingDescription_ = description); }, - /** - * Handler for when the sync state is pushed from the browser. - * @param {?SyncStatus} syncStatus - * @private - */ - handleSyncStatus_(syncStatus) { - this.syncStatus = syncStatus; - }, - /** @protected */ currentRouteChanged() { this.showClearBrowsingDataDialog_ =
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html index 83a1b7c..b3fd1b8a 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.html +++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -132,7 +132,7 @@ pref="{{prefs.generated.password_leak_detection}}" sub-label="[[getPasswordsLeakToggleSubLabel_( prefs.profile.password_manager_leak_detection.*, - syncStatus.*)]]"> + prefs.generated.password_leak_detection.*)]]"> </settings-toggle-button> </div> </settings-collapse-radio-button>
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.js b/chrome/browser/resources/settings/privacy_page/security_page.js index 33be8331..aa875ca 100644 --- a/chrome/browser/resources/settings/privacy_page/security_page.js +++ b/chrome/browser/resources/settings/privacy_page/security_page.js
@@ -21,7 +21,6 @@ import {loadTimeData} from '../i18n_setup.js'; import {MetricsBrowserProxy, MetricsBrowserProxyImpl, PrivacyElementInteractions, SafeBrowsingInteractions} from '../metrics_browser_proxy.js'; -import {SyncStatus} from '../people_page/sync_browser_proxy.m.js'; import {PrefsBehavior} from '../prefs/prefs_behavior.m.js'; import {routes} from '../route.js'; import {Route, RouteObserverBehavior, Router} from '../router.m.js'; @@ -52,9 +51,6 @@ ], properties: { - /** @type {SyncStatus} */ - syncStatus: Object, - /** * Preferences state. */ @@ -221,9 +217,11 @@ */ getPasswordsLeakToggleSubLabel_() { let subLabel = this.i18n('passwordsLeakDetectionGeneralDescription'); + // If the backing password leak detection preference is enabled, but the + // generated preference is disabled, then additional text explaining that + // the feature will be enabled if the user signs in is added. if (this.getPref('profile.password_manager_leak_detection').value && - (!this.syncStatus.signedIn || - !!this.syncStatus.signedIn && !!this.syncStatus.hasError)) { + !this.getPref('generated.password_leak_detection').value) { subLabel += ' ' + // Whitespace is a valid sentence separator w.r.t. i18n. this.i18n('passwordsLeakDetectionSignedOutEnabledDescription');
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html index ab7a811e..b904f6c5 100644 --- a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html +++ b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.html
@@ -165,7 +165,8 @@ </div> </div> <!-- TODO(https://crbug.com/1157764): Change to make only link clickable. --> - <template is="dom-if" if="[[shouldShowGuest_]]" restamp> + <template is="dom-if" if="[[interceptionParameters_.showGuestOption]]" + restamp> <div slot="footer"> <div class="divider"></div> <div id="footer-description" on-click="onGuest_"
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js index de500aa..9c0c79a 100644 --- a/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js +++ b/chrome/browser/resources/signin/dice_web_signin_intercept/dice_web_signin_intercept_app.js
@@ -35,14 +35,6 @@ value: false, }, - /** @private {boolean} */ - shouldShowGuest_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('shouldShowGuest'); - }, - }, - /** @private {string} */ guestLink_: { type: String,
diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc index e3d79cc..8e22a9f 100644 --- a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc +++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
@@ -170,8 +170,8 @@ signin::IdentityManager* identity_manager = IdentityManagerFactory::GetForProfile(profile); if (!profile->IsOffTheRecord() && identity_manager) { - token_fetcher_ = - std::make_unique<SafeBrowsingTokenFetcher>(identity_manager); + token_fetcher_ = std::make_unique<SafeBrowsingPrimaryAccountTokenFetcher>( + identity_manager); } } } @@ -461,7 +461,6 @@ if (is_enhanced_protection_ && token_fetcher_ && base::FeatureList::IsEnabled(kDownloadRequestWithToken)) { token_fetcher_->Start( - signin::ConsentLevel::kNotRequired, base::BindOnce(&CheckClientDownloadRequestBase::OnGotAccessToken, GetWeakPtr())); return; @@ -471,9 +470,8 @@ } void CheckClientDownloadRequestBase::OnGotAccessToken( - base::Optional<signin::AccessTokenInfo> access_token_info) { - if (access_token_info.has_value()) - access_token_ = access_token_info.value().token; + const std::string& access_token) { + access_token_ = access_token; SendRequest(); }
diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.h b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.h index 71b3a0e1..6d039065 100644 --- a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.h +++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.h
@@ -26,7 +26,7 @@ #include "chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.h" #include "chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.h" #include "components/history/core/browser/history_service.h" -#include "components/safe_browsing/core/browser/safe_browsing_token_fetcher.h" +#include "components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h" #include "components/safe_browsing/core/db/database_manager.h" #include "content/public/browser/browser_thread.h" #include "url/gurl.h" @@ -153,8 +153,7 @@ DownloadCheckResultReason reason) const = 0; // Called when |token_fetcher_| has finished fetching the access token. - void OnGotAccessToken( - base::Optional<signin::AccessTokenInfo> access_token_info); + void OnGotAccessToken(const std::string& access_token); // Called at the request start to determine if we should bailout due to the // file being whitelisted by policy
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositor.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositor.java index d721427..851c13b0 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositor.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositor.java
@@ -4,10 +4,13 @@ package org.chromium.chrome.browser.share.long_screenshots; -import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + import org.chromium.base.Callback; import org.chromium.base.UnguessableToken; import org.chromium.components.paint_preview.common.proto.PaintPreview.PaintPreviewProto; @@ -22,32 +25,34 @@ * captured webpage. */ public class LongScreenshotsCompositor { - private Context mContext; private PlayerCompositorDelegate mDelegate; private Callback<Bitmap> mBitmapCallback; private Rect mRect; + private static PlayerCompositorDelegate.Factory sCompositorDelegateFactory = + new CompositorDelegateFactory(); + /** * Creates a new {@link LongScreenshotsCompositor}. * * @param url The URL for which the content should be composited for. - * @param context An instance of current Android {@link Context}. * @param nativePaintPreviewServiceProvider The native paint preview service. * @param directoryKey The key for the directory storing the data. * @param rect The area of the captured webpage that should be composited. * @param response The proto with the address of the captured bitmap. * @param bitmapCallback Callback to process the composited bitmap. */ - public LongScreenshotsCompositor(GURL url, Context context, + public LongScreenshotsCompositor(GURL url, NativePaintPreviewServiceProvider nativePaintPreviewServiceProvider, String directoryKey, PaintPreviewProto response, Rect rect, Callback<Bitmap> bitmapCallback) { - mContext = context; mBitmapCallback = bitmapCallback; mRect = rect; - mDelegate = new PlayerCompositorDelegateImpl(nativePaintPreviewServiceProvider, response, - url, directoryKey, true, this::onCompositorReady, this::onCompositorError); + // TODO(tgupta): Look into warmupCompositor + mDelegate = getCompositorDelegateFactory().createForProto(nativePaintPreviewServiceProvider, + response, url, directoryKey, true, this::onCompositorReady, + this::onCompositorError); } /** @@ -63,9 +68,11 @@ * method initializes a sub-component for each frame and adds the view for the root frame to * {@link #mHostView}. */ - private void onCompositorReady(UnguessableToken rootFrameGuid, UnguessableToken[] frameGuids, + @VisibleForTesting + protected void onCompositorReady(UnguessableToken rootFrameGuid, UnguessableToken[] frameGuids, int[] frameContentSize, int[] scrollOffsets, int[] subFramesCount, UnguessableToken[] subFrameGuids, int[] subFrameClipRects) { + // TODO(tgupta): Keep track of the returned id. mDelegate.requestBitmap(mRect, 1, mBitmapCallback, this::onError); } @@ -83,4 +90,35 @@ mDelegate = null; } } + + static class CompositorDelegateFactory implements PlayerCompositorDelegate.Factory { + @Override + public PlayerCompositorDelegate create(NativePaintPreviewServiceProvider service, + @NonNull GURL url, String directoryKey, boolean mainFrameMode, + @NonNull PlayerCompositorDelegate.CompositorListener compositorListener, + Callback<Integer> compositorErrorCallback) { + return new PlayerCompositorDelegateImpl(service, null, url, directoryKey, mainFrameMode, + compositorListener, compositorErrorCallback); + } + + @Override + public PlayerCompositorDelegate createForProto(NativePaintPreviewServiceProvider service, + @Nullable PaintPreviewProto proto, @NonNull GURL url, String directoryKey, + boolean mainFrameMode, + @NonNull PlayerCompositorDelegate.CompositorListener compositorListener, + Callback<Integer> compositorErrorCallback) { + return new PlayerCompositorDelegateImpl(service, proto, url, directoryKey, + mainFrameMode, compositorListener, compositorErrorCallback); + } + } + + private PlayerCompositorDelegate.Factory getCompositorDelegateFactory() { + return sCompositorDelegateFactory; + } + + @VisibleForTesting + public static void overrideCompositorDelegateFactoryForTesting( + PlayerCompositorDelegate.Factory factory) { + sCompositorDelegateFactory = factory; // IN-TEST + } }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsEntry.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsEntry.java index 377635c..28f1182 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsEntry.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsEntry.java
@@ -114,7 +114,7 @@ public void processCapturedTab(PaintPreviewProto response, int status) { // TODO(tgupta): Process a non success status mCompositor = new LongScreenshotsCompositor(new GURL(response.getMetadata().getUrl()), - mContext, mLongScreenshotsTabService, DIR_NAME, response, + mLongScreenshotsTabService, DIR_NAME, response, new Rect(mStartXAxis, mStartYAxis, mEndXAxis, mEndYAxis), this::onBitmapResult); }
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/DEPS b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/DEPS index 1fb67a68..349132e3 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/DEPS +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/DEPS
@@ -1,3 +1,4 @@ include_rules = [ + "+components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player", "+content/public/android/java/src/org/chromium/content_public/browser", ] \ No newline at end of file
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositorTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositorTest.java new file mode 100644 index 0000000..293ccd9 --- /dev/null +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositorTest.java
@@ -0,0 +1,143 @@ +// Copyright 2020 The Chromium 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.share.long_screenshots; + +import static org.junit.Assert.assertEquals; + +import android.graphics.Bitmap; +import android.graphics.Rect; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.base.Callback; +import org.chromium.base.UnguessableToken; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.components.paint_preview.common.proto.PaintPreview.PaintPreviewProto; +import org.chromium.components.paintpreview.browser.NativePaintPreviewServiceProvider; +import org.chromium.components.paintpreview.player.PlayerCompositorDelegate; +import org.chromium.url.GURL; + +/** + * Test for {@link LongScreenshotsCompositor}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +@Features.EnableFeatures(ChromeFeatureList.CHROME_SHARE_LONG_SCREENSHOT) +public class LongScreenshotsCompositorTest { + private TestPlayerCompositorDelegate mCompositorDelegate; + private Bitmap mTestBitmap = Bitmap.createBitmap(512, 1024, Bitmap.Config.ARGB_8888); + private Rect mRect = new Rect(0, 100, 200, 1100); + + @Mock + private GURL mTestGurl; + + @Mock + private NativePaintPreviewServiceProvider mNativePaintPreviewServiceProvider; + + /** + * Implementation of {@link PlayerCompositorDelegate.Factory} for tests. + */ + class TestCompositorDelegateFactory implements PlayerCompositorDelegate.Factory { + @Override + public PlayerCompositorDelegate create(NativePaintPreviewServiceProvider service, GURL url, + String directoryKey, boolean mainFrameMode, + @NonNull PlayerCompositorDelegate.CompositorListener compositorListener, + Callback<Integer> compositorErrorCallback) { + Assert.fail("create shouldn't be called"); + return null; + } + + @Override + public PlayerCompositorDelegate createForProto(NativePaintPreviewServiceProvider service, + @Nullable PaintPreviewProto proto, GURL url, String directoryKey, + boolean mainFrameMode, + @NonNull PlayerCompositorDelegate.CompositorListener compositorListener, + Callback<Integer> compositorErrorCallback) { + return mCompositorDelegate; + } + } + + /** + * Implementation of {@link PlayerCompositorDelegate} for tests. TODO(tgupta): Consider moving + * this into its own class when it starts to get used more. + */ + class TestPlayerCompositorDelegate implements PlayerCompositorDelegate { + @Override + public void addMemoryPressureListener(Runnable runnable) {} + + @Override + public int requestBitmap(UnguessableToken frameGuid, Rect clipRect, float scaleFactor, + Callback<Bitmap> bitmapCallback, Runnable errorCallback) { + Assert.fail("This version of requestBitmap should not be called"); + return 0; + } + + @Override + public int requestBitmap(Rect clipRect, float scaleFactor, Callback<Bitmap> bitmapCallback, + Runnable errorCallback) { + assertEquals(mRect, clipRect); + assertEquals(1f, scaleFactor, 0); + bitmapCallback.onResult(mTestBitmap); + return 1; + } + + @Override + public boolean cancelBitmapRequest(int requestId) { + return false; + } + + @Override + public void cancelAllBitmapRequests() {} + + @Override + public GURL onClick(UnguessableToken frameGuid, int x, int y) { + return null; + } + } + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mCompositorDelegate = new TestPlayerCompositorDelegate(); + LongScreenshotsCompositor.overrideCompositorDelegateFactoryForTesting( + new TestCompositorDelegateFactory()); + } + + @After + public void tearDown() { + LongScreenshotsCompositor.overrideCompositorDelegateFactoryForTesting(null); + } + + @Test + public void testSuccessfullCompositing() { + Callback<Bitmap> onBitmapResult = new Callback<Bitmap>() { + @Override + public void onResult(Bitmap result) { + assertEquals(mTestBitmap, result); + } + }; + + LongScreenshotsCompositor compositor = new LongScreenshotsCompositor(mTestGurl, + mNativePaintPreviewServiceProvider, "test_directory_key", + PaintPreviewProto.getDefaultInstance(), mRect, onBitmapResult); + + // Mimic the service calling onCompositorReady + compositor.onCompositorReady(null, null, null, null, null, null, null); + + // RequestBitmap in mCompositorDelegate should match + } +}
diff --git a/chrome/browser/share/android/test_java_sources.gni b/chrome/browser/share/android/test_java_sources.gni index 7642f46e..1afafd0 100644 --- a/chrome/browser/share/android/test_java_sources.gni +++ b/chrome/browser/share/android/test_java_sources.gni
@@ -18,8 +18,16 @@ share_junit_test_java_sources = [ "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/link_to_text/LinkToTextCoordinatorTest.java", + "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsCompositorTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotCoordinatorTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/NotificationSharedPrefManagerTest.java", "//chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java", ] + +share_junit_test_java_deps = [ + "//chrome/browser/paint_preview/android:java", + "//chrome/browser/paint_preview/android:java", + "//components/paint_preview/common/proto:proto_java", + "//components/paint_preview/player/android:java", +]
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc index 03ab3d0d..7db0265 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor.cc +++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -88,6 +88,11 @@ return chrome::FindBrowserWithWebContents(web_contents) == nullptr; } +bool GuestOptionAvailable() { + return Profile::IsEphemeralGuestProfileEnabled() && + !ProfileManager::GuestProfileExists(); +} + } // namespace ScopedDiceWebSigninInterceptionBubbleHandle:: @@ -239,7 +244,8 @@ Delegate::BubbleParameters bubble_parameters{ SigninInterceptionType::kProfileSwitch, *account_info, GetPrimaryAccountInfo(identity_manager_), - entry->GetProfileThemeColors().profile_highlight_color}; + entry->GetProfileThemeColors().profile_highlight_color, + /*show_guest_option=*/false}; interception_bubble_handle_ = delegate_->ShowSigninInterceptionBubble( web_contents, bubble_parameters, base::BindOnce(&DiceWebSigninInterceptor::OnProfileSwitchChoice, @@ -401,7 +407,8 @@ SkColor profile_color = GenerateNewProfileColor(entry).color; Delegate::BubbleParameters bubble_parameters{ *interception_type, info, GetPrimaryAccountInfo(identity_manager_), - GetAutogeneratedThemeColors(profile_color).frame_color}; + GetAutogeneratedThemeColors(profile_color).frame_color, + GuestOptionAvailable()}; interception_bubble_handle_ = delegate_->ShowSigninInterceptionBubble( web_contents(), bubble_parameters, base::BindOnce(&DiceWebSigninInterceptor::OnProfileCreationChoice,
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.h b/chrome/browser/signin/dice_web_signin_interceptor.h index 42967f5..7c29c17c 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor.h +++ b/chrome/browser/signin/dice_web_signin_interceptor.h
@@ -150,6 +150,7 @@ AccountInfo intercepted_account; AccountInfo primary_account; SkColor profile_highlight_color; + bool show_guest_option; }; virtual ~Delegate() = default;
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java index 6548970..5ea4988 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java
@@ -141,13 +141,14 @@ when(mIdentityManagerNativeMock .findExtendedAccountInfoForAccountWithRefreshTokenByEmailAddress( anyLong(), eq(accountEmail))) - .thenReturn(new AccountInfo( - new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", null)); + .thenReturn(new AccountInfo(new CoreAccountId("gaia-id-test"), accountEmail, + "gaia-id-test", "full name", "given name", null)); mAccountManagerTestRule.addAccount( new ProfileDataSource.ProfileData(accountEmail, null, "Full Name", "Given Name")); - mIdentityManager.onExtendedAccountInfoUpdated(new AccountInfo( - new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", createAvatar())); + mIdentityManager.onExtendedAccountInfoUpdated( + new AccountInfo(new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", + "full name", "given name", createAvatar())); TestThreadUtils.runOnUiThreadBlocking(() -> { checkImageIsScaled(accountEmail); }); mRenderTestRule.render(mImageView, "profile_data_cache_avatar" + mImageSize); }
diff --git a/chrome/browser/ui/android/default_browser_promo/BUILD.gn b/chrome/browser/ui/android/default_browser_promo/BUILD.gn index 186177a..97e4233 100644 --- a/chrome/browser/ui/android/default_browser_promo/BUILD.gn +++ b/chrome/browser/ui/android/default_browser_promo/BUILD.gn
@@ -7,37 +7,22 @@ android_library("java") { sources = [ "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoDeps.java", - "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoDialog.java", "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManager.java", "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoMetrics.java", "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtils.java", ] deps = [ - ":java_resources", "//base:base_java", "//chrome/browser/android/lifecycle:java", "//chrome/browser/flags:java", "//chrome/browser/preferences:java", "//chrome/browser/profiles/android:java", - "//components/browser_ui/widget/android:java", "//third_party/android_deps:androidx_annotation_annotation_java", "//ui/android:ui_full_java", ] resources_package = "org.chromium.chrome.browser.ui.default_browser_promo" } -android_resources("java_resources") { - sources = [ - "java/res/drawable/default_browser_promo_illustration.xml", - "java/res/drawable/ic_illustration_aroundlogo.xml", - ] - deps = [ - "//chrome/browser/ui/android/strings:ui_strings_grd", - "//components/browser_ui/widget/android:java_resources", - "//ui/android:ui_java_resources", - ] -} - java_library("junit") { # Skip platform checks since Robolectric depends on requires_android targets. bypass_platform_checks = true @@ -52,30 +37,3 @@ "//third_party/mockito:mockito_java", ] } - -android_library("javatests") { - testonly = true - - sources = [ "java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManagerTest.java" ] - - deps = [ - ":java", - "//base:base_java", - "//base:base_java_test_support", - "//chrome/browser/android/lifecycle:java", - "//chrome/browser/flags:java", - "//chrome/test/android:chrome_java_test_support", - "//components/browser_ui/widget/android:java", - "//content/public/test/android:content_java_test_support", - "//third_party/android_deps:android_support_v7_appcompat_java", - "//third_party/android_deps:androidx_preference_preference_java", - "//third_party/android_deps:androidx_test_runner_java", - "//third_party/android_deps:espresso_java", - "//third_party/android_support_test_runner:rules_java", - "//third_party/android_support_test_runner:runner_java", - "//third_party/hamcrest:hamcrest_java", - "//third_party/junit:junit", - "//ui/android:ui_full_java", - "//ui/android:ui_java_test_support", - ] -}
diff --git a/chrome/browser/ui/android/default_browser_promo/java/res/drawable/default_browser_promo_illustration.xml b/chrome/browser/ui/android/default_browser_promo/java/res/drawable/default_browser_promo_illustration.xml deleted file mode 100644 index 3d97272..0000000 --- a/chrome/browser/ui/android/default_browser_promo/java/res/drawable/default_browser_promo_illustration.xml +++ /dev/null
@@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2020 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> - -<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:height="122dp" - android:width="127dp" - android:drawable="@drawable/ic_illustration_aroundlogo" /> - <item - android:top="27dp" - android:left="27dp" - android:height="65dp" - android:width="65dp" - android:drawable="@mipmap/app_icon"/> -</layer-list> \ No newline at end of file
diff --git a/chrome/browser/ui/android/default_browser_promo/java/res/drawable/ic_illustration_aroundlogo.xml b/chrome/browser/ui/android/default_browser_promo/java/res/drawable/ic_illustration_aroundlogo.xml deleted file mode 100644 index 96a28f2..0000000 --- a/chrome/browser/ui/android/default_browser_promo/java/res/drawable/ic_illustration_aroundlogo.xml +++ /dev/null
@@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2020 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. --> - -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="127dp" - android:height="122dp" - android:viewportWidth="127" - android:viewportHeight="122"> - <path - android:pathData="M2,58.06C2,26.617 27.49,1.128 58.932,1.128C65.829,1.12 72.67,2.368 79.12,4.811" - android:strokeLineJoin="round" - android:strokeWidth="1.73" - android:fillColor="#00000000" - android:strokeColor="#DB4437" - android:strokeLineCap="round"/> - <path - android:pathData="M93.194,103.533C83.329,110.988 71.297,115.012 58.932,114.992" - android:strokeLineJoin="round" - android:strokeWidth="1.73" - android:fillColor="#00000000" - android:strokeColor="#DB4437" - android:strokeLineCap="round"/> - <path - android:pathData="M84.192,7.024C102.961,16.332 115.864,35.689 115.864,58.06C115.874,65.775 114.311,73.411 111.27,80.501C108.23,87.592 103.777,93.988 98.182,99.3" - android:strokeLineJoin="round" - android:strokeWidth="1.73" - android:fillColor="#00000000" - android:strokeColor="#4285F4" - android:strokeLineCap="round"/> - <path - android:pathData="M93.776,103.088C83.81,110.823 71.548,115.012 58.932,114.992C29.707,114.992 5.624,92.971 2.373,64.616" - android:strokeLineJoin="round" - android:strokeWidth="1.73" - android:fillColor="#00000000" - android:strokeColor="#00A152" - android:strokeLineCap="round"/> - <path - android:pathData="M25.774,22.798C31.793,22.798 36.672,17.918 36.672,11.899C36.672,5.88 31.793,1 25.774,1C19.754,1 14.875,5.88 14.875,11.899C14.875,17.918 19.754,22.798 25.774,22.798Z" - android:fillColor="#DB4437"/> - <path - android:pathData="M31.614,16.335C32.44,15.247 32.947,13.95 33.076,12.59C33.205,11.23 32.951,9.861 32.344,8.638C31.737,7.414 30.8,6.384 29.639,5.664C28.479,4.944 27.14,4.563 25.774,4.563C24.407,4.563 23.069,4.944 21.908,5.664C20.747,6.384 19.81,7.414 19.203,8.638C18.596,9.861 18.342,11.23 18.471,12.59C18.6,13.95 19.107,15.247 19.933,16.335H31.614Z" - android:strokeLineJoin="round" - android:strokeWidth="1.211" - android:fillColor="#00000000" - android:strokeColor="#ffffff" - android:strokeLineCap="round"/> - <path - android:pathData="M115.869,65.883C121.889,65.883 126.768,61.004 126.768,54.985C126.768,48.965 121.889,44.086 115.869,44.086C109.85,44.086 104.97,48.965 104.97,54.985C104.97,61.004 109.85,65.883 115.869,65.883Z" - android:fillColor="#4285F4"/> - <path - android:pathData="M36.74,121.376C42.759,121.376 47.639,116.497 47.639,110.477C47.639,104.458 42.759,99.579 36.74,99.579C30.721,99.579 25.841,104.458 25.841,110.477C25.841,116.497 30.721,121.376 36.74,121.376Z" - android:fillColor="#00A152"/> - <path - android:pathData="M108.932,55.708L113.537,60.312L123.114,50.735" - android:strokeLineJoin="round" - android:strokeWidth="1.211" - android:fillColor="#00000000" - android:strokeColor="#ffffff" - android:strokeLineCap="round"/> - <path - android:pathData="M40.923,108.56H31.923V116.06H40.923V108.56Z" - android:fillColor="#ffffff"/> - <path - android:pathData="M33.423,110.06V107.06C33.423,106.265 33.739,105.502 34.301,104.939C34.864,104.376 35.627,104.06 36.423,104.06C37.218,104.06 37.981,104.376 38.544,104.939C39.107,105.502 39.423,106.265 39.423,107.06V110.06" - android:strokeLineJoin="round" - android:strokeWidth="1.211" - android:fillColor="#00000000" - android:strokeColor="#ffffff" - android:strokeLineCap="round"/> - <path - android:pathData="M26.966,13.317C26.98,13.297 26.993,13.277 27.006,13.256C27.02,13.236 27.034,13.217 27.046,13.196C27.06,13.176 27.074,13.156 27.086,13.136C27.1,13.116 27.114,13.096 27.127,13.076C27.14,13.056 27.154,13.036 27.167,13.016C27.181,12.996 27.194,12.976 27.207,12.955C27.221,12.935 27.234,12.915 27.247,12.895C27.261,12.875 27.274,12.855 27.287,12.835C27.301,12.815 27.315,12.795 27.327,12.774C27.341,12.755 27.355,12.735 27.367,12.714C27.381,12.694 27.395,12.675 27.407,12.654C27.421,12.634 27.435,12.614 27.448,12.594C27.462,12.574 27.475,12.554 27.488,12.534C27.502,12.514 27.515,12.494 27.528,12.473C27.542,12.454 27.555,12.434 27.568,12.413C27.582,12.393 27.596,12.373 27.608,12.353C27.622,12.333 27.636,12.313 27.648,12.293C27.662,12.273 27.676,12.253 27.688,12.233C27.702,12.213 27.716,12.193 27.729,12.172C27.743,12.153 27.756,12.132 27.769,12.112C27.783,12.092 27.796,12.072 27.809,12.052C27.823,12.032 27.836,12.012 27.849,11.992C27.863,11.972 27.877,11.952 27.889,11.931C27.903,11.912 27.917,11.892 27.929,11.871C27.943,11.851 27.957,11.831 27.969,11.811C27.984,11.791 27.997,11.771 28.01,11.751C28.024,11.731 28.037,11.711 28.05,11.69C28.064,11.671 28.077,11.651 28.09,11.63C28.104,11.611 28.117,11.59 28.13,11.57C28.144,11.55 28.158,11.53 28.17,11.51C28.184,11.49 28.198,11.47 28.21,11.45C28.225,11.43 28.238,11.41 28.25,11.389C28.265,11.37 28.278,11.35 28.291,11.329C28.305,11.309 28.318,11.289 28.331,11.269C28.345,11.249 28.358,11.229 28.371,11.209C28.385,11.189 28.399,11.169 28.411,11.148C28.425,11.129 28.439,11.109 28.451,11.088C28.465,11.069 28.479,11.049 28.491,11.028C28.506,11.008 28.519,10.988 28.531,10.968C28.546,10.948 28.559,10.928 28.572,10.908C28.586,10.888 28.599,10.868 28.612,10.847C28.626,10.828 28.639,10.807 28.652,10.787C28.666,10.767 28.68,10.747 28.692,10.727C28.706,10.707 28.72,10.687 28.732,10.667C28.747,10.647 28.76,10.627 28.772,10.606C28.787,10.587 28.8,10.567 28.812,10.546C28.827,10.526 28.84,10.507 28.852,10.486C28.882,10.442 28.911,10.398 28.939,10.354C28.951,10.337 28.962,10.32 28.972,10.303C28.987,10.283 29,10.263 29.013,10.243C29.027,10.223 29.04,10.203 29.053,10.182C29.067,10.163 29.08,10.143 29.093,10.122C29.107,10.103 29.121,10.083 29.133,10.062C29.147,10.042 29.161,10.022 29.173,10.002C29.188,9.982 29.201,9.962 29.213,9.941C29.228,9.922 29.241,9.902 29.253,9.881C29.268,9.862 29.281,9.842 29.293,9.821C29.308,9.802 29.322,9.782 29.334,9.761C29.348,9.742 29.362,9.721 29.374,9.701C29.388,9.681 29.402,9.661 29.414,9.64C29.429,9.621 29.442,9.601 29.454,9.58C29.469,9.561 29.482,9.541 29.494,9.52C29.509,9.501 29.522,9.481 29.534,9.46C29.549,9.441 29.563,9.42 29.574,9.399C29.589,9.38 29.603,9.36 29.615,9.339C29.629,9.32 29.643,9.3 29.655,9.279C29.67,9.26 29.683,9.24 29.695,9.219C29.71,9.2 29.723,9.18 29.735,9.158C29.75,9.14 29.764,9.12 29.775,9.098C29.79,9.079 29.804,9.059 29.815,9.038C29.83,9.019 29.844,8.999 29.855,8.978C29.871,8.959 29.884,8.939 29.896,8.918C29.911,8.899 29.924,8.879 29.936,8.857C29.951,8.839 29.965,8.819 29.976,8.797C29.991,8.779 30.005,8.758 30.016,8.737C30.032,8.718 30.045,8.698 30.056,8.677C30.072,8.658 30.085,8.638 30.096,8.616C30.112,8.598 30.126,8.578 30.136,8.556C30.152,8.538 30.166,8.518 30.177,8.496C30.193,8.478 30.206,8.458 30.217,8.436C30.233,8.418 30.247,8.398 30.257,8.376C30.273,8.358 30.287,8.337 30.297,8.315C30.334,8.277 30.354,8.225 30.354,8.172C30.354,8.119 30.332,8.068 30.294,8.03C30.257,7.992 30.206,7.971 30.152,7.97C30.099,7.97 30.047,7.99 30.009,8.028C29.987,8.037 29.966,8.051 29.949,8.068C29.927,8.078 29.906,8.091 29.889,8.108C29.867,8.118 29.846,8.132 29.828,8.148C29.806,8.158 29.786,8.172 29.768,8.188C29.746,8.199 29.726,8.212 29.708,8.228C29.686,8.239 29.666,8.252 29.648,8.268C29.626,8.279 29.606,8.293 29.587,8.308C29.566,8.319 29.546,8.333 29.527,8.349C29.506,8.36 29.486,8.373 29.467,8.389C29.446,8.4 29.425,8.413 29.407,8.429C29.385,8.44 29.365,8.454 29.347,8.469C29.325,8.48 29.305,8.494 29.286,8.509C29.265,8.521 29.245,8.534 29.226,8.549C29.205,8.561 29.185,8.574 29.166,8.589C29.145,8.601 29.125,8.614 29.106,8.63C29.084,8.641 29.064,8.655 29.045,8.67C29.024,8.681 29.004,8.695 28.985,8.71C28.964,8.722 28.944,8.735 28.925,8.75C28.904,8.762 28.884,8.775 28.865,8.79C28.824,8.817 28.784,8.844 28.744,8.87C28.723,8.882 28.703,8.896 28.684,8.91C28.663,8.922 28.643,8.936 28.624,8.951C28.603,8.963 28.583,8.976 28.564,8.991C28.543,9.003 28.523,9.016 28.503,9.031C28.463,9.058 28.423,9.084 28.383,9.111C28.362,9.123 28.342,9.137 28.323,9.151C28.283,9.178 28.242,9.205 28.202,9.232C28.181,9.244 28.161,9.257 28.142,9.272C28.102,9.299 28.062,9.325 28.021,9.352C28.004,9.362 27.987,9.373 27.97,9.385C27.945,9.399 27.921,9.415 27.899,9.432C27.878,9.444 27.858,9.457 27.838,9.472C27.818,9.484 27.798,9.498 27.778,9.512C27.758,9.524 27.738,9.538 27.718,9.552C27.697,9.564 27.677,9.578 27.658,9.592C27.637,9.605 27.617,9.618 27.598,9.632C27.577,9.645 27.557,9.658 27.537,9.673C27.517,9.685 27.497,9.698 27.477,9.713C27.457,9.725 27.437,9.739 27.417,9.753C27.396,9.765 27.376,9.779 27.357,9.793C27.336,9.805 27.316,9.819 27.296,9.833C27.276,9.846 27.256,9.859 27.236,9.873C27.216,9.886 27.196,9.899 27.176,9.913C27.156,9.926 27.135,9.939 27.116,9.954C27.095,9.966 27.075,9.979 27.056,9.994C27.035,10.006 27.015,10.019 26.995,10.034C26.975,10.046 26.955,10.06 26.935,10.074C26.914,10.086 26.895,10.1 26.875,10.114C26.854,10.127 26.834,10.14 26.815,10.154C26.794,10.167 26.774,10.18 26.754,10.194C26.734,10.207 26.714,10.22 26.694,10.234C26.674,10.247 26.654,10.26 26.634,10.274C26.614,10.287 26.594,10.301 26.574,10.315C26.553,10.327 26.533,10.341 26.513,10.355C26.493,10.368 26.473,10.381 26.453,10.395C26.433,10.408 26.413,10.421 26.393,10.435C26.372,10.448 26.353,10.461 26.333,10.475C26.312,10.488 26.292,10.501 26.273,10.515C26.252,10.528 26.232,10.541 26.212,10.556C26.192,10.568 26.172,10.582 26.152,10.596C26.132,10.608 26.112,10.622 26.092,10.636C26.071,10.649 26.051,10.662 26.032,10.676C26.011,10.689 25.991,10.702 25.971,10.716C25.951,10.729 25.931,10.742 25.911,10.756C25.891,10.769 25.871,10.782 25.851,10.796C25.83,10.809 25.81,10.823 25.791,10.837C25.77,10.849 25.75,10.863 25.73,10.877C25.71,10.889 25.69,10.903 25.67,10.917C25.65,10.929 25.63,10.943 25.61,10.957C25.59,10.97 25.57,10.983 25.55,10.997C25.529,11.01 25.509,11.023 25.49,11.037C25.469,11.05 25.449,11.063 25.429,11.077C25.409,11.09 25.389,11.104 25.369,11.118C25.349,11.13 25.329,11.144 25.309,11.158C25.288,11.17 25.268,11.184 25.249,11.198C25.228,11.21 25.208,11.224 25.188,11.238C25.168,11.251 25.148,11.264 25.128,11.278C25.108,11.291 25.088,11.304 25.068,11.318C25.048,11.331 25.028,11.344 25.008,11.358C24.826,11.471 24.672,11.624 24.557,11.805C24.442,11.986 24.37,12.191 24.346,12.403C24.321,12.616 24.345,12.832 24.415,13.034C24.486,13.236 24.601,13.42 24.753,13.572C24.904,13.723 25.088,13.839 25.29,13.909C25.493,13.979 25.708,14.003 25.921,13.979C26.134,13.954 26.338,13.882 26.519,13.767C26.7,13.653 26.853,13.498 26.966,13.317H26.966Z" - android:fillColor="#ffffff"/> -</vector>
diff --git a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoDialog.java b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoDialog.java deleted file mode 100644 index 04ccffb..0000000 --- a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoDialog.java +++ /dev/null
@@ -1,123 +0,0 @@ -// Copyright 2020 The Chromium 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.ui.default_browser_promo; - -import android.app.Activity; -import android.content.DialogInterface; -import android.view.View; - -import androidx.annotation.IntDef; -import androidx.annotation.VisibleForTesting; - -import org.chromium.base.BuildInfo; -import org.chromium.components.browser_ui.widget.PromoDialog; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * The promo dialog guiding how to set Chrome as the default browser. - */ -public class DefaultBrowserPromoDialog extends PromoDialog { - @IntDef({DialogStyle.ROLE_MANAGER, DialogStyle.DISAMBIGUATION_SHEET, - DialogStyle.SYSTEM_SETTINGS}) - @Retention(RetentionPolicy.SOURCE) - public @interface DialogStyle { - int ROLE_MANAGER = 0; - int DISAMBIGUATION_SHEET = 1; - int SYSTEM_SETTINGS = 2; - } - - private final int mDialogStyle; - private final Runnable mOnOK; - private Runnable mOnCancel; - - /** - * Building a {@link DefaultBrowserPromoDialog}. - * @param activity The activity to display dialog. - * @param dialogStyle The type of dialog. - * @param onOK The {@link Runnable} on user's agreeing to change default. - * @param onCancel The {@link Runnable} on user's refusing or dismissing the dialog. - * @return - */ - public static DefaultBrowserPromoDialog createDialog( - Activity activity, @DialogStyle int dialogStyle, Runnable onOK, Runnable onCancel) { - return new DefaultBrowserPromoDialog(activity, dialogStyle, onOK, onCancel); - } - - private DefaultBrowserPromoDialog( - Activity activity, @DialogStyle int style, Runnable onOK, Runnable onCancel) { - super(activity); - mDialogStyle = style; - mOnOK = onOK; - mOnCancel = onCancel; - setOnDismissListener(this); - } - - @Override - @VisibleForTesting - public DialogParams getDialogParams() { - DialogParams params = new DialogParams(); - - Activity activity = getOwnerActivity(); - assert activity != null; - - String appName = BuildInfo.getInstance().hostPackageLabel; - params.vectorDrawableResource = R.drawable.default_browser_promo_illustration; - params.headerCharSequence = - activity.getString(R.string.default_browser_promo_dialog_title, appName); - String desc = - activity.getString(R.string.default_browser_promo_dialog_desc, appName) + "\n\n"; - String steps; - String primaryButtonText; - if (mDialogStyle == DialogStyle.ROLE_MANAGER) { - steps = activity.getString( - R.string.default_browser_promo_dialog_role_manager_steps, appName); - primaryButtonText = activity.getString( - R.string.default_browser_promo_dialog_choose_chrome_button, appName); - } else if (mDialogStyle == DialogStyle.DISAMBIGUATION_SHEET) { - steps = activity.getString( - R.string.default_browser_promo_dialog_disambiguation_sheet_steps, appName); - primaryButtonText = activity.getString( - R.string.default_browser_promo_dialog_choose_chrome_button, appName); - } else { - assert mDialogStyle == DialogStyle.SYSTEM_SETTINGS; - steps = activity.getString( - R.string.default_browser_promo_dialog_system_settings_steps, appName); - primaryButtonText = - activity.getString(R.string.default_browser_promo_dialog_go_to_settings_button); - } - params.subheaderCharSequence = desc + steps; - params.primaryButtonCharSequence = primaryButtonText; - params.secondaryButtonStringResource = R.string.no_thanks; - return params; - } - - @Override - public void onDismiss(DialogInterface dialog) { - // Can be dismissed by pressing the back button. - if (mOnCancel != null) mOnCancel.run(); - } - - @Override - public void onClick(View view) { - super.onClick(view); - int id = view.getId(); - if (id == R.id.button_primary) { - mOnCancel = null; - mOnOK.run(); - dismiss(); - } else if (id == R.id.button_secondary) { - if (mOnCancel != null) mOnCancel.run(); - mOnCancel = null; - dismiss(); - } - } - - @VisibleForTesting - public int getDialogStyleForTesting() { - return mDialogStyle; - } -}
diff --git a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManager.java b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManager.java index 9deb0e83..4ea00df7 100644 --- a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManager.java +++ b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManager.java
@@ -10,11 +10,6 @@ import android.content.Context; import android.content.Intent; -import androidx.annotation.VisibleForTesting; - -import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoDialog.DialogStyle; -import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoMetrics.UIDismissalReason; import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils.DefaultBrowserState; import org.chromium.ui.base.WindowAndroid; @@ -23,13 +18,9 @@ * trigger dialogs. */ public class DefaultBrowserPromoManager { - private static final String SKIP_PRIMER_PARAM = "skip_primer"; - static final String P_NO_DEFAULT_PROMO_STRATEGY = "p_no_default_promo"; - private final Activity mActivity; - private DefaultBrowserPromoDialog mDialog; - private @DefaultBrowserState int mCurrentState; - private WindowAndroid mWindowAndroid; + private final @DefaultBrowserState int mCurrentState; + private final WindowAndroid mWindowAndroid; /** * @param activity Activity to show promo dialogs. @@ -45,43 +36,14 @@ @SuppressLint({"WrongConstant", "NewApi"}) void promoByRoleManager() { - boolean shouldSkipPrimer = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( - ChromeFeatureList.ANDROID_DEFAULT_BROWSER_PROMO, SKIP_PRIMER_PARAM, false); - Runnable onOK = () -> { - RoleManager roleManager = - (RoleManager) mActivity.getSystemService(Context.ROLE_SERVICE); + RoleManager roleManager = (RoleManager) mActivity.getSystemService(Context.ROLE_SERVICE); - DefaultBrowserPromoMetrics.recordRoleManagerShow(mCurrentState); - if (!shouldSkipPrimer) { - DefaultBrowserPromoMetrics.recordUiDismissalReason( - mCurrentState, UIDismissalReason.CHANGE_DEFAULT); - } + DefaultBrowserPromoMetrics.recordRoleManagerShow(mCurrentState); - Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_BROWSER); - mWindowAndroid.showCancelableIntent(intent, (window, resultCode, data) -> { - DefaultBrowserPromoMetrics.recordOutcome(mCurrentState, - DefaultBrowserPromoDeps.getInstance().getCurrentDefaultBrowserState()); - }, null); - }; - if (shouldSkipPrimer) { - onOK.run(); - } else { - showDialog(DefaultBrowserPromoDialog.DialogStyle.ROLE_MANAGER, onOK); - } - } - - private void showDialog(@DialogStyle int style, Runnable okCallback) { - mDialog = DefaultBrowserPromoDialog.createDialog(mActivity, style, okCallback, () -> { - DefaultBrowserPromoMetrics.recordUiDismissalReason( - mCurrentState, UIDismissalReason.NO_THANKS); - }); - - DefaultBrowserPromoMetrics.recordDialogShow(mCurrentState); - mDialog.show(); - } - - @VisibleForTesting - DefaultBrowserPromoDialog getDialogForTesting() { - return mDialog; + Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_BROWSER); + mWindowAndroid.showCancelableIntent(intent, (window, resultCode, data) -> { + DefaultBrowserPromoMetrics.recordOutcome(mCurrentState, + DefaultBrowserPromoDeps.getInstance().getCurrentDefaultBrowserState()); + }, null); } }
diff --git a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManagerTest.java b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManagerTest.java deleted file mode 100644 index 24a29b00..0000000 --- a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoManagerTest.java +++ /dev/null
@@ -1,102 +0,0 @@ -// Copyright 2020 The Chromium 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.ui.default_browser_promo; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withId; - -import android.app.Activity; - -import androidx.test.filters.MediumTest; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.chromium.base.BuildInfo; -import org.chromium.base.FeatureList; -import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils.DefaultBrowserState; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.components.browser_ui.widget.PromoDialog; -import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.ui.base.WindowAndroid; -import org.chromium.ui.test.util.DummyUiActivityTestCase; - -import java.util.Collections; - -/** - * Instrument test for {@link DefaultBrowserPromoManager}. - */ -@RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class DefaultBrowserPromoManagerTest extends DummyUiActivityTestCase { - private DefaultBrowserPromoManager mManager; - private Activity mActivity; - private String mAppName; - private WindowAndroid mWindowAndroid; - - @Override - public void setUpTest() throws Exception { - super.setUpTest(); - mActivity = getActivity(); - mWindowAndroid = TestThreadUtils.runOnUiThreadBlocking(() -> new WindowAndroid(mActivity)); - mManager = new DefaultBrowserPromoManager( - mActivity, mWindowAndroid, DefaultBrowserState.NO_DEFAULT); - mAppName = BuildInfo.getInstance().hostPackageLabel; - // Enabling feature can assign a default value to the fieldtrial param. - FeatureList.setTestFeatures(Collections.EMPTY_MAP); - } - - @Override - public void tearDownTest() throws Exception { - TestThreadUtils.runOnUiThreadBlocking(mWindowAndroid::destroy); - super.tearDownTest(); - } - - @Test - @MediumTest - public void testPromoByRoleManager() { - TestThreadUtils.runOnUiThreadBlocking(() -> { mManager.promoByRoleManager(); }); - DefaultBrowserPromoDialog dialog = mManager.getDialogForTesting(); - Assert.assertEquals("Dialog should be of role manager style on Q+", - dialog.getDialogStyleForTesting(), - DefaultBrowserPromoDialog.DialogStyle.ROLE_MANAGER); - - // test role manager style - PromoDialog.DialogParams params = dialog.getDialogParams(); - Assert.assertEquals( - mActivity.getString(R.string.default_browser_promo_dialog_title, mAppName), - params.headerCharSequence); - - Assert.assertEquals( - mActivity.getString(R.string.default_browser_promo_dialog_desc, mAppName) + "\n\n" - + mActivity.getString( - R.string.default_browser_promo_dialog_role_manager_steps, mAppName), - params.subheaderCharSequence); - - Assert.assertEquals( - mActivity.getString( - R.string.default_browser_promo_dialog_choose_chrome_button, mAppName), - params.primaryButtonCharSequence); - - checkDialogVisibility(); - } - - private void checkDialogVisibility() { - onView(withId(R.id.promo_dialog_layout)).check(matches(isDisplayed())); - // dismiss the dialog - onView(withId(R.id.button_secondary)).perform(click()); - onView(withId(R.id.promo_dialog_layout)).check((v, noMatchingViewException) -> { - Assert.assertNotNull("Promo dialog should be dismissed by clicking on secondary button", - noMatchingViewException); - }); - } -}
diff --git a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoMetrics.java b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoMetrics.java index f1d64216..66f21b9 100644 --- a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoMetrics.java +++ b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoMetrics.java
@@ -4,55 +4,13 @@ package org.chromium.chrome.browser.ui.default_browser_promo; -import androidx.annotation.IntDef; - import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils.DefaultBrowserState; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - /** * Helper class to record histograms related to the default browser promo. */ class DefaultBrowserPromoMetrics { - @IntDef({UIDismissalReason.CHANGE_DEFAULT, UIDismissalReason.NO_THANKS}) - @Retention(RetentionPolicy.SOURCE) - public @interface UIDismissalReason { - int CHANGE_DEFAULT = 0; - int NO_THANKS = 1; - int NUM_ENTRIES = 2; - } - - /** - * Record the reason why the promo dialog is dismissed. - * @param currentState The {@link DefaultBrowserState} when the dialog is shown. - * @param reason The {@link UIDismissalReason} indicating the dismissal reason. - */ - static void recordUiDismissalReason( - @DefaultBrowserState int currentState, @UIDismissalReason int reason) { - assert currentState != DefaultBrowserState.CHROME_DEFAULT; - if (currentState == DefaultBrowserState.NO_DEFAULT) { - RecordHistogram.recordEnumeratedHistogram( - "Android.DefaultBrowserPromo.UIDismissalReason.NoDefault", reason, - UIDismissalReason.NUM_ENTRIES); - } else { - RecordHistogram.recordEnumeratedHistogram( - "Android.DefaultBrowserPromo.UIDismissalReason.OtherDefault", reason, - UIDismissalReason.NUM_ENTRIES); - } - } - - /** - * Record {@link DefaultBrowserState} when the dialog shown. - * @param currentState The {@link DefaultBrowserState} when the dialog is shown. - */ - static void recordDialogShow(@DefaultBrowserState int currentState) { - assert currentState != DefaultBrowserState.CHROME_DEFAULT; - RecordHistogram.recordEnumeratedHistogram("Android.DefaultBrowserPromo.DialogShown", - currentState, DefaultBrowserState.NUM_ENTRIES); - } - /** * Record {@link DefaultBrowserState} when role manager dialog is shown. * @param currentState The {@link DefaultBrowserState} when the dialog is shown.
diff --git a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtils.java b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtils.java index 072e2e0..846a54b1 100644 --- a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtils.java +++ b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtils.java
@@ -9,7 +9,6 @@ import androidx.annotation.IntDef; -import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; @@ -36,20 +35,6 @@ int NUM_ENTRIES = 3; } - @IntDef({DefaultBrowserPromoAction.SYSTEM_SETTINGS, - DefaultBrowserPromoAction.DISAMBIGUATION_SHEET, DefaultBrowserPromoAction.ROLE_MANAGER, - DefaultBrowserPromoAction.NO_ACTION}) - @Retention(RetentionPolicy.SOURCE) - public @interface DefaultBrowserPromoAction { - int SYSTEM_SETTINGS = 0; - int DISAMBIGUATION_SHEET = 1; - int ROLE_MANAGER = 2; - int NO_ACTION = 3; - } - - private static final String DISAMBIGUATION_SHEET_PROMOED_KEY_PREFIX = - "disambiguation_sheet_promoed."; - /** * Determine whether a promo dialog should be displayed or not. And prepare related logic to * launch promo if a promo dialog has been decided to display. @@ -61,8 +46,7 @@ public static boolean prepareLaunchPromoIfNeeded( Activity activity, WindowAndroid windowAndroid) { DefaultBrowserPromoDeps deps = DefaultBrowserPromoDeps.getInstance(); - int action = decideNextAction(deps, activity); - if (action == DefaultBrowserPromoAction.NO_ACTION) return false; + if (!shouldShowPromo(deps, activity)) return false; deps.incrementPromoCount(); deps.recordPromoTime(); DefaultBrowserPromoManager manager = new DefaultBrowserPromoManager( @@ -72,8 +56,8 @@ } /** - * This decides in which way and style the dialog should be promoed. - * Returns No Action if any of following criteria is met: + * This decides whether the dialog should be promoed. + * Returns false if any of following criteria is met: * 1. A promo dialog has been displayed before. * 2. Not enough sessions have been started before. * 3. Any chrome, including pre-stable, has been set as default. @@ -83,53 +67,32 @@ * 6. A browser other than chrome channel is default and default app setting is not * available in the current system. */ - @DefaultBrowserPromoAction - static int decideNextAction(DefaultBrowserPromoDeps deps, Activity activity) { - if (!deps.isFeatureEnabled()) { - return DefaultBrowserPromoAction.NO_ACTION; + static boolean shouldShowPromo(DefaultBrowserPromoDeps deps, Activity activity) { + if (!deps.isFeatureEnabled() || !deps.isRoleAvailable(activity)) { + return false; } - if (!deps.isRoleAvailable(activity)) { - return DefaultBrowserPromoAction.NO_ACTION; - } - // Criteria 1 - if (deps.getPromoCount() >= deps.getMaxPromoCount()) { - return DefaultBrowserPromoAction.NO_ACTION; - } - // Criteria 2 - if (deps.getSessionCount() < deps.getMinSessionCount()) { - return DefaultBrowserPromoAction.NO_ACTION; - } - // Criteria 5 - if (deps.getLastPromoInterval() < deps.getMinPromoInterval()) { - return DefaultBrowserPromoAction.NO_ACTION; + // Criteria 1, 2, 5 + if (deps.getPromoCount() >= deps.getMaxPromoCount() + || deps.getSessionCount() < deps.getMinSessionCount() + || deps.getLastPromoInterval() < deps.getMinPromoInterval()) { + return false; } ResolveInfo info = deps.getDefaultWebBrowserActivityResolveInfo(); if (info == null) { - return DefaultBrowserPromoAction.NO_ACTION; + return false; } int state = deps.getCurrentDefaultBrowserState(info); - int action = DefaultBrowserPromoAction.NO_ACTION; if (state == DefaultBrowserState.CHROME_DEFAULT) { - action = DefaultBrowserPromoAction.NO_ACTION; + return false; } else if (state == DefaultBrowserState.NO_DEFAULT) { // Criteria 4 - if (deps.isChromeStable() && deps.isChromePreStableInstalled()) { - action = DefaultBrowserPromoAction.NO_ACTION; - } else { - action = DefaultBrowserPromoAction.ROLE_MANAGER; - } + return !deps.isChromeStable() || !deps.isChromePreStableInstalled(); } else { // other default // Criteria 3 - if (deps.isCurrentDefaultBrowserChrome(info)) { - action = DefaultBrowserPromoAction.NO_ACTION; - } else { - action = DefaultBrowserPromoAction.ROLE_MANAGER; - } + return !deps.isCurrentDefaultBrowserChrome(info); } - - return action; } /** @@ -140,28 +103,4 @@ SharedPreferencesManager.getInstance().incrementInt( ChromePreferenceKeys.DEFAULT_BROWSER_PROMO_SESSION_COUNT); } - - /** - * Check the result of default browser promo on start up if the default browser promo dialog is - * displayed in this session or last session and the result has not been recorded yet. - */ - public static void maybeRecordOutcomeOnStart() { - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_DEFAULT_BROWSER_PROMO)) return; - if (!SharedPreferencesManager.getInstance().readBoolean( - ChromePreferenceKeys.DEFAULT_BROWSER_PROMO_PROMOED_BY_SYSTEM_SETTINGS, false)) { - return; - } - int previousState = SharedPreferencesManager.getInstance().readInt( - ChromePreferenceKeys.DEFAULT_BROWSER_PROMO_LAST_DEFAULT_STATE); - DefaultBrowserPromoMetrics.recordOutcome(previousState, - DefaultBrowserPromoDeps.getInstance().getCurrentDefaultBrowserState()); - // reset - SharedPreferencesManager.getInstance().writeBoolean( - ChromePreferenceKeys.DEFAULT_BROWSER_PROMO_PROMOED_BY_SYSTEM_SETTINGS, false); - } - - static String getDisambiguationSheetPromoedKey() { - return DISAMBIGUATION_SHEET_PROMOED_KEY_PREFIX - + ContextUtils.getApplicationContext().getPackageName(); - } }
diff --git a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtilsTest.java b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtilsTest.java index 40dd403..ee59d36 100644 --- a/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtilsTest.java +++ b/chrome/browser/ui/android/default_browser_promo/java/src/org/chromium/chrome/browser/ui/default_browser_promo/DefaultBrowserPromoUtilsTest.java
@@ -25,7 +25,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.PackageManagerUtils; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils.DefaultBrowserPromoAction; import org.chromium.chrome.browser.ui.default_browser_promo.DefaultBrowserPromoUtils.DefaultBrowserState; import java.util.ArrayList; @@ -117,9 +116,8 @@ @Test public void testBasicPromo() { setDepsMockWithDefaultValues(); - Assert.assertEquals("Should promo disambiguation sheet on Q.", - DefaultBrowserPromoAction.ROLE_MANAGER, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertTrue("Should promo disambiguation sheet on Q.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } // --- Q above --- @@ -127,9 +125,8 @@ public void testPromo_Q_No_Default() { setDepsMockWithDefaultValues(); when(mDeps.isRoleAvailable(any())).thenReturn(true); - Assert.assertEquals("Should promo role manager when there is no default browser on Q+.", - DefaultBrowserPromoAction.ROLE_MANAGER, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertTrue("Should promo role manager when there is no default browser on Q+.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test @@ -138,10 +135,8 @@ when(mDeps.isRoleAvailable(any())).thenReturn(true); when(mDeps.getDefaultWebBrowserActivityResolveInfo()) .thenReturn(createResolveInfo("android", 1)); - Assert.assertEquals( - "Should promo role manager when there is another default browser on Q+.", - DefaultBrowserPromoAction.ROLE_MANAGER, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertTrue("Should promo role manager when there is another default browser on Q+.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } // --- P below --- @@ -150,10 +145,9 @@ setDepsMockWithDefaultValues(); when(mDeps.getSDKInt()).thenReturn(Build.VERSION_CODES.P); when(mDeps.isRoleAvailable(any())).thenCallRealMethod(); - Assert.assertEquals( + Assert.assertFalse( "Should promo system settings when there is another default browser on P-.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } // --- prerequisites --- @@ -162,9 +156,8 @@ setDepsMockWithDefaultValues(); when(mDeps.getMaxPromoCount()).thenReturn(100); when(mDeps.getPromoCount()).thenReturn(99); - Assert.assertNotEquals("Should promo when promo count does not reach the upper limit.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertTrue("Should promo when promo count does not reach the upper limit.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test @@ -172,18 +165,16 @@ setDepsMockWithDefaultValues(); when(mDeps.getPromoCount()).thenReturn(1); when(mDeps.getMaxPromoCount()).thenReturn(1); - Assert.assertEquals("Should not promo when promo count reaches the upper limit.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertFalse("Should not promo when promo count reaches the upper limit.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test public void testNoPromo_featureDisabled() { setDepsMockWithDefaultValues(); when(mDeps.isFeatureEnabled()).thenReturn(false); - Assert.assertEquals("Should not promo when the fearure is disabled.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertFalse("Should not promo when the fearure is disabled.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test @@ -191,10 +182,9 @@ setDepsMockWithDefaultValues(); when(mDeps.getSessionCount()).thenReturn(1); when(mDeps.getMinSessionCount()).thenReturn(3); - Assert.assertEquals( + Assert.assertFalse( "Should not promo when session count has not reached the required amount.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test @@ -204,10 +194,8 @@ .thenReturn( createResolveInfo(DefaultBrowserPromoDeps.CHROME_STABLE_PACKAGE_NAME, 1)); when(mDeps.isCurrentDefaultBrowserChrome(any())).thenCallRealMethod(); - Assert.assertEquals( - "Should not promo when another chrome channel browser has been default.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertFalse("Should not promo when another chrome channel browser has been default.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test @@ -216,18 +204,16 @@ when(mDeps.getDefaultWebBrowserActivityResolveInfo()) .thenReturn(createResolveInfo( ContextUtils.getApplicationContext().getPackageName(), 1)); - Assert.assertEquals("Should not promo when chrome has been default.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertFalse("Should not promo when chrome has been default.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } @Test public void testNoPromo_webBrowserActivityNotExist() { setDepsMockWithDefaultValues(); when(mDeps.getDefaultWebBrowserActivityResolveInfo()).thenReturn(null); - Assert.assertEquals("Should not promo when web browser activity does not exist.", - DefaultBrowserPromoAction.NO_ACTION, - DefaultBrowserPromoUtils.decideNextAction(mDeps, null)); + Assert.assertFalse("Should not promo when web browser activity does not exist.", + DefaultBrowserPromoUtils.shouldShowPromo(mDeps, null)); } private void setDepsMockWithDefaultValues() {
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 82d307b..c7da0af 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4286,31 +4286,6 @@ Viewing live page </message> - <!-- Default Browser Promo Strings--> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_TITLE" desc="Title of the default browser promo dialog"> - Set <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> as your default? - </message> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_DESC" desc="Description in the default browser promo dialog, which is concatenated with one of the following steps strings"> - <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> has the smarts and speed you need to safely do, create, and explore online - </message> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_DISAMBIGUATION_SHEET_STEPS" desc="Description of the steps to set the default browser throught disambiguation sheet. 'Always' should match TC ID 5575222334666843269."> - 1. Choose <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph>\n2. Tap “Always” - </message> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_SYSTEM_SETTINGS_STEPS" - desc="Description of the steps to set the default browser throught system settings. - 'Go to Settings' should match TC ID 4431460803004659888. 'Browser App' should match TC ID 6222206565850006894."> - 1. Go to Settings\n2. Tap “Browser App”\n3. Choose <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> - </message> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_ROLE_MANAGER_STEPS" desc="Description of the steps to set the default browser throught role manager. 'Set as default' should match TC ID 5706081295230541240."> - 1. Choose <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph>\n2. Tap “Set as default” - </message> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_CHOOSE_CHROME_BUTTON" desc="A button in the default browser promo dialog to choose chrome as default"> - Choose <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> - </message> - <message name="IDS_DEFAULT_BROWSER_PROMO_DIALOG_GO_TO_SETTINGS_BUTTON" desc="A button in the default browser promo to navigate users to systen settings. 'Go to Settings' should match TC ID 4431460803004659888."> - Go to Settings - </message> - <!-- HTTPS image compression InfoBar --> <message name="IDS_LITE_MODE_HTTPS_IMAGE_COMPRESSION_MESSAGE" desc="The text of the infobar notifying the user that Chrome's Lite mode will now also compresses HTTPS images."> Lite mode now saves you more data by optimizing images on HTTPS pages.
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_CHOOSE_CHROME_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_CHOOSE_CHROME_BUTTON.png.sha1 deleted file mode 100644 index a53a43b..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_CHOOSE_CHROME_BUTTON.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bb6d6d6f68515ff14ec7342be489930390f042e9 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_DESC.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_DESC.png.sha1 deleted file mode 100644 index a53a43b..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_DESC.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bb6d6d6f68515ff14ec7342be489930390f042e9 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_DISAMBIGUATION_SHEET_STEPS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_DISAMBIGUATION_SHEET_STEPS.png.sha1 deleted file mode 100644 index 54e5c6a..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_DISAMBIGUATION_SHEET_STEPS.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -9eacef949b483b14f39203a91cf344fc1b411308 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_GO_TO_SETTINGS_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_GO_TO_SETTINGS_BUTTON.png.sha1 deleted file mode 100644 index f0b353b..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_GO_TO_SETTINGS_BUTTON.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -16654f05aa1fd22112a0a2fe8acc19c9e7a90e25 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_ROLE_MANAGER_STEPS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_ROLE_MANAGER_STEPS.png.sha1 deleted file mode 100644 index a53a43b..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_ROLE_MANAGER_STEPS.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bb6d6d6f68515ff14ec7342be489930390f042e9 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_SYSTEM_SETTINGS_STEPS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_SYSTEM_SETTINGS_STEPS.png.sha1 deleted file mode 100644 index f0b353b..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_SYSTEM_SETTINGS_STEPS.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -16654f05aa1fd22112a0a2fe8acc19c9e7a90e25 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_TITLE.png.sha1 deleted file mode 100644 index a53a43b..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_DEFAULT_BROWSER_PROMO_DIALOG_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bb6d6d6f68515ff14ec7342be489930390f042e9 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index fee60a39..147a44ff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Skakel sinkronisering aan om oor toestelle heen te sinkroniseer en personaliseer</translation> <translation id="1209206284964581585">Versteek vir eers</translation> <translation id="1227058898775614466">Navigasiegeskiedenis</translation> -<translation id="1229399675748764149">Maak hierdie bladsy jou tuisblad</translation> <translation id="1231733316453485619">Skakel sinkronisering aan?</translation> <translation id="123724288017357924">Herlaai die huidige bladsy en ignoreer kasinhoud</translation> <translation id="124678866338384709">Maak huidige oortjie toe</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Vee wagwoord uit</translation> <translation id="1521774566618522728">Aktief vandag</translation> <translation id="1538801903729528855">Kry 'n beter stemervaring op die web</translation> -<translation id="1543538514740974167">Kom vinniger hier</translation> <translation id="1544826120773021464">Tik op die "Bestuur rekening"-knoppie om jou Google-rekening te bestuur</translation> <translation id="1549000191223877751">Beweeg na 'n ander venster</translation> <translation id="1553358976309200471">Dateer Chrome op</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Werwe</translation> <translation id="4594952190837476234">Hierdie vanlyn bladsy is van <ph name="CREATION_TIME" /> af en kan van die aanlyn weergawe verskil.</translation> <translation id="4605958867780575332">Item is verwyder: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Stoor bladsye vir later en kry 'n onthounota</translation> <translation id="4616150815774728855">Maak <ph name="WEBAPK_NAME" /> oop</translation> <translation id="4634124774493850572">Gebruik wagwoord</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 gekompromitteerde wagwoord}other{# gekompromitteerde wagwoorde}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Teruggestel op <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Wagwoorde</translation> <translation id="7030675613184250187">Jy kan bladsye op jou leeslys stoor om hulle weer te kry of vanlyn te lees</translation> -<translation id="703523980599857277">Verander tuisblad</translation> <translation id="7054588988317389591">Kry prentbeskrywings?</translation> <translation id="7055152154916055070">Herleiding is geblokkeer:</translation> <translation id="7063006564040364415">Kon nie aan die sinkroniseringbediener koppel nie.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome is op datum</translation> <translation id="7106762743910369165">Jou organisasie bestuur jou blaaier</translation> <translation id="7121362699166175603">Vee geskiedenis en outovoltooide items in die adresbalk uit. Jou Google-rekening kan dalk ander vorme van blaaigeskiedenis hê by <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Sien jou topwerwe en onlangse berigte wanneer jy op die Tuisknoppie tik</translation> <translation id="7138678301420049075">Ander</translation> <translation id="7146622961999026732">Dit lyk of hierdie werwe en programme vir jou belangrik is:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Laai oorspronklike bladsy<ph name="END_LINK" /> van <ph name="DOMAIN_NAME" /> af</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Kies <ph name="APP_NAME" />\n2. Tik op "Altyd"</translation> <translation id="8410695015584479363">Spoor pryse na</translation> <translation id="8413126021676339697">Wys volle geskiedenis</translation> -<translation id="8425213833346101688">Verander</translation> <translation id="8427875596167638501">Voorskou-oortjie is half oopgemaak</translation> <translation id="8428213095426709021">Instellings</translation> <translation id="8438566539970814960">Maak soektogte en blaai-ervaring beter</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Verwyder jou Chrome-aktiwiteit van Digitale Welstand</translation> <translation id="927968626442779827">Gebruik Ligte Modus op Google Chrome</translation> <translation id="932327136139879170">Tuis</translation> -<translation id="93753284658583800">Tuisblad is verander</translation> <translation id="938850635132480979">Fout: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Tik wagfrase in</translation> <translation id="948039501338975565">Lys boekmerkvouers</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 56d0bec8..c3b8e97 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">በመላ መሣሪያዎች ላይ ስምረትን ማብራት ለማስመር እና ግላዊነትን ለማላበስ</translation> <translation id="1209206284964581585">ለአሁን ደብቅ</translation> <translation id="1227058898775614466">የዳሰሳ ታሪክ</translation> -<translation id="1229399675748764149">ይህን ገጽ መነሻ ገጽዎ ያድርጉት</translation> <translation id="1231733316453485619">አስምር ይብራ?</translation> <translation id="123724288017357924">የተሸጎጠ ይዘትን ችላ በማለት የአሁኑን ገጽ ዳግም ጫን</translation> <translation id="124678866338384709">የአሁኑን ትር ዝጋ</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">የይለፍ ቃል ሰርዝ</translation> <translation id="1521774566618522728">ገባሪ ዛሬ</translation> <translation id="1538801903729528855">በድር ላይ የተሻለ የድምፅ ተሞክሮ ያግኙ</translation> -<translation id="1543538514740974167">እዚህ በበለጠ ፍጥነት ያግኙ</translation> <translation id="1544826120773021464">የGoogle መለያዎን ለማቀናበር የ«መለያን አቀናብር» አዝራሩን መታ ያድርጉት</translation> <translation id="1549000191223877751">ወደ ሌላ መስኮት ውሰድ</translation> <translation id="1553358976309200471">Chromeን አዘምን</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">ጣቢያዎች</translation> <translation id="4594952190837476234">ይህ የ<ph name="CREATION_TIME" /> የመስመር ውጭ ገጽ ከመስመር ላይ ስሪቱ የተለየ ሊሆን ይችላል።</translation> <translation id="4605958867780575332">ንጥል ተወግዷል፦ <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ለበኋላ ገጾችን ያስቀምጡ እና አስታዋሽ ያግኙ</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" />ን ይክፈቱ</translation> <translation id="4634124774493850572">የይለፍ ቃል ይጠቀሙ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 የተጠለፈ የይለፍ ቃል}one{# የተጠለፉ የይለፍ ቃላት}other{# የተጠለፉ የይለፍ ቃላት}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">ወደነበረበት የተመለሰው በ<ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">የይለፍ ቃላት</translation> <translation id="7030675613184250187">የእርስዎን ገጾች እንደገና ማግኘት ወይም ከመስመር ውጭ ማንበብ እንዲችሉ በንባብ ዝርዝርዎ ውስጥ ሊያስቀምጧቸው ይችላሉ</translation> -<translation id="703523980599857277">መነሻ ገጹን ይቀይሩ</translation> <translation id="7054588988317389591">የምስል መግለጫዎችን ያግኙ?</translation> <translation id="7055152154916055070">አቅጣጫ ማዞር ታግዷል፦</translation> <translation id="7063006564040364415">ከማመሳሰያ አገልጋዩ ጋር መገናኘት አልተቻለም።</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome የተዘመነ ነው</translation> <translation id="7106762743910369165">የእርስዎ አሳሽ በእርስዎ ድርጅት የሚተዳደር ነው</translation> <translation id="7121362699166175603">በአድራሻ አሞሌው ላይ ታሪክን እና ራስ-ማጠናቀቆችን ያጸዳል። የእርስዎ Google መለያ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ላይ ሌሎች የአሰሳ ታሪክ አይነቶች ሊኖሩት ይችላል።</translation> -<translation id="7128355412245153445">የመነሻ አዝራሩን መታ ባደረጉ ቁጥር የእርስዎን ከፍተኛ ጣቢያዎች እና የቅርብ ጊዜ ታሪኮች ይመልከቱ</translation> <translation id="7138678301420049075">ሌላ</translation> <translation id="7146622961999026732">እነዚህ ጣቢያዎች እና መተግበሪያዎች ለእርስዎ አስፈላጊ ይመስላሉ፦</translation> <translation id="7149158118503947153">ከ<ph name="DOMAIN_NAME" /> <ph name="BEGIN_LINK" />የመጀመሪያውን ገጽ ጫን<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" />\n2ን ይምረጡ። «ዘወትር»ን መታ ያድርጉ</translation> <translation id="8410695015584479363">ዋጋዎችን ተከታተል</translation> <translation id="8413126021676339697">ሙሉ ታሪክ አሳይ</translation> -<translation id="8425213833346101688">ለውጥ</translation> <translation id="8427875596167638501">የቅድመ-እይታ ትር ግማሽ ተከፍቷል</translation> <translation id="8428213095426709021">ቅንብሮች</translation> <translation id="8438566539970814960">ፍለጋዎችን እና አሰሳን የተሻለ አድርግ</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">የChrome እንቅስቃሴዎን ከዲጂታል ብቁ መሆን ያስወግዱ</translation> <translation id="927968626442779827">በGoogle Chrome ላይ ቀላል ሁነታን ይጠቀሙ</translation> <translation id="932327136139879170">መነሻ</translation> -<translation id="93753284658583800">መነሻ ገጽ ተቀይሯል</translation> <translation id="938850635132480979">ስህተት፦ <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">የይለፍ ሐረግ ያስገቡ</translation> <translation id="948039501338975565">የዕልባት አቃፊዎች ዝርዝር</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index ce600ef..f7b01e8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">للمزامنة والتخصيص على جميع الأجهزة، يمكنك تفعيل المزامنة.</translation> <translation id="1209206284964581585">إخفاء الآن</translation> <translation id="1227058898775614466">سجلّ التنقُّل</translation> -<translation id="1229399675748764149">جعل هذه الصفحة صفحتك الرئيسية</translation> <translation id="1231733316453485619">هل تريد تفعيل المزامنة؟</translation> <translation id="123724288017357924">إعادة تحميل الصفحة الحالية مع تجاهل المحتوى المُخزَّن مؤقتًا</translation> <translation id="124678866338384709">إغلاق علامة التبويب الحالية</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">حذف كلمة المرور</translation> <translation id="1521774566618522728">نشط اليوم</translation> <translation id="1538801903729528855">الحصول على تجربة صوت أفضل على الإنترنت</translation> -<translation id="1543538514740974167">الانتقال إلى هنا بشكل أسرع</translation> <translation id="1544826120773021464">لإدارة إعدادات حسابك على Google، يُرجى النقر على الزر "إدارة الحساب".</translation> <translation id="1549000191223877751">الانتقال إلى نافذة أخرى</translation> <translation id="1553358976309200471">تحديث Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">المواقع</translation> <translation id="4594952190837476234">تم إنشاء هذه الصفحة المتوفّرة بلا اتصال بالإنترنت في <ph name="CREATION_TIME" />، وقد تختلف عن النسخة المتوفِّرة على الإنترنت.</translation> <translation id="4605958867780575332">تمت إزالة العنصر: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">حفظ الصفحات لوقتٍ لاحق والحصول على تذكير</translation> <translation id="4616150815774728855">فتح <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">استخدام كلمة المرور</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{كلمة مرورٍ واحدة محتمَل تعرّضها للاختراق}zero{# كلمة مرور محتمَل تعرّضها للاختراق}two{كلمتا مرورٍ محتمَل تعرّضهما للاختراق}few{# كلمات مرورٍ محتمَل تعرّضها للاختراق}many{# كلمة مرورٍ محتمَل تعرّضها للاختراق}other{# كلمة مرورٍ محتمَل تعرّضها للاختراق}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">تمّت استعادة <ph name="ITEM_TITLE" />.</translation> <translation id="7029809446516969842">كلمات المرور</translation> <translation id="7030675613184250187">يمكنك حفظ صفحات في "قائمة القراءة" للوصول إليها مرة أخرى أو قراءتها بلا إنترنت.</translation> -<translation id="703523980599857277">تغيير الصفحة الرئيسية</translation> <translation id="7054588988317389591">هل تريد عرض أوصاف الصور؟</translation> <translation id="7055152154916055070">تم حظر إعادة توجيه:</translation> <translation id="7063006564040364415">تعذر الاتصال بخادم المزامنة.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome محدّث.</translation> <translation id="7106762743910369165">تتولّى مؤسستك إدارة متصفِّحك.</translation> <translation id="7121362699166175603">يتم محو السجلّ وعمليات الإكمال التلقائي في شريط العناوين. وقد يتضمّن حسابك على Google نماذج أخرى من سجلّ التصفّح في <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">يمكنك الاطّلاع على أهم المواقع الإلكترونية وأحدث الأخبار عند النقر على زر "الشاشة الرئيسية".</translation> <translation id="7138678301420049075">أخرى</translation> <translation id="7146622961999026732">يبدو أن المواقع الإلكترونية والتطبيقات التالية مهمة بالنسبة إليك:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />تحميل الصفحة الأصلية<ph name="END_LINK" /> من <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1- اختَر <ph name="APP_NAME" />\n2. انقر على "دائمًا".</translation> <translation id="8410695015584479363">تتبُّع الأسعار</translation> <translation id="8413126021676339697">عرض السجلّ بكامله</translation> -<translation id="8425213833346101688">تغيير</translation> <translation id="8427875596167638501">علامة تبويب المعاينة مفتوحة جزئيًا</translation> <translation id="8428213095426709021">الإعدادات</translation> <translation id="8438566539970814960">تحسين عمليات البحث والتصفُّح</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">إزالة نشاط Chrome من الرفاهية الرقمية</translation> <translation id="927968626442779827">استخدِم "الوضع البسيط" على Google Chrome.</translation> <translation id="932327136139879170">الصفحة الرئيسية</translation> -<translation id="93753284658583800">تم تغيير الصفحة الرئيسية.</translation> <translation id="938850635132480979">الخطأ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">إدخال عبارة المرور</translation> <translation id="948039501338975565">قائمة مجلدات الإشارات المرجعية</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index ce57a76..05667168 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">সকলো ডিভাইচতে ছিংক আৰু ব্যক্তিগতকৰণ কৰিবলৈ ছিংক কৰা সুবিধাটো অন কৰক</translation> <translation id="1209206284964581585">এতিয়াৰ বাবে লুকুৱাওক</translation> <translation id="1227058898775614466">নেভিগেশ্বন ইতিহাস</translation> -<translation id="1229399675748764149">এই পৃষ্ঠাখন আপোনাৰ গৃহপৃষ্ঠা কৰক</translation> <translation id="1231733316453485619">ছিংক অন কৰিবনে?</translation> <translation id="123724288017357924">কেশ্ব কৰা সমল অৱজ্ঞা কৰি বর্তমানৰ পৃষ্ঠাটো পুনৰ ল'ড কৰক</translation> <translation id="124678866338384709">বর্তমানৰ টেবটো বন্ধ কৰক</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">পাছৱৰ্ড মচক</translation> <translation id="1521774566618522728">আজি সক্ৰিয় হৈছে</translation> <translation id="1538801903729528855">ৱেবত এটা উন্নত কণ্ঠধ্বনিৰ অভিজ্ঞতা লাভ কৰক</translation> -<translation id="1543538514740974167">ইয়ালৈ খৰতকীয়াকৈ আহি পাওক</translation> <translation id="1544826120773021464">আপোনাৰ Google একাউণ্টটো পৰিচালনা কৰিবলৈ "একাউণ্ট পৰিচালনা কৰক" বুটামটোত টিপক</translation> <translation id="1549000191223877751">অন্য ৱিণ্ড’লৈ নিয়ক</translation> <translation id="1553358976309200471">Chrome আপডে’ট কৰক</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">এই অফলাইন পৃষ্ঠাটো <ph name="CREATION_TIME" />ৰ আৰু এই পৃষ্ঠাটো অনলাইন সংস্কৰণতকৈ বেলেগ হ’ব পাৰে।</translation> <translation id="4605958867780575332">আঁতৰোৱা বস্তু: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">পৰৱৰ্তী সময়ৰ কাৰণে পৃষ্ঠাসমূহ ছেভ কৰি ৰাখক আৰু এটা ৰিমাইণ্ডাৰ পাওক</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> খোলক</translation> <translation id="4634124774493850572">পাছৱৰ্ড দিয়ক</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{১ টা হেক হোৱা পাছৱৰ্ড}one{# টা হেক হোৱা পাছৱৰ্ড}other{# টা হেক হোৱা পাছৱৰ্ড}}</translation> @@ -876,7 +873,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> পুনঃস্থাপন কৰা হৈছে</translation> <translation id="7029809446516969842">পাছৱৰ্ডসমূহ</translation> <translation id="7030675613184250187">পৃষ্ঠাসমূহ পুনৰ বিচাৰি পাবলৈ অথবা অফলাইনত পঢ়িবলৈ আপুনি সেইসমূহ নিজৰ পঢ়াৰ সূচীখনত ছেভ কৰিব পাৰে</translation> -<translation id="703523980599857277">গৃহপৃষ্ঠাখন সলনি কৰক</translation> <translation id="7054588988317389591">প্ৰতিচ্ছবিৰ বিৱৰণ লাভ কৰিবনে?</translation> <translation id="7055152154916055070">পুনৰ নির্দেশ কৰাটো অৱৰোধ কৰা হৈছে</translation> <translation id="7063006564040364415">ছিংক ছাৰ্ভাৰৰ সৈতে সংযোগ কৰিব পৰা নগ'ল।</translation> @@ -887,7 +883,6 @@ <translation id="7088681679121566888">Chrome আপ টু ডে’ট আছে</translation> <translation id="7106762743910369165">আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ ব্ৰাউজাৰটো পৰিচালনা কৰে</translation> <translation id="7121362699166175603">ঠিকনাৰ বাৰত ইতিহাস আৰু স্বয়ংক্ৰিয়ভাৱে পুৰ হোৱা তথ্য মচে। <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />ত আপোনাৰ Google একাউণ্টৰ অন্য প্ৰকাৰৰ ব্ৰাউজিং ইতিহাস থাকিব পাৰে।</translation> -<translation id="7128355412245153445">আপুনি গৃহপৃষ্ঠাৰ বুটামটো টিপিলে আপোনাৰ শীর্ষ ছাইটসমূহ আৰু শেহতীয়া কাহিনীবোৰ দেখা পাওক</translation> <translation id="7138678301420049075">অন্য</translation> <translation id="7146622961999026732">এই ছাইট আৰু এপ্সমূহ আপোনাৰ বাবে গুৰুত্বপূৰ্ণ যেন লাগিছে:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" />ৰ পৰা <ph name="BEGIN_LINK" />প্ৰকৃত পৃষ্ঠাটো ল'ড কৰক<ph name="END_LINK" /></translation> @@ -1076,7 +1071,6 @@ <translation id="8407396331882458341">১) <ph name="APP_NAME" /> বাছনি কৰক\n২) “সদায়”ত টিপক</translation> <translation id="8410695015584479363">মূল্য ট্ৰেক কৰক</translation> <translation id="8413126021676339697">সম্পূৰ্ণ ইতিহাস দেখুৱাওক</translation> -<translation id="8425213833346101688">সলনি কৰক</translation> <translation id="8427875596167638501">পূৰ্বদৰ্শন টেবটো আধা খোলা আছে</translation> <translation id="8428213095426709021">ছেটিংসমূহ</translation> <translation id="8438566539970814960">সন্ধান আৰু ব্ৰাউজিং উন্নত কৰক</translation> @@ -1194,7 +1188,6 @@ <translation id="926205370408745186">আপুনি Chromeত কৰা কাৰ্যকলাপ ডিজিটেল ৱেলবিইঙ-ৰ পৰা আঁতৰাওক</translation> <translation id="927968626442779827">Google Chromeত লাইট ম’ড ব্যৱহাৰ কৰক</translation> <translation id="932327136139879170">গৃহ</translation> -<translation id="93753284658583800">গৃহপৃষ্ঠাখন সলনি কৰা হ'ল</translation> <translation id="938850635132480979">আসোঁৱাহ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">পাছফ্ৰেজ দিয়ক</translation> <translation id="948039501338975565">বুকমাৰ্ক ফ'ল্ডাৰসমূহৰ সূচী</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 6c0df659..be0735b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Cihazlar üzrə sinxronizasiya etmək və fərdiləşdirmək üçün sinxronizasiyanı aktiv edin</translation> <translation id="1209206284964581585">Hələlik gizlədin</translation> <translation id="1227058898775614466">Naviqasiya tarixçəsi</translation> -<translation id="1229399675748764149">Bu səhifəni əsas səhifəyə çevirin</translation> <translation id="1231733316453485619">Sinxronizasiya ktiv edilsin?</translation> <translation id="123724288017357924">Keş məzmununu iqnor edərək cari səhifəni yenidən yükləyin</translation> <translation id="124678866338384709">Cari paneli bağlayın</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Parolu silin</translation> <translation id="1521774566618522728">Bu gün aktivdir</translation> <translation id="1538801903729528855">Vebdə daha yaxşı səs təcrübəsi əldə edin</translation> -<translation id="1543538514740974167">Bura daha tez keçin</translation> <translation id="1544826120773021464">Google hesabınızı idarə etmək üçün "Hesabı idarə edin" düyməsinə toxunun</translation> <translation id="1549000191223877751">Başqa pəncərəyə keçin</translation> <translation id="1553358976309200471">Chrome'u güncəlləşdirin</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Saytlar</translation> <translation id="4594952190837476234">Bu səhifə <ph name="CREATION_TIME" /> tarixində yaradılıb və onlayn versiyadan fərqli ola bilər.</translation> <translation id="4605958867780575332">Element silindi: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Səhifələri daha sonra baxmaq üçün yadda saxlayın və xatırladıcı qəbul edin</translation> <translation id="4616150815774728855">Açın: <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Parol istifadə edin</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 oğurlanmış parol}other{# oğurlanmış parol}}</translation> @@ -875,7 +872,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> bərpa olunub</translation> <translation id="7029809446516969842">Parollar</translation> <translation id="7030675613184250187">Yenidən tapmaq və ya oflayn oxumaq üçün səhifələri oxu siyahısında saxlaya bilərsiniz</translation> -<translation id="703523980599857277">Əsas səhifəni dəyişin</translation> <translation id="7054588988317389591">Şəkil təsvirləri əldə edilsin?</translation> <translation id="7055152154916055070">Yönləndirmə blok edildi:</translation> <translation id="7063006564040364415">Sinxronizasiya serverinə qoşula bilmədi.</translation> @@ -886,7 +882,6 @@ <translation id="7088681679121566888">Chrome güncəldir</translation> <translation id="7106762743910369165">Təşkilatınız brauzerinizi idarə edir</translation> <translation id="7121362699166175603">Ünvan penelindəki tarixçə və avtomatik tamamlamanı silir. <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> linkində Google Hesabına məxsus axtarış tarixçəsinin başqa formaları ola bilər.</translation> -<translation id="7128355412245153445">Əsas səhifə düyməsinə basdıqda populyar saytlar və ən son hekayələr göstərilsin</translation> <translation id="7138678301420049075">Digər</translation> <translation id="7146622961999026732">Bu saytlar və tətbiqlər sizə vacib görünür:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> domenindən <ph name="BEGIN_LINK" />orijinal səhifəni yükləyin<ph name="END_LINK" /></translation> @@ -1076,7 +1071,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> seçin\n2. “Həmişə” seçiminə toxunun</translation> <translation id="8410695015584479363">Qiymətləri izləyin</translation> <translation id="8413126021676339697">Tam tarixçəni göstərin</translation> -<translation id="8425213833346101688">Dəyişin</translation> <translation id="8427875596167638501">Önbaxış tabının yarısı açılıb</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8438566539970814960">Axtarış və brauzer fəaliyyətini təkmilləşdirin</translation> @@ -1194,7 +1188,6 @@ <translation id="926205370408745186">Digital Sağlamlıqdan Chrome fəaliyyətini silin</translation> <translation id="927968626442779827">Google Chrome'da Lite rejimindən istifadə edin</translation> <translation id="932327136139879170">Ev</translation> -<translation id="93753284658583800">Əsas səhifə dəyişdirilib</translation> <translation id="938850635132480979">Xəta: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Parol daxil edin</translation> <translation id="948039501338975565">Əlfəcin qovluqlarının siyahısı</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 03f115d..9bdf6faf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Каб сінхранізаваць і персаналізаваць даныя на ўсіх прыладах, уключыце сінхранізацыю</translation> <translation id="1209206284964581585">Схаваць гэты раз</translation> <translation id="1227058898775614466">Гісторыя навігацыі</translation> -<translation id="1229399675748764149">Зрабіце гэту старонку галоўнай</translation> <translation id="1231733316453485619">Уключыць сінхранізацыю?</translation> <translation id="123724288017357924">Перазагрузіць бягучую старонку, ігнаруючы змесціва кэша</translation> <translation id="124678866338384709">Закрыць бягучую ўкладку</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Выдаліць пароль</translation> <translation id="1521774566618522728">Апошнія дзеянні адбываліся сёння</translation> <translation id="1538801903729528855">Зрабіце галасавы пошук у інтэрнэце яшчэ зручнейшым</translation> -<translation id="1543538514740974167">Хуткае адкрыццё старонак</translation> <translation id="1544826120773021464">Каб змяніць налады вашага ўліковага запісу Google, націсніце кнопку "Кіраваць уліковым запісам"</translation> <translation id="1549000191223877751">Перамясціць у іншае акно</translation> <translation id="1553358976309200471">Абнавіць Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайты</translation> <translation id="4594952190837476234">Гэта пазасеткавая старонка створана <ph name="CREATION_TIME" /> і можа адрознівацца ад сваёй інтэрнэт-версіі.</translation> <translation id="4605958867780575332">Элемент "<ph name="ITEM_TITLE" />" выдалены</translation> -<translation id="4614535611158687827">Захоўвайце старонкі, каб праглядаць іх пазней. Вы атрымаеце напамін</translation> <translation id="4616150815774728855">Адкрыць <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Выкарыстаць пароль</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Адзін раскрыты пароль}one{# раскрыты пароль}few{# раскрытыя паролі}many{# раскрытых пароляў}other{# раскрытага пароля}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Адноўлена: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Паролі</translation> <translation id="7030675613184250187">Захоўвайце старонкі ў спісе чытання, каб вярнуцца да іх пазней або чытаць без падключэння да інтэрнэту</translation> -<translation id="703523980599857277">Змяніць галоўную старонку</translation> <translation id="7054588988317389591">Атрымліваць апісанні відарысаў?</translation> <translation id="7055152154916055070">Перанакіраванне заблакіравана:</translation> <translation id="7063006564040364415">Не ўдалося падключыцца да сервера сінхранізацыі.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome не патрабуе абнаўлення</translation> <translation id="7106762743910369165">Вашым браўзерам кіруе арганізацыя</translation> <translation id="7121362699166175603">Ачышчае гісторыю і гісторыю аўтазапаўнення ў адрасным радку. На сайце <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> размешчаны іншыя формы запісу гісторыі прагляду сайтаў для вашага Уліковага запісу Google.</translation> -<translation id="7128355412245153445">Пры націсканні кнопкі "Галоўная старонка" будуць паказаны папулярныя сайты і свежыя артыкулы</translation> <translation id="7138678301420049075">Іншыя</translation> <translation id="7146622961999026732">Гэтыя сайты і праграмы могуць быць важнымі для вас:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Загрузіць зыходную старонку<ph name="END_LINK" /> з дамена <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Выберыце праграму "<ph name="APP_NAME" />".\n2. Націсніце "Заўсёды".</translation> <translation id="8410695015584479363">Адсочваць цэны</translation> <translation id="8413126021676339697">Паказаць усю гісторыю</translation> -<translation id="8425213833346101688">Змяніць</translation> <translation id="8427875596167638501">Укладка перадпрагляду адкрыта напалову</translation> <translation id="8428213095426709021">Налады</translation> <translation id="8438566539970814960">Паскорыць пошук і прагляд</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Выдаліць дзеянні ў Chrome са службы лічбавага камфорту</translation> <translation id="927968626442779827">Выкарыстоўвайце Google Chrome, уключыўшы спрошчаны рэжым</translation> <translation id="932327136139879170">Галоўная старонка</translation> -<translation id="93753284658583800">Галоўная старонка зменена</translation> <translation id="938850635132480979">Памылка: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Увядзіце фразу-пароль</translation> <translation id="948039501338975565">Спіс папак з закладкамі</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 7381c08..d6d97c2f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Включете синхронизирането, за да се възползвате от синхронизиране и персонализиране на всички устройства</translation> <translation id="1209206284964581585">Скриване засега</translation> <translation id="1227058898775614466">История на навигацията</translation> -<translation id="1229399675748764149">Задайте тази страница като начална</translation> <translation id="1231733316453485619">Да се включи ли синхронизирането?</translation> <translation id="123724288017357924">Презареждане на страницата (кешът се пренебрегва)</translation> <translation id="124678866338384709">Затваряне на текущия раздел</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Изтриване на паролата</translation> <translation id="1521774566618522728">Активно днес</translation> <translation id="1538801903729528855">Подобряване на работата с глас в мрежата</translation> -<translation id="1543538514740974167">Стигайте дотук по-бързо</translation> <translation id="1544826120773021464">За да управлявате профила си в Google, докоснете бутона „Управление на профила“</translation> <translation id="1549000191223877751">Преместв. в другия прозорец</translation> <translation id="1553358976309200471">Актуализиране на Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайтове</translation> <translation id="4594952190837476234">Тази офлайн страница е от <ph name="CREATION_TIME" /> и може да се различава от онлайн версията.</translation> <translation id="4605958867780575332">Елементът бе премахнат: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Запазване на страниците за по-късно и получаване на напомняне</translation> <translation id="4616150815774728855">Отваряне на <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Използване на паролата</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 компрометирана парола}other{# компрометирани пароли}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Файлът „<ph name="ITEM_TITLE" />“ бе възстановен</translation> <translation id="7029809446516969842">Пароли</translation> <translation id="7030675613184250187">Можете да запазвате страници в списъка си за четене, за да ги намирате отново или да ги четете офлайн</translation> -<translation id="703523980599857277">Промяна на началната страница</translation> <translation id="7054588988317389591">Искате ли да получавате описания на изображенията?</translation> <translation id="7055152154916055070">Блокирано бе пренасочване:</translation> <translation id="7063006564040364415">Не можа да се установи връзка със синхронизиращия сървър.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome е актуален</translation> <translation id="7106762743910369165">Браузърът се управлява от организацията ви</translation> <translation id="7121362699166175603">Изчиства историята и автоматичните довършвания в адресната лента. В профила ви в Google може да има други видове история на сърфиране, съхранявани на адрес <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Преглеждайте водещите сайтове и скорошните материали с едно докосване на бутона „Начална страница“</translation> <translation id="7138678301420049075">Друго</translation> <translation id="7146622961999026732">Тези сайтове и приложения изглеждат важни за вас:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Зареждане на оригиналната страница<ph name="END_LINK" /> от <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Изберете <ph name="APP_NAME" />\n2. Докоснете „Винаги“</translation> <translation id="8410695015584479363">Следене на цени</translation> <translation id="8413126021676339697">Цялата история</translation> -<translation id="8425213833346101688">Промяна</translation> <translation id="8427875596167638501">Разделът за визуализация е наполовина отворен</translation> <translation id="8428213095426709021">Настройки</translation> <translation id="8438566539970814960">Подобряване на търсенията и сърфирането</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Премахване на активността ви в Chrome от „Дигитално благополучие“</translation> <translation id="927968626442779827">Използване на олекотения режим в Google Chrome</translation> <translation id="932327136139879170">Начална страница</translation> -<translation id="93753284658583800">Началната страница е променена</translation> <translation id="938850635132480979">Грешка: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Въведете пропуск</translation> <translation id="948039501338975565">Списък с папките с отметки</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 4ba0a5d..3f1b926 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">সমগ্র ডিভাইস জুড়ে সিঙ্ক এবং ব্যক্তিগতকৃত করতে সিঙ্ক বিকল্প চালু করুন</translation> <translation id="1209206284964581585">এখনকার মতো লুকান</translation> <translation id="1227058898775614466">নেভিগেশনের ইতিহাস</translation> -<translation id="1229399675748764149">এই পৃষ্ঠাকে আপনার হোমপেজ হিসেবে সেট করুন</translation> <translation id="1231733316453485619">সিঙ্ক চালু করবেন?</translation> <translation id="123724288017357924">ক্যাশে করা কন্টেন্ট এড়িয়ে বর্তমান পৃষ্ঠা আবার লোড করুন</translation> <translation id="124678866338384709">বর্তমান ট্যাব বন্ধ করুন</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">পাসওয়ার্ড মুছুন</translation> <translation id="1521774566618522728">আজ ব্যবহার করা হয়েছে</translation> <translation id="1538801903729528855">ওয়েবে আরও ভাল ভয়েস সার্চ করার অভিজ্ঞতা পান</translation> -<translation id="1543538514740974167">এখান থেকে দ্রুত অ্যাক্সেস করুন</translation> <translation id="1544826120773021464">আপনার Google অ্যাকাউন্ট ম্যানেজ করতে, "অ্যাকাউন্ট ম্যানেজ করুন" বোতামে ট্যাপ করুন</translation> <translation id="1549000191223877751">অন্য উইন্ডোতে সরান</translation> <translation id="1553358976309200471">Chrome আপডেট করুন</translation> @@ -500,7 +498,6 @@ <translation id="4587589328781138893">সাইট</translation> <translation id="4594952190837476234">এই অফলাইন পৃষ্ঠাটি <ph name="CREATION_TIME" />-এ তৈরি করা হয়েছিল এবং এটি অনলাইন ভার্সনের থেকে আলাদা হতে পারে।</translation> <translation id="4605958867780575332">আইটেম সরানো হয়েছে: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">পরে দেখার জন্য পৃষ্ঠাগুলি সেভ করে রাখুন ও রিমাইন্ডার পান</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> খুলুন</translation> <translation id="4634124774493850572">পাসওয়ার্ড ব্যবহার করুন</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{১টি চুরি হয়ে যাওয়া পাসওয়ার্ড}one{#টি চুরি হয়ে যাওয়া পাসওয়ার্ড}other{#টি চুরি হয়ে যাওয়া পাসওয়ার্ড}}</translation> @@ -879,7 +876,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ফিরিয়ে আনা হয়েছে</translation> <translation id="7029809446516969842">পাসওয়ার্ড</translation> <translation id="7030675613184250187">পৃষ্ঠাগুলি আবার খুঁজে পেতে বা অফলাইনে পড়তে আপনার পড়ার তালিকাতে সেগুলি সেভ করে রাখতে পারবেন</translation> -<translation id="703523980599857277">হোমপেজ পরিবর্তন করুন</translation> <translation id="7054588988317389591">ছবির বিবরণ পেতে চান?</translation> <translation id="7055152154916055070">রিডাইরেক্ট ব্লক করা হয়েছে:</translation> <translation id="7063006564040364415">সিঙ্ক সার্ভারে সংযোগ করতে পারেনি৷</translation> @@ -890,7 +886,6 @@ <translation id="7088681679121566888">Chrome আপ-টু-ডেট আছে</translation> <translation id="7106762743910369165">আপনার সংস্থা ব্রাউজার ম্যানেজ করছে</translation> <translation id="7121362699166175603">অ্যাড্রেস বারের ইতিহাস এবং অটোকমপ্লিট তথ্য মুছে ফেলে। <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-এ আপনার Google অ্যাকাউন্টের অন্যান্য ধরনের ব্রাউজিংয়ের ইতিহাস থাকতে পারে।</translation> -<translation id="7128355412245153445">বেশি ব্যবহার করেন এমন সাইট ও সাম্প্রতিক খবরগুলি যখন খুশি হোম বোতামে ট্যাপ করে দেখে নিন</translation> <translation id="7138678301420049075">অন্যান্য</translation> <translation id="7146622961999026732">মনে হচ্ছে এই সাইট ও অ্যাপ আপনার জন্য গুরুত্বপূর্ণ:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> থেকে <ph name="BEGIN_LINK" />মূল পৃষ্ঠাটি লোড করুন<ph name="END_LINK" /></translation> @@ -1080,7 +1075,6 @@ <translation id="8407396331882458341">১. <ph name="APP_NAME" /> বেছে নিন\n2. “সবসময়” বোতাম ট্যাপ করুন</translation> <translation id="8410695015584479363">দাম ট্র্যাক করুন</translation> <translation id="8413126021676339697">সম্পূর্ণ ইতিহাস দেখান</translation> -<translation id="8425213833346101688">পরিবর্তন</translation> <translation id="8427875596167638501">প্রিভিউ ট্যাব অর্ধেক খোলা আছে</translation> <translation id="8428213095426709021">সেটিংস</translation> <translation id="8438566539970814960">সার্চ এবং ব্রাউজিং অভিজ্ঞতা আরও উন্নত করুন</translation> @@ -1198,7 +1192,6 @@ <translation id="926205370408745186">ডিজিটাল ওয়েলবিং থেকে আপনার Chrome অ্যাক্টিভিটি সরিয়ে দিন</translation> <translation id="927968626442779827">Google Chrome-এ 'লাইট' মোড ব্যবহার করুন</translation> <translation id="932327136139879170">হোম</translation> -<translation id="93753284658583800">হোমপেজ বদলানো হয়েছে</translation> <translation id="938850635132480979">ত্রুটি: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">পাসফ্রেজ প্রবেশ করান</translation> <translation id="948039501338975565">বুকমার্ক ফোল্ডারের তালিকা</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 2fbff1e..5591067 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Uključite sinhronizaciju da sinhronizirate i personalizirate više uređaja</translation> <translation id="1209206284964581585">Sakrij za sada</translation> <translation id="1227058898775614466">Historija navigacije</translation> -<translation id="1229399675748764149">Postavite ovu stranicu kao početnu</translation> <translation id="1231733316453485619">Uključiti sinhronizaciju?</translation> <translation id="123724288017357924">Ponovo učitajte tren. str. ignorir. sadrž. keš memor.</translation> <translation id="124678866338384709">Zatvori trenutnu karticu</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Izbriši lozinku</translation> <translation id="1521774566618522728">Aktivan danas</translation> <translation id="1538801903729528855">Ostvarite bolje iskustvo u korištenju glasa na webu</translation> -<translation id="1543538514740974167">Dođite ovdje brže</translation> <translation id="1544826120773021464">Za upravljanje Google računom, dodirnite dugme "Upravljaj računom"</translation> <translation id="1549000191223877751">Premjesti u drugi prozor</translation> <translation id="1553358976309200471">Ažuriraj Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Web lokacije</translation> <translation id="4594952190837476234">Stranica van mreže je od <ph name="CREATION_TIME" /> i može se razlikovati od verzije koja je na mreži.</translation> <translation id="4605958867780575332">Uklonjena je stavka: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Sačuvajte stranice za kasnije i primite podsjetnik</translation> <translation id="4616150815774728855">Otvori <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Koristi lozinku</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ugrožena lozinka}one{# ugrožena lozinka}few{# ugrožene lozinke}other{# ugroženih lozinki}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Vraćeno: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Lozinke</translation> <translation id="7030675613184250187">Možete sačuvati stranice na listu za čitanje da ih ponovo pronađete kasnije ili čitate van mreže</translation> -<translation id="703523980599857277">Promijeni početnu stranicu</translation> <translation id="7054588988317389591">Preuzeti opise slika?</translation> <translation id="7055152154916055070">Preusmjeravanje je blokirano:</translation> <translation id="7063006564040364415">Povezivanje na server za sinhronizaciju nije uspjelo.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome je ažuriran</translation> <translation id="7106762743910369165">Preglednikom upravlja vaša organizacija</translation> <translation id="7121362699166175603">Briše historiju i automatsko dovršavanje na traci za adresu. Vaš Google račun može imati druge oblike historije pregledanja na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Prikažite web lokacije koje najviše posjećujete i nedavne priče kad god dodirnete dugme za početni ekran</translation> <translation id="7138678301420049075">Drugo</translation> <translation id="7146622961999026732">Čini se da su vam ove web lokacije i aplikacije važne:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Učitajte originalnu stranicu<ph name="END_LINK" /> s domene <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Odaberite aplikaciju <ph name="APP_NAME" />\n2. Dodirnite "Uvijek"</translation> <translation id="8410695015584479363">Prati cijene</translation> <translation id="8413126021676339697">Pokaži cijelu povijest</translation> -<translation id="8425213833346101688">Izmijeni</translation> <translation id="8427875596167638501">Kartica za pregled je napola otvorena</translation> <translation id="8428213095426709021">Postavke</translation> <translation id="8438566539970814960">Poboljšajte pretraživanje i pregledanje</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Uklonite aktivnosti Chromea iz Digitalnog blagostanja</translation> <translation id="927968626442779827">Koristite Jednostavni način rada na Google Chromeu</translation> <translation id="932327136139879170">Dom</translation> -<translation id="93753284658583800">Početna stranica je promijenjena</translation> <translation id="938850635132480979">Greška: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Unesite pristupni izraz</translation> <translation id="948039501338975565">Lista foldera s oznakama</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 0d2a63e..5499373d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Per sincronitzar i personalitzar el contingut en tots els dispositius, activa la sincronització</translation> <translation id="1209206284964581585">Amaga per ara</translation> <translation id="1227058898775614466">Historial de navegació</translation> -<translation id="1229399675748764149">Fes que aquesta sigui la teva pàgina d'inici</translation> <translation id="1231733316453485619">Vols activar la sincronització?</translation> <translation id="123724288017357924">Carrega pàgina actual; ignora contingut en memòria</translation> <translation id="124678866338384709">Tanca la pestanya actual</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Suprimeix la contrasenya</translation> <translation id="1521774566618522728">Actiu avui</translation> <translation id="1538801903729528855">Gaudeix d'una millor experiència de veu al web</translation> -<translation id="1543538514740974167">Arriba fins aquí més ràpidament</translation> <translation id="1544826120773021464">Per gestionar el teu Compte de Google, toca el botó Gestiona el compte</translation> <translation id="1549000191223877751">Mou a l'altra finestra</translation> <translation id="1553358976309200471">Actualitza Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Llocs web</translation> <translation id="4594952190837476234">Aquesta pàgina sense connexió és del dia <ph name="CREATION_TIME" /> i pot ser diferent de la versió en línia.</translation> <translation id="4605958867780575332">S'ha suprimit l'element: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Desa pàgines per a més tard i rep un recordatori</translation> <translation id="4616150815774728855">Obre <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Fes servir la contrasenya</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contrasenya en perill}other{# contrasenyes en perill}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> s'ha restaurat</translation> <translation id="7029809446516969842">Contrasenyes</translation> <translation id="7030675613184250187">Pots desar pàgines a la llista de lectura per accedir-hi més endavant o llegir-les sense connexió</translation> -<translation id="703523980599857277">Canvia la pàgina d'inici</translation> <translation id="7054588988317389591">Vols obtenir descripcions de les imatges?</translation> <translation id="7055152154916055070">S'ha bloquejat la redirecció:</translation> <translation id="7063006564040364415">No s'ha pogut connectar amb el servidor de sincronització.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome està actualitzat</translation> <translation id="7106762743910369165">La teva organització gestiona el navegador</translation> <translation id="7121362699166175603">Esborra l'historial i les complecions automàtiques a la barra d'adreces. A <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> trobaràs altres maneres d'explorar l'historial de navegació del Compte de Google.</translation> -<translation id="7128355412245153445">Consulta els llocs web que més visites i les històries recents sempre que toquis el botó d'inici</translation> <translation id="7138678301420049075">Altres</translation> <translation id="7146622961999026732">Aquests llocs web i aquestes aplicacions semblen importants per a tu:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Carrega la pàgina original<ph name="END_LINK" /> del domini <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Tria <ph name="APP_NAME" />\n2. Toca Sempre</translation> <translation id="8410695015584479363">Fes un seguiment dels preus</translation> <translation id="8413126021676339697">Mostra l'historial complet</translation> -<translation id="8425213833346101688">Canvia</translation> <translation id="8427875596167638501">La pestanya de previsualització està oberta fins a la meitat</translation> <translation id="8428213095426709021">Configuració</translation> <translation id="8438566539970814960">Millora les cerques i la navegació</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Suprimeix l'activitat de Chrome de l'aplicació Benestar digital</translation> <translation id="927968626442779827">Utilitza el mode bàsic a Google Chrome</translation> <translation id="932327136139879170">Inici</translation> -<translation id="93753284658583800">S'ha canviat la pàgina d'inici</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introduïu la frase de contrasenya</translation> <translation id="948039501338975565">Llista de carpetes d'adreces d'interès</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 444aa5cf..5f37fcc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Chcete-li synchronizovat a přizpůsobit různá zařízení, zapněte synchronizaci</translation> <translation id="1209206284964581585">Prozatím skrýt</translation> <translation id="1227058898775614466">Historie navigace</translation> -<translation id="1229399675748764149">Nastavte si tuto stránku jako domovskou</translation> <translation id="1231733316453485619">Zapnout synchronizaci?</translation> <translation id="123724288017357924">Obnovit stránku a ignorovat obsah v mezipaměti</translation> <translation id="124678866338384709">Zavřít aktuální kartu</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Vymazat heslo</translation> <translation id="1521774566618522728">Aktivní dnes</translation> <translation id="1538801903729528855">Využijte vylepšené hlasové služby na webu</translation> -<translation id="1543538514740974167">Rychlejší přístup</translation> <translation id="1544826120773021464">Chcete-li spravovat svůj účet Google, klepněte na tlačítko Spravovat účet</translation> <translation id="1549000191223877751">Přejít do jiného okna</translation> <translation id="1553358976309200471">Aktualizovat Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Weby</translation> <translation id="4594952190837476234">Tato offline stránka je z <ph name="CREATION_TIME" /> a může se od online verze lišit.</translation> <translation id="4605958867780575332">Tato položka byla odstraněna: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Uložit stránky na později a odeslat připomenutí</translation> <translation id="4616150815774728855">Do aplikace <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Použít heslo</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Bylo nalezeno jedno prolomené heslo}few{Byla nalezena # prolomená hesla}many{Bylo nalezeno # prolomeného hesla}other{Bylo nalezeno # prolomených hesel}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Obnoveno: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Hesla</translation> <translation id="7030675613184250187">Stránky si můžete uložit do seznamu četby, abyste je znovu našli nebo si je mohli přečíst offline</translation> -<translation id="703523980599857277">Změnit domovskou stránku</translation> <translation id="7054588988317389591">Zobrazovat popisy obrázků?</translation> <translation id="7055152154916055070">Bylo zablokováno přesměrování:</translation> <translation id="7063006564040364415">K synchronizačnímu serveru se nelze připojit.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome je aktuální</translation> <translation id="7106762743910369165">Váš prohlížeč je spravován vaší organizací</translation> <translation id="7121362699166175603">Vymaže historii a automatická dokončení v adresním řádku. Na stránce <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> mohou být k dispozici další druhy historie prohlížení zaznamenané ve vašem účtu Google.</translation> -<translation id="7128355412245153445">Své oblíbené weby a aktuální zprávy můžete mít k dispozici po klepnutí na tlačítko domovské stránky</translation> <translation id="7138678301420049075">Ostatní</translation> <translation id="7146622961999026732">Tyto weby a aplikace jsou pro vás zřejmě důležité:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Načíst původní stránku<ph name="END_LINK" /> z domény <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Vyberte <ph name="APP_NAME" />\n2. Klepněte na Vždy</translation> <translation id="8410695015584479363">Sledovat ceny</translation> <translation id="8413126021676339697">Zobrazit celou historii</translation> -<translation id="8425213833346101688">Změnit</translation> <translation id="8427875596167638501">Karta náhledu je otevřená na půlce</translation> <translation id="8428213095426709021">Nastavení</translation> <translation id="8438566539970814960">Vylepšit vyhledávání a procházení</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Odstranit vaši aktivitu v Chromu z digitální rovnováhy</translation> <translation id="927968626442779827">Používejte v prohlížeči Google Chrome zjednodušený režim</translation> <translation id="932327136139879170">Domovská stránka</translation> -<translation id="93753284658583800">Domovská stránka se změnila</translation> <translation id="938850635132480979">Chyba: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Zadat heslovou frázi</translation> <translation id="948039501338975565">Seznam složek se záložkami</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 1beac2f4..c01e2153 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Aktivér synkronisering for at synkronisere og tilpasse på alle dine enheder</translation> <translation id="1209206284964581585">Skjul indtil videre</translation> <translation id="1227058898775614466">Navigationsoversigt</translation> -<translation id="1229399675748764149">Gør denne side til din startside</translation> <translation id="1231733316453485619">Vil du aktivere synkronisering?</translation> <translation id="123724288017357924">Genindlæs aktuel side, og ignorer indhold gemt i cache</translation> <translation id="124678866338384709">Luk aktuel fane</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Slet adgangskoden</translation> <translation id="1521774566618522728">Aktiv i dag</translation> <translation id="1538801903729528855">Få en bedre stemmestyret brugeroplevelse på nettet</translation> -<translation id="1543538514740974167">Få hurtig adgang</translation> <translation id="1544826120773021464">Tryk på knappen "Administrer konto" for at administrere din Google-konto</translation> <translation id="1549000191223877751">Flyt til et andet vindue</translation> <translation id="1553358976309200471">Opdater Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Websites</translation> <translation id="4594952190837476234">Denne offlineside er fra <ph name="CREATION_TIME" /> og kan afvige fra onlineversionen.</translation> <translation id="4605958867780575332">Element fjernet: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Gem sider til senere, og få en påmindelse</translation> <translation id="4616150815774728855">Åbn <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Brug adgangskode</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 kompromitteret adgangskode}one{# kompromitteret adgangskode}other{# kompromitterede adgangskoder}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Gendannet den <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Adgangskoder</translation> <translation id="7030675613184250187">Du kan gemme sider på din læseliste, så du kan finde dem igen eller læse dem, når du er offline</translation> -<translation id="703523980599857277">Skift startside</translation> <translation id="7054588988317389591">Vil du have billedbeskrivelser?</translation> <translation id="7055152154916055070">Omdirigeringen blev blokeret:</translation> <translation id="7063006564040364415">Der kunne ikke oprettes forbindelse til synkroniseringsserveren.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome er opdateret</translation> <translation id="7106762743910369165">Din browser administreres af din organisation</translation> <translation id="7121362699166175603">Rydder historikken og autofuldførelser i adresselinjen. Din Google-konto kan have andre former for browserhistorik på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Se dine mest anvendte websites og seneste historier, når du trykker på knappen Hjem</translation> <translation id="7138678301420049075">Andet</translation> <translation id="7146622961999026732">Disse websites og apps lader til at være vigtige for dig:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Indlæs den oprindelige side<ph name="END_LINK" /> fra <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Vælg <ph name="APP_NAME" />\n2. Tryk på "Altid"</translation> <translation id="8410695015584479363">Følg prisudvikling</translation> <translation id="8413126021676339697">Vis hele historikken</translation> -<translation id="8425213833346101688">Skift</translation> <translation id="8427875596167638501">Fanen forhåndsvisning er åbnet halvt</translation> <translation id="8428213095426709021">Indstillinger</translation> <translation id="8438566539970814960">Gør søgninger og browsing endnu bedre</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Fjern din Chrome-aktivitet fra Digital balance</translation> <translation id="927968626442779827">Brug Lite-tilstand i Google Chrome</translation> <translation id="932327136139879170">Start</translation> -<translation id="93753284658583800">Startsiden blev ændret</translation> <translation id="938850635132480979">Fejl: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Angiv adgangssætning</translation> <translation id="948039501338975565">Liste over bogmærkemapper</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index aa4935a..7b8099cd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Aktivieren Sie die Synchronisierung, um geräteübergreifend zu synchronisieren und zu personalisieren</translation> <translation id="1209206284964581585">Vorerst ausblenden</translation> <translation id="1227058898775614466">Navigationsverlauf</translation> -<translation id="1229399675748764149">Diese Seite als Startseite festlegen</translation> <translation id="1231733316453485619">Synchronisierung aktivieren?</translation> <translation id="123724288017357924">Aktuelle Seite neu laden, Cache-Inhalte ignorieren</translation> <translation id="124678866338384709">Aktuellen Tab schließen</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Passwort löschen</translation> <translation id="1521774566618522728">Heute aktiv</translation> <translation id="1538801903729528855">Spracheingabe im Web besser nutzen</translation> -<translation id="1543538514740974167">Schneller hierherkommen</translation> <translation id="1544826120773021464">Wenn Sie Ihr Google-Konto verwalten möchten, tippen Sie auf die Schaltfläche "Konto verwalten"</translation> <translation id="1549000191223877751">Zu anderem Fenster wechseln</translation> <translation id="1553358976309200471">Chrome aktualisieren</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Websites</translation> <translation id="4594952190837476234">Diese Offlineseite ist vom <ph name="CREATION_TIME" /> und unterscheidet sich gegebenenfalls von der Onlineversion.</translation> <translation id="4605958867780575332">Element entfernt: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Seiten für später speichern und eine Erinnerung erhalten</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> öffnen</translation> <translation id="4634124774493850572">Passwort verwenden</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 gehacktes Passwort}other{# gehackte Passwörter}}</translation> @@ -853,7 +850,7 @@ <translation id="6864459304226931083">Bild herunterladen</translation> <translation id="6865313869410766144">Formulardaten für automatisches Ausfüllen</translation> <translation id="6882836635272038266">Standardschutz vor Websites, Downloads und Erweiterungen, die als schädlich bekannt sind.</translation> -<translation id="688738109438487280">Vorhandene Daten werden zu <ph name="TO_ACCOUNT" /> hinzugefügt.</translation> +<translation id="688738109438487280">Vorhandene Daten werden zu <ph name="TO_ACCOUNT" /> hinzugefügt</translation> <translation id="6891726759199484455">Entsperren, um Ihr Passwort zu kopieren</translation> <translation id="6896758677409633944">Kopieren</translation> <translation id="6900532703269623216">Erweitertes Safe Browsing</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Wiederhergestellt: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Passwörter</translation> <translation id="7030675613184250187">Sie können Seiten zu Ihrer Leseliste hinzufügen, um sie wiederzufinden oder offline zu lesen</translation> -<translation id="703523980599857277">Startseite ändern</translation> <translation id="7054588988317389591">Bildbeschreibungen abrufen?</translation> <translation id="7055152154916055070">Weiterleitung blockiert:</translation> <translation id="7063006564040364415">Verbindung zum Synchronisierungsserver konnte nicht hergestellt werden.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome ist auf dem neuesten Stand</translation> <translation id="7106762743910369165">Ihr Browser wird von Ihrer Organisation verwaltet</translation> <translation id="7121362699166175603">Löscht den Verlauf und Autovervollständigungen in der Adressleiste. Unter <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> sind möglicherweise weitere Arten von Browserverlaufsdaten für Ihr Google-Konto gespeichert.</translation> -<translation id="7128355412245153445">Sie können sich Ihre Top-Websites und aktuelle Meldungen anzeigen lassen, wenn Sie die Schaltfläche "Startbildschirm" antippen</translation> <translation id="7138678301420049075">Sonstiges</translation> <translation id="7146622961999026732">Diese Websites und Apps scheinen Ihnen wichtig zu sein:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Originalseite<ph name="END_LINK" /> aus <ph name="DOMAIN_NAME" /> laden</translation> @@ -974,7 +969,7 @@ <translation id="7698359219371678927">E-Mail in <ph name="APP_NAME" /> erstellen</translation> <translation id="7704317875155739195">Suchanfragen und URLs automatisch vervollständigen</translation> <translation id="7707922173985738739">Mobile Daten verwenden</translation> -<translation id="7725024127233776428">Seiten, die Sie als Lesezeichen speichern, werden hier angezeigt</translation> +<translation id="7725024127233776428">Seiten, die Sie als Lesezeichen speichern, werden hier angezeigt.</translation> <translation id="7735637452482172701">Mit Displaysperre entsperren</translation> <translation id="7746457520633464754">Chrome sendet die URLs einiger von Ihnen besuchter Seiten, bestimmte Systeminformationen und einige Seiteninhalte an Google, um gefährliche Apps und Websites zu erkennen</translation> <translation id="7757787379047923882">Text geteilt von <ph name="DEVICE_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Wählen Sie <ph name="APP_NAME" /> aus\n2. Tippen Sie auf "Immer"</translation> <translation id="8410695015584479363">Preise beobachten</translation> <translation id="8413126021676339697">Gesamtverlauf anzeigen</translation> -<translation id="8425213833346101688">Ändern</translation> <translation id="8427875596167638501">Vorschau-Tab ist halb geöffnet</translation> <translation id="8428213095426709021">Einstellungen</translation> <translation id="8438566539970814960">Suchanfragen und das Surfen verbessern</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome-Aktivitäten aus Digital Wellbeing entfernen</translation> <translation id="927968626442779827">Verwenden Sie den Lite-Modus in Google Chrome</translation> <translation id="932327136139879170">Startseite</translation> -<translation id="93753284658583800">Startseite geändert</translation> <translation id="938850635132480979">Fehler: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Passphrase eingeben</translation> <translation id="948039501338975565">Liste der Lesezeichenordner</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index b1da74fb..8481409e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Για συγχρονισμό και εξατομίκευση σε διάφορες συσκευές, ενεργοποιήστε τον συγχρονισμό</translation> <translation id="1209206284964581585">Προσωρινή απόκρυψη</translation> <translation id="1227058898775614466">Ιστορικό περιήγησης</translation> -<translation id="1229399675748764149">Ορίστε αυτήν τη σελίδα ως αρχική σελίδα</translation> <translation id="1231733316453485619">Ενεργοποίηση συγχρονισμού;</translation> <translation id="123724288017357924">Επαναφ. τρέχ.σελ. αγνοώντας το περιεχ. κρυφ.μνήμης</translation> <translation id="124678866338384709">Κλείσιμο τρέχουσας καρτέλας</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Διαγραφή κωδικού πρόσβασης</translation> <translation id="1521774566618522728">Ενεργή σήμερα</translation> <translation id="1538801903729528855">Αποκτήστε μια καλύτερη εμπειρία φωνής στον ιστό</translation> -<translation id="1543538514740974167">Για ταχύτερη μετάβαση</translation> <translation id="1544826120773021464">Για να διαχειριστείτε τον Λογαριασμό σας Google, πατήστε το κουμπί Διαχείριση λογαριασμού.</translation> <translation id="1549000191223877751">Μεταβείτε σε άλλο παράθυρο</translation> <translation id="1553358976309200471">Ενημερώστε το Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Ιστότοποι</translation> <translation id="4594952190837476234">Αυτή η σελίδα εκτός σύνδεσης δημιουργήθηκε στις <ph name="CREATION_TIME" /> και μπορεί να διαφέρει από την έκδοση στο διαδίκτυο.</translation> <translation id="4605958867780575332">Το στοιχείο καταργήθηκε <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Αποθηκεύστε σελίδες για αργότερα και λάβετε σχετική υπενθύμιση.</translation> <translation id="4616150815774728855">Ανοίξτε <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Χρήση κωδικού πρόσβασης</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 παραβιασμένος κωδικός πρόσβασης}other{# παραβιασμένοι κωδικοί πρόσβασης}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Έγινε επαναφορά του στοιχείου <ph name="ITEM_TITLE" />.</translation> <translation id="7029809446516969842">Κωδ. πρόσβασης</translation> <translation id="7030675613184250187">Μπορείτε να αποθηκεύσετε σελίδες στη λίστα ανάγνωσής σας για να τις βρείτε ξανά ή να τις διαβάσετε εκτός σύνδεσης.</translation> -<translation id="703523980599857277">Αλλαγή αρχικής σελίδας</translation> <translation id="7054588988317389591">Λήψη περιγραφών εικόνων;</translation> <translation id="7055152154916055070">Αποκλεισμένη ανακατεύθυνση:</translation> <translation id="7063006564040364415">Δεν ήταν δυνατή η σύνδεση στον διακομιστή συγχρονισμού.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Το Chrome έχει ενημερωθεί.</translation> <translation id="7106762743910369165">Η διαχείριση του προγράμματος περιήγησής σας πραγματοποιείται από τον οργανισμό σας.</translation> <translation id="7121362699166175603">Διαγράφει το ιστορικό και τα στοιχεία αυτόματης συμπλήρωσης στη γραμμή διευθύνσεων. Ο Λογαριασμός σας Google ενδέχεται να διαθέτει άλλες μορφές ιστορικού περιήγησης στη διεύθυνση <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Δείτε κορυφαίους ιστοτόπους και τις πιο πρόσφατες ειδήσεις κάθε φορά που πατάτε το κουμπί αρχικής οθόνης.</translation> <translation id="7138678301420049075">Άλλο</translation> <translation id="7146622961999026732">Αυτοί οι ιστότοποι και οι εφαρμογές φαίνονται σημαντικές για εσάς:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Φόρτωση αρχικής σελίδας<ph name="END_LINK" /> από <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Επιλέξτε την εφαρμογή <ph name="APP_NAME" />.\n2. Πατήστε την επιλογή Πάντα.</translation> <translation id="8410695015584479363">Παρακολούθηση τιμών</translation> <translation id="8413126021676339697">Εμφάνιση πλήρους ιστορικού</translation> -<translation id="8425213833346101688">Αλλαγή</translation> <translation id="8427875596167638501">Η καρτέλα προεπισκόπησης έχει ανοίξει κατά το ήμισυ</translation> <translation id="8428213095426709021">Ρυθμίσεις</translation> <translation id="8438566539970814960">Βελτιώστε τις αναζητήσεις και την περιήγηση</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Κατάργηση της δραστηριότητάς σας στο Chrome από το Digital Wellbeing</translation> <translation id="927968626442779827">Χρησιμοποιήστε τη λειτουργία Lite στο Google Chrome.</translation> <translation id="932327136139879170">Αρχική σελίδα</translation> -<translation id="93753284658583800">Η αρχική σελίδα άλλαξε.</translation> <translation id="938850635132480979">Σφάλμα: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Εισαγωγή φράσης πρόσβασης</translation> <translation id="948039501338975565">Λίστα φακέλων σελιδοδεικτών</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index f8bb9b24..5609bb8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">To sync and personalise across devices, turn on sync</translation> <translation id="1209206284964581585">Hide for now</translation> <translation id="1227058898775614466">Navigation history</translation> -<translation id="1229399675748764149">Make this page your home page</translation> <translation id="1231733316453485619">Turn on sync?</translation> <translation id="123724288017357924">Reload the current page, ignoring cached content</translation> <translation id="124678866338384709">Close current tab</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Delete password</translation> <translation id="1521774566618522728">Active today</translation> <translation id="1538801903729528855">Get a better voice experience on the web</translation> -<translation id="1543538514740974167">Get here quicker</translation> <translation id="1544826120773021464">To manage your Google Account, tap the 'Manage account' button</translation> <translation id="1549000191223877751">Move to other window</translation> <translation id="1553358976309200471">Update Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">This offline page is from <ph name="CREATION_TIME" /> and may differ from the online version.</translation> <translation id="4605958867780575332">Item removed: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Save pages for later and get a reminder</translation> <translation id="4616150815774728855">Open <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Use password</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 compromised password}other{# compromised passwords}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Restored <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Passwords</translation> <translation id="7030675613184250187">You can save pages to your reading list to find them again or read offline</translation> -<translation id="703523980599857277">Change home page</translation> <translation id="7054588988317389591">Get image descriptions?</translation> <translation id="7055152154916055070">Redirect blocked:</translation> <translation id="7063006564040364415">Could not connect to the sync server.</translation> @@ -888,12 +884,11 @@ <translation id="7088681679121566888">Chrome is up to date</translation> <translation id="7106762743910369165">Your browser is managed by your organisation</translation> <translation id="7121362699166175603">Clears history and auto-completions in the address bar. Your Google Account may have other forms of browsing history at <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">See your top sites and recent stories whenever you tap the Home button</translation> <translation id="7138678301420049075">Other</translation> <translation id="7146622961999026732">These sites and apps seem important to you:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Load original page<ph name="END_LINK" /> from <ph name="DOMAIN_NAME" /></translation> <translation id="7149893636342594995">Last 24 Hours</translation> -<translation id="7173114856073700355">Open Settings</translation> +<translation id="7173114856073700355">Open settings</translation> <translation id="7177466738963138057">You can change this later in Settings</translation> <translation id="7180611975245234373">Refresh</translation> <translation id="7187993566681480880">Keeps you safe on Chrome and may be used to improve your security in other Google apps when you are signed in.</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Choose <ph name="APP_NAME" />\n2. Tap 'Always'</translation> <translation id="8410695015584479363">Track prices</translation> <translation id="8413126021676339697">Show full history</translation> -<translation id="8425213833346101688">Change</translation> <translation id="8427875596167638501">Preview tab is half-opened</translation> <translation id="8428213095426709021">Settings</translation> <translation id="8438566539970814960">Make searches and browsing better</translation> @@ -1121,7 +1115,7 @@ <translation id="8662811608048051533">Signs you out of most sites.</translation> <translation id="8664979001105139458">File name already exists</translation> <translation id="8683039184091909753">image</translation> -<translation id="8687353297350450808">{N_BARS,plural, =1{Signal Strength Level: # bar}other{Signal Strength Level: # bars}}</translation> +<translation id="8687353297350450808">{N_BARS,plural, =1{Signal strength level: # bar}other{Signal strength level: # bars}}</translation> <translation id="869891660844655955">Expiry date</translation> <translation id="8699120352855309748">Don’t offer to translate these languages</translation> <translation id="8712637175834984815">Got it</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Remove your Chrome activity from Digital Wellbeing</translation> <translation id="927968626442779827">Use lite mode on Google Chrome</translation> <translation id="932327136139879170">Home</translation> -<translation id="93753284658583800">Home page changed</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Enter passphrase</translation> <translation id="948039501338975565">List of bookmark folders</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index bbadda41..a0f6c9a2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Para sincronizar diferentes dispositivos y personalizar tu experiencia, activa la sincronización</translation> <translation id="1209206284964581585">Ocultar por el momento</translation> <translation id="1227058898775614466">Historial de navegación</translation> -<translation id="1229399675748764149">Hacer que esta página sea tu página principal</translation> <translation id="1231733316453485619">¿Quieres activar la sincronización?</translation> <translation id="123724288017357924">Volver a cargar página actual; ignorar contenido en caché</translation> <translation id="124678866338384709">Cerrar la pestaña actual</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Borrar contraseña</translation> <translation id="1521774566618522728">Activo hoy</translation> <translation id="1538801903729528855">Obtén una mejor experiencia de voz en la Web</translation> -<translation id="1543538514740974167">Accede rápidamente</translation> <translation id="1544826120773021464">Para administrar tu Cuenta de Google, presiona el botón "Administrar cuenta"</translation> <translation id="1549000191223877751">Mover a otra ventana</translation> <translation id="1553358976309200471">Actualizar Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sitios</translation> <translation id="4594952190837476234">Esta página sin conexión se creó el <ph name="CREATION_TIME" /> y es posible que sea diferente con respecto a la versión en línea.</translation> <translation id="4605958867780575332">Se quitó el siguiente elemento: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Guarda páginas para verlas más tarde y establece un recordatorio.</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Usar contraseña</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contraseña hackeada}other{# contraseñas hackeadas}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Se restableció <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Contraseñas</translation> <translation id="7030675613184250187">Puedes guardar páginas en tu lista de lectura para volver a ellas más tarde y leerlas sin conexión</translation> -<translation id="703523980599857277">Cambiar la página principal</translation> <translation id="7054588988317389591">¿Deseas obtener la descripción de las imágenes?</translation> <translation id="7055152154916055070">Se bloqueó el redireccionamiento:</translation> <translation id="7063006564040364415">No se pudo establecer conexión con el servidor de sincronización.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome está actualizado</translation> <translation id="7106762743910369165">Tu organización administra el navegador.</translation> <translation id="7121362699166175603">Borra el historial y las sugerencias de autocompletado en la barra de direcciones. Es posible que tu cuenta de Google tenga otros formularios del historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Mira tus historias recientes y sitios populares cuando presionas el botón de inicio</translation> <translation id="7138678301420049075">Otros</translation> <translation id="7146622961999026732">Estos sitios y apps parecen importantes para ti:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Cargar página original<ph name="END_LINK" /> de <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Elige <ph name="APP_NAME" />.\n2. Presiona "Siempre".</translation> <translation id="8410695015584479363">Seguimiento de precios</translation> <translation id="8413126021676339697">Mostrar historial completo</translation> -<translation id="8425213833346101688">Cambiar</translation> <translation id="8427875596167638501">La pestaña de vista previa está abierta a la mitad</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8438566539970814960">Mejorar las búsquedas y la navegación</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Quita tu actividad en Chrome de Bienestar digital</translation> <translation id="927968626442779827">Usa el modo lite en Google Chrome</translation> <translation id="932327136139879170">Página principal</translation> -<translation id="93753284658583800">Se cambió la página principal</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ingresar frase de contraseña</translation> <translation id="948039501338975565">Lista de carpetas de favoritos</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 1bbd9ac6..549be57f3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Activa la sincronización para sincronizar y personalizar todos tus dispositivos</translation> <translation id="1209206284964581585">Ocultar por ahora</translation> <translation id="1227058898775614466">Historial de navegación</translation> -<translation id="1229399675748764149">Establecer esta página como principal</translation> <translation id="1231733316453485619">¿Activar sincronización?</translation> <translation id="123724288017357924">Vuelve a cargar esta página sin contenido en caché</translation> <translation id="124678866338384709">Cierra la pestaña actual</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Eliminar contraseña</translation> <translation id="1521774566618522728">Activo hoy</translation> <translation id="1538801903729528855">Consigue una mejor experiencia por voz en la Web</translation> -<translation id="1543538514740974167">Accede a esta página más rápido</translation> <translation id="1544826120773021464">Para gestionar tu cuenta de Google, toca el botón Gestionar cuenta</translation> <translation id="1549000191223877751">Mover a otra ventana</translation> <translation id="1553358976309200471">Actualizar Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sitios web</translation> <translation id="4594952190837476234">Esta página sin conexión se creó el <ph name="CREATION_TIME" /> y puede ser distinta de la versión online.</translation> <translation id="4605958867780575332">Elemento retirado: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Guarda páginas para después y recibe un recordatorio</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Utilizar contraseña</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contraseña vulnerada}other{# contraseñas vulneradas}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Se ha restaurado <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Contraseñas</translation> <translation id="7030675613184250187">Puedes guardar páginas en tu lista de lectura para volver a encontrarlas o leerlas sin conexión</translation> -<translation id="703523980599857277">Cambiar página principal</translation> <translation id="7054588988317389591">¿Generar descripciones de imágenes?</translation> <translation id="7055152154916055070">Redirección bloqueada:</translation> <translation id="7063006564040364415">No se ha podido conectar con el servidor de sincronización.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome está actualizado</translation> <translation id="7106762743910369165">Tu organización es la encargada de gestionar tu navegador</translation> <translation id="7121362699166175603">Borra el historial y los autocompletados de la barra de direcciones. Es posible que tu cuenta de Google tenga otros tipos de historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Accede a tus sitios web favoritos y a tus historias recientes al tocar el botón de página principal</translation> <translation id="7138678301420049075">Otro</translation> <translation id="7146622961999026732">Parece que estos sitios y estas aplicaciones son importantes para ti:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Cargar página original<ph name="END_LINK" /> de <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Elige <ph name="APP_NAME" />\n2. Toca "Siempre"</translation> <translation id="8410695015584479363">Seguir precios</translation> <translation id="8413126021676339697">Mostrar historial completo</translation> -<translation id="8425213833346101688">Cambiar</translation> <translation id="8427875596167638501">La pestaña de vista previa está medio abierta</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8438566539970814960">Mejorar las búsquedas y la navegación</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Eliminar tu actividad de Chrome de Bienestar digital</translation> <translation id="927968626442779827">Usa el modo básico en Google Chrome</translation> <translation id="932327136139879170">Página principal</translation> -<translation id="93753284658583800">Página principal cambiada</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introducir frase de contraseña</translation> <translation id="948039501338975565">Lista de carpetas de marcadores</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 63a8a90..5170f24 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Seadmete vahel sünkroonimiseks ja isikupärastamiseks lülitage sünkroonimine sisse</translation> <translation id="1209206284964581585">Peida praeguseks</translation> <translation id="1227058898775614466">Navigeerimise ajalugu</translation> -<translation id="1229399675748764149">Muutke see leht oma avaleheks</translation> <translation id="1231733316453485619">Kas lülitada sünkroonimine sisse?</translation> <translation id="123724288017357924">Praeguse lehe uuesti laadimine, eirates vahemälus olevat sisu</translation> <translation id="124678866338384709">Aktiivse vahelehe sulgemine</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Kustuta parool</translation> <translation id="1521774566618522728">Aktiivne täna</translation> <translation id="1538801903729528855">Parem häälotsingu kasutuskogemus veebis</translation> -<translation id="1543538514740974167">Jõudke siia kiiremini</translation> <translation id="1544826120773021464">Oma Google'i konto haldamiseks puudutage nuppu „Konto haldamine”</translation> <translation id="1549000191223877751">Teisalda teise aknasse</translation> <translation id="1553358976309200471">Värskenda Chrome'i</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Saidid</translation> <translation id="4594952190837476234">Võrguühenduseta leht loodi <ph name="CREATION_TIME" /> ja see võib veebiversioonist erineda.</translation> <translation id="4605958867780575332">Üksus on eemaldatud: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Salvestage lehed hiljem kasutamiseks ja laske saata meeldetuletus</translation> <translation id="4616150815774728855">Ava <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Kasuta parooli</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 parool on ohus}other{# parooli on ohus}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Taastati <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Paroolid</translation> <translation id="7030675613184250187">Saate oma lehed salvestada lugemisloendisse, et need hiljem leida või neid võrguühenduseta lugeda</translation> -<translation id="703523980599857277">Avalehe muutmine</translation> <translation id="7054588988317389591">Kas saada piltide kirjeldusi?</translation> <translation id="7055152154916055070">Ümbersuunamine blokeeriti:</translation> <translation id="7063006564040364415">Sünkroonimisserveriga ei saanud ühendust.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome on ajakohane</translation> <translation id="7106762743910369165">Teie brauserit haldab teie organisatsioon</translation> <translation id="7121362699166175603">Kustutab aadressiribalt ajaloo ja automaatse täitmise andmed. Aadressil <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> võib teie Google'i kontol olla muus vormis sirvimisajalugu.</translation> -<translation id="7128355412245153445">Näete avalehe nuppu puudutades oma sageli külastatud saite ja hiljutisi lugusid</translation> <translation id="7138678301420049075">Muu</translation> <translation id="7146622961999026732">Näib, et need saidid ja rakendused on teile olulised:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Laadi originaalleht<ph name="END_LINK" /> domeenilt <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Valige <ph name="APP_NAME" />\n2. Puudutage valikut „Alati”</translation> <translation id="8410695015584479363">Jälgi hindu</translation> <translation id="8413126021676339697">Kuva kogu ajalugu</translation> -<translation id="8425213833346101688">Muuda</translation> <translation id="8427875596167638501">Eelvaate vaheleht on pooleldi avatud</translation> <translation id="8428213095426709021">Seaded</translation> <translation id="8438566539970814960">Otsingute ja sirvimise paremaks muutmine</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome'i tegevuste eemaldamine teenusest Digitaalne heaolu</translation> <translation id="927968626442779827">Kasutage Google Chrome'is lihtsustatud režiimi</translation> <translation id="932327136139879170">Kodu</translation> -<translation id="93753284658583800">Avalehte muudeti</translation> <translation id="938850635132480979">Viga: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Sisesta parool</translation> <translation id="948039501338975565">Järjehoidjakaustade loend</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 5691b745..f97e9c9a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Gailu guztiak sinkronizatu eta pertsonalizatzeko, aktibatu sinkronizazioa</translation> <translation id="1209206284964581585">Ezkutatu</translation> <translation id="1227058898775614466">Nabigazio-historia</translation> -<translation id="1229399675748764149">Ezarri orri hau orri nagusi gisa</translation> <translation id="1231733316453485619">Sinkronizazioa aktibatu nahi duzu?</translation> <translation id="123724288017357924">Kargatu orria, cacheko edukiari ez ikusi eginda</translation> <translation id="124678866338384709">Itxi uneko fitxa</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Ezabatu pasahitza</translation> <translation id="1521774566618522728">Aktibo gaur</translation> <translation id="1538801903729528855">Lortu ahots-esperientzia hobea sarean</translation> -<translation id="1543538514740974167">Iritsi hona azkarrago</translation> <translation id="1544826120773021464">Google-ko kontua kudeatzeko, sakatu "Kudeatu kontua" botoia</translation> <translation id="1549000191223877751">Eraman beste leiho batera</translation> <translation id="1553358976309200471">Eguneratu Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Webguneak</translation> <translation id="4594952190837476234">Konexiorik gabe erabiltzeko orri hau <ph name="CREATION_TIME" /> datan sortu zen. Ondorioz, baliteke sareko bertsioarekin bat ez etortzea.</translation> <translation id="4605958867780575332">Kendu da elementua: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Gorde orriak gerorako eta jaso abisu bat</translation> <translation id="4616150815774728855">Ireki <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Erabili pasahitza</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 pasahitz dago arriskuan}other{# pasahitz daude arriskuan}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Leheneratu da <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Pasahitzak</translation> <translation id="7030675613184250187">Orriak irakurketa-zerrendan gorde ditzakezu, hurrengo batean erraz aurkitzeko edo konexiorik ez duzunean irakurtzeko</translation> -<translation id="703523980599857277">Aldatu orri nagusia</translation> <translation id="7054588988317389591">Irudi-deskribapenak lortu nahi dituzu?</translation> <translation id="7055152154916055070">Birbideratze hau blokeatu da:</translation> <translation id="7063006564040364415">Ezin izan da sinkronizazio-zerbitzarira konektatu</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Eguneratuta dago Chrome</translation> <translation id="7106762743910369165">Zure erakundeak kudeatzen du arakatzailea</translation> <translation id="7121362699166175603">Helbide-barrako historia eta osatze automatikoak garbitzen ditu. Google-ko kontuko historia arakatzeko beste modu batzuk aurki zenitzake <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunean.</translation> -<translation id="7128355412245153445">Ikusi webgune nagusiak eta duela gutxiko istorioak Hasiera botoia sakatzen duzunean</translation> <translation id="7138678301420049075">Beste bat</translation> <translation id="7146622961999026732">Webgune eta aplikazio hauek garrantzitsuak dira zuretzat:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Kargatu jatorrizko orria<ph name="END_LINK" /> <ph name="DOMAIN_NAME" /> domeinutik</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Aukeratu <ph name="APP_NAME" />.\n2. Sakatu "Beti".</translation> <translation id="8410695015584479363">Egin prezioen jarraipena</translation> <translation id="8413126021676339697">Erakutsi historia osoa</translation> -<translation id="8425213833346101688">Aldatu</translation> <translation id="8427875596167638501">Aurrebista-fitxa erdiirekita dago</translation> <translation id="8428213095426709021">Ezarpenak</translation> <translation id="8438566539970814960">Hobetu bilaketak eta arakatze-jarduerak</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Kendu Chrome-ko jarduerak Ongizate digitala programatik</translation> <translation id="927968626442779827">Erabili oinarrizko modua Google Chrome-n</translation> <translation id="932327136139879170">Hasiera</translation> -<translation id="93753284658583800">Aldatu da orri nagusia</translation> <translation id="938850635132480979">Errorea: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Idatzi pasaesaldia</translation> <translation id="948039501338975565">Laster-marken karpeten zerrenda</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 4b82ee2..a39bbb1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">برای همگامسازی و شخصیسازی در همه دستگاهها، همگامسازی را روشن کنید</translation> <translation id="1209206284964581585">فعلاً پنهان شود</translation> <translation id="1227058898775614466">سابقه پیمایش</translation> -<translation id="1229399675748764149">تنظیم این صفحه بهعنوان صفحه اصلی</translation> <translation id="1231733316453485619">همگامسازی روشن شود؟</translation> <translation id="123724288017357924">تازهسازی صفحه اصلی با نادیده گرفتن محتوای حافظه پنهان</translation> <translation id="124678866338384709">بستن برگه کنونی</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">حذف گذرواژه</translation> <translation id="1521774566618522728">امروز فعال بود</translation> <translation id="1538801903729528855">تجربه گفتاری بهتری در وب داشته باشید</translation> -<translation id="1543538514740974167">دسترسی سریعتر بهاینجا</translation> <translation id="1544826120773021464">برای مدیریت تنظیمات حساب Google، روی دکمه «مدیریت حساب» ضربه بزنید</translation> <translation id="1549000191223877751">انتقال به پنجره دیگر</translation> <translation id="1553358976309200471">بهروزرسانی Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">سایتها</translation> <translation id="4594952190837476234">این صفحه آفلاین مربوط به تاریخ <ph name="CREATION_TIME" /> است و ممکن است با نسخه آنلاین متفاوت باشد.</translation> <translation id="4605958867780575332">مورد حذف شد: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ذخیره کردن صفحهها برای خواندن در فرصتی دیگر و دریافت یادآوری</translation> <translation id="4616150815774728855">باز کردن <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">استفاده از گذرواژه</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{۱ گذرواژه لورفته}one{# گذرواژه لورفته}other{# گذرواژه لورفته}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">تاریخ بازیابی <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">گذرواژهها</translation> <translation id="7030675613184250187">میتوانید صفحات را در فهرست خواندن ذخیره کنید تا دوباره آنها را پیدا کنید یا درحالت آفلاین آنها را بخوانید</translation> -<translation id="703523980599857277">تغییر صفحه اصلی</translation> <translation id="7054588988317389591">توضیحات تصویر دریافت شود؟</translation> <translation id="7055152154916055070">هدایت کردن مسدود شده است:</translation> <translation id="7063006564040364415">اتصال به سرور همگامسازی ممکن نیست.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome بهروز است</translation> <translation id="7106762743910369165">سازمانتان مرورگر را مدیریت میکند</translation> <translation id="7121362699166175603">سابقه و تکمیلهای خودکار را در نوار نشانی پاک میکند. ممکن است حساب Google شما اشکال دیگری از سابقه مرور در <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> داشته باشد.</translation> -<translation id="7128355412245153445">هرزمان روی دکمه صفحه اصلی ضربه بزنید، سایتهای برتر و داستانهای اخیر خود را میبینید</translation> <translation id="7138678301420049075">دیگر</translation> <translation id="7146622961999026732">بهنظر میرسد این سایتها و برنامهها برای شما مهم هستند:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />بار کردن صفحه اصلی<ph name="END_LINK" /> از <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">۱. <ph name="APP_NAME" /> را انتخاب کنید\n۲. روی «همیشه» ضربه بزنید</translation> <translation id="8410695015584479363">پیگیری قیمت</translation> <translation id="8413126021676339697">نمایش کل سابقه</translation> -<translation id="8425213833346101688">تغییر</translation> <translation id="8427875596167638501">برگه پیشنمایش نیمهباز است</translation> <translation id="8428213095426709021">تنظیمات</translation> <translation id="8438566539970814960">بهبود جستجوها و مرور</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">فعالیت Chrome شما از «آسایش دیجیتالی» برداشته شود</translation> <translation id="927968626442779827">استفاده از «حالت ساده» در Google Chrome</translation> <translation id="932327136139879170">منزل</translation> -<translation id="93753284658583800">صفحه اصلی تغییر کرد</translation> <translation id="938850635132480979">خطا: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">عبارت ورود را وارد کنید</translation> <translation id="948039501338975565">فهرست پوشههای نشانک</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 7b38df36..47984d8a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Ota synkronointi käyttöön, niin sisältö synkronoidaan ja yksilöidään eri laitteilla</translation> <translation id="1209206284964581585">Piilota toistaiseksi</translation> <translation id="1227058898775614466">Navigointihistoria</translation> -<translation id="1229399675748764149">Tee tästä etusivusi</translation> <translation id="1231733316453485619">Otetaanko synkronointi käyttöön?</translation> <translation id="123724288017357924">Päivitä nykyinen sivu, ohita välimuistin sisältö</translation> <translation id="124678866338384709">Sulje nykyinen välilehti</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Poista salasana</translation> <translation id="1521774566618522728">Aktiivinen tänään</translation> <translation id="1538801903729528855">Käytä verkkoa sujuvammin äänikomennoilla</translation> -<translation id="1543538514740974167">Tule tänne nopeammin</translation> <translation id="1544826120773021464">Voit ylläpitää Google-tiliäsi napauttamalla Ylläpidä tiliä ‑painiketta</translation> <translation id="1549000191223877751">Siirrä toiseen ikkunaan</translation> <translation id="1553358976309200471">Päivitä Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sivustot</translation> <translation id="4594952190837476234">Offline-sivu vastaa tilannetta <ph name="CREATION_TIME" /> ja saattaa poiketa nykyisestä verkkoversiosta.</translation> <translation id="4605958867780575332">Kohde poistettiin: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Tallenna sivuja myöhemmin luettavaksi, saat muistutuksen</translation> <translation id="4616150815774728855">Avaa <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Käytä salasanaa</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 vaarantunut salasana}other{# vaarantunutta salasanaa}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> palautettu</translation> <translation id="7029809446516969842">Salasanat</translation> <translation id="7030675613184250187">Voit tallentaa sivuja lukulistallesi myöhempää käyttöä tai offline-tilassa lukemista varten</translation> -<translation id="703523980599857277">Vaihda etusivua</translation> <translation id="7054588988317389591">Muodostetaanko kuvaselitykset?</translation> <translation id="7055152154916055070">Uudelleenohjaus estetty:</translation> <translation id="7063006564040364415">Synkronointipalvelimeen ei saada yhteyttä.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome on ajan tasalla</translation> <translation id="7106762743910369165">Organisaatiosi ylläpitää selainta</translation> <translation id="7121362699166175603">Tyhjentää historian ja osoitekentän automaattiset täydennykset. Google-tililläsi voi olla muita selaushistoriatietoja osoitteessa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Näet suosituimmat sivustosi ja tuoreet jutut napauttaessasi aloitusnäyttöpainiketta</translation> <translation id="7138678301420049075">Muu</translation> <translation id="7146622961999026732">Nämä sivustot ja sovellukset vaikuttavat olevan tärkeitä sinulle:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Lataa alkuperäinen sivu<ph name="END_LINK" /> osoitteesta <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Valitse <ph name="APP_NAME" />\n2. Valitse Aina</translation> <translation id="8410695015584479363">Seuraa hintoja</translation> <translation id="8413126021676339697">Näytä koko selaushistoria</translation> -<translation id="8425213833346101688">Vaihda</translation> <translation id="8427875596167638501">Esikatseluvälilehti on puoliksi auki</translation> <translation id="8428213095426709021">Asetukset</translation> <translation id="8438566539970814960">Paranna hakuja ja selausta</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Poista Chrome-toimintasi Digitaalisesta hyvinvoinnista</translation> <translation id="927968626442779827">Käytä Yksinkertaistettua tilaa Google Chromessa</translation> <translation id="932327136139879170">Etusivu</translation> -<translation id="93753284658583800">Etusivu muutettu</translation> <translation id="938850635132480979">(Virhe: <ph name="ERROR_CODE" />)</translation> <translation id="939598580284253335">Anna tunnuslause</translation> <translation id="948039501338975565">Kirjanmerkkikansioiden lista</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 6aa0b318..d77291f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Para mag-sync at mag-personalize sa mga device, i-on ang pag-sync</translation> <translation id="1209206284964581585">Itago sa ngayon</translation> <translation id="1227058898775614466">History ng pag-navigate</translation> -<translation id="1229399675748764149">Gawing homepage mo ang page na ito</translation> <translation id="1231733316453485619">I-on ang pag-sync?</translation> <translation id="123724288017357924">I-reload ang page, balewalain ang cached content</translation> <translation id="124678866338384709">Isara ang kasalukuyang tab</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">I-delete ang password</translation> <translation id="1521774566618522728">Aktibo ngayong araw</translation> <translation id="1538801903729528855">Makakuha ng mas magandang karanasan sa boses sa web</translation> -<translation id="1543538514740974167">Mas mabilis na makapunta rito</translation> <translation id="1544826120773021464">Para pamahalaan ang iyong Google account, i-tap ang button na "Pamahalaan ang account"</translation> <translation id="1549000191223877751">Lumipat sa ibang window</translation> <translation id="1553358976309200471">I-update ang Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Mga Site</translation> <translation id="4594952190837476234">Naka-offline ang page na ito mula noong <ph name="CREATION_TIME" /> at maaaring iba ito sa online na bersyon.</translation> <translation id="4605958867780575332">Naalis na item: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">I-save ang mga page para sa ibang pagkakataon at makatanggap ng paalala</translation> <translation id="4616150815774728855">Buksan ang <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Gamitin ang password</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 nakompromisong password}one{# nakompromisong password}other{# na nakompromisong password}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Na-restore noong <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Mga Password</translation> <translation id="7030675613184250187">Puwede kang mag-save ng mga page sa iyong listahan ng babasahin para mahanap ulit o mabasa nang offline ang mga iyon</translation> -<translation id="703523980599857277">Baguhin ang homepage</translation> <translation id="7054588988317389591">Makakuha ng mga paglalarawan ng larawan?</translation> <translation id="7055152154916055070">Na-block ang pag-redirect:</translation> <translation id="7063006564040364415">Hindi makakonekta sa server ng pag-sync.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Updated ang Chrome</translation> <translation id="7106762743910369165">Pinapamahalaan ng iyong organisasyon ang browser mo</translation> <translation id="7121362699166175603">Kini-clear ang history at mga autocompletion sa address bar. Maaaring may iba pang anyo ng history ng pag-browse ang iyong Google Account sa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Makita ang iyong mga nangungunang site at kamakailang kuwento sa tuwing ita-tap mo ang button ng Home</translation> <translation id="7138678301420049075">Iba pa</translation> <translation id="7146622961999026732">Mukhang mahalaga sa iyo ang mga site at app na ito:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />I-load ang orihinal na page<ph name="END_LINK" /> mula sa <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Piliin ang <ph name="APP_NAME" />\n2. I-tap ang “Palagi”</translation> <translation id="8410695015584479363">I-track ang mga presyo</translation> <translation id="8413126021676339697">Ipakita ang buong history</translation> -<translation id="8425213833346101688">Baguhin</translation> <translation id="8427875596167638501">Nakabukas nang kalahati ang tab na preview</translation> <translation id="8428213095426709021">Mga Setting</translation> <translation id="8438566539970814960">Mas pahusayin ang mga paghahanap at pag-browse</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Alisin sa Digital Wellness ang iyong aktibidad sa Chrome</translation> <translation id="927968626442779827">Gamitin ang Lite mode sa Google Chrome</translation> <translation id="932327136139879170">Home</translation> -<translation id="93753284658583800">Binago ang homepage</translation> <translation id="938850635132480979">Error: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ilagay ang passphrase</translation> <translation id="948039501338975565">Listahan ng mga folder ng bookmark</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index bf090259..2f192ee 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Pour profiter de la synchronisation et d'une expérience personnalisée sur tous vos appareils, activez la synchronisation</translation> <translation id="1209206284964581585">Masquer pour l'instant</translation> <translation id="1227058898775614466">Historique de navigation</translation> -<translation id="1229399675748764149">Faire de cette page votre page d'accueil</translation> <translation id="1231733316453485619">Activer la synchronisation?</translation> <translation id="123724288017357924">Actualiser la page, ignorer le contenu mis en cache</translation> <translation id="124678866338384709">Fermer l'onglet actuel</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Supprimer le mot de passe</translation> <translation id="1521774566618522728">Actif aujourd'hui</translation> <translation id="1538801903729528855">Une meilleure expérience vocale sur le Web</translation> -<translation id="1543538514740974167">Arrivez ici plus rapidement</translation> <translation id="1544826120773021464">Pour gérer votre compte Google, touchez le bouton « Gérer le compte »</translation> <translation id="1549000191223877751">Déplacer vers autre fenêtre</translation> <translation id="1553358976309200471">Mettre à jour Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">Cette page hors connexion a été créée le <ph name="CREATION_TIME" /> et peut différer de la version en ligne.</translation> <translation id="4605958867780575332">Élément supprimé : <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Enregistrer des pages pour plus tard et recevoir un rappel</translation> <translation id="4616150815774728855">Ouvrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Utiliser le mot de passe</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 mot de passe compromis}one{# mot de passe compromis}other{# mots de passe compromis}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Élément restauré : <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Mots de passe</translation> <translation id="7030675613184250187">Vous pouvez enregistrer des pages dans votre liste de lecture pour les retrouver plus tard ou pour les lire hors ligne</translation> -<translation id="703523980599857277">Modifier la page d'accueil</translation> <translation id="7054588988317389591">Obtenir les descriptions d'images?</translation> <translation id="7055152154916055070">Redirection bloquée :</translation> <translation id="7063006564040364415">Échec de connexion au serveur de synchronisation.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome est à jour</translation> <translation id="7106762743910369165">Votre navigateur est géré par votre organisation</translation> <translation id="7121362699166175603">Efface l'historique et les saisies semi-automatiques dans la barre d'adresse. D'autres formes d'historique de navigation peuvent exister sur votre compte Google à l'adresse <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Consultez vos sites les plus fréquentés et vos histoires récentes lorsque vous appuyez sur la touche d'accueil</translation> <translation id="7138678301420049075">Autre</translation> <translation id="7146622961999026732">Ces applications et ces sites semblent importants pour vous :</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Charger la page d'origine<ph name="END_LINK" /> à partir de <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Sélectionnez <ph name="APP_NAME" />\n2. Touchez « Toujours »</translation> <translation id="8410695015584479363">Suivre les prix</translation> <translation id="8413126021676339697">Afficher l'historique complet</translation> -<translation id="8425213833346101688">Modifier</translation> <translation id="8427875596167638501">L'onglet d'aperçu est ouvert à moitié</translation> <translation id="8428213095426709021">Paramètres</translation> <translation id="8438566539970814960">Amélioration des recherches et de la navigation</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Supprimer votre activité Chrome de Bien-être numérique</translation> <translation id="927968626442779827">Utilisez le mode simplifié dans Google Chrome</translation> <translation id="932327136139879170">Accueil</translation> -<translation id="93753284658583800">La page d'accueil a été modifiée</translation> <translation id="938850635132480979">Erreur : <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Entrer la phrase de passe</translation> <translation id="948039501338975565">Liste des dossiers de favoris</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 745def1..9957aaf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Activez la synchronisation pour accéder à vos données et les personnaliser sur tous vos appareils</translation> <translation id="1209206284964581585">Masquer pour le moment</translation> <translation id="1227058898775614466">Historique de navigation</translation> -<translation id="1229399675748764149">Définir cette page comme page d'accueil</translation> <translation id="1231733316453485619">Activer la synchronisation ?</translation> <translation id="123724288017357924">Actualiser page active et ignorer contenu en cache</translation> <translation id="124678866338384709">Fermer l'onglet actuel</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Supprimer le mot de passe</translation> <translation id="1521774566618522728">Actif aujourd'hui</translation> <translation id="1538801903729528855">Une meilleure expérience vocale sur le Web</translation> -<translation id="1543538514740974167">Accédez plus rapidement à cette page</translation> <translation id="1544826120773021464">Pour gérer votre compte Google, appuyez sur le bouton "Gérer le compte"</translation> <translation id="1549000191223877751">Déplacer vers autre fenêtre</translation> <translation id="1553358976309200471">Mettre à jour Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">Cette page hors connexion date du <ph name="CREATION_TIME" /> et peut différer de la version en ligne.</translation> <translation id="4605958867780575332">Élément supprimé : <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Enregistrer les pages pour plus tard et recevoir un rappel</translation> <translation id="4616150815774728855">Ouvrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Utiliser le mot de passe</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 mot de passe compromis}one{# mot de passe compromis}other{# mots de passe compromis}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Téléchargement <ph name="ITEM_TITLE" /> restauré</translation> <translation id="7029809446516969842">Mots de passe</translation> <translation id="7030675613184250187">Vous pouvez enregistrer des pages dans votre liste de lecture pour les retrouver facilement plus tard ou les consulter hors connexion</translation> -<translation id="703523980599857277">Changer de page d'accueil</translation> <translation id="7054588988317389591">Obtenir les descriptions d'images ?</translation> <translation id="7055152154916055070">Redirection bloquée :</translation> <translation id="7063006564040364415">Impossible de se connecter au serveur de synchronisation.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome est à jour</translation> <translation id="7106762743910369165">Votre navigateur est géré par votre organisation</translation> <translation id="7121362699166175603">Efface l'historique et les saisies semi-automatiques dans la barre d'adresse. Votre compte Google conserve peut-être d'autres formes d'historique de navigation sur la page <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Appuyez sur le bouton d'accueil pour retrouver les sites que vous consultez le plus et les articles que vous avez récemment lus</translation> <translation id="7138678301420049075">Autre</translation> <translation id="7146622961999026732">Ces sites et applications semblent importants pour vous :</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Charger la page originale<ph name="END_LINK" /> de <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Sélectionnez <ph name="APP_NAME" />\n2. Appuyez sur "Toujours"</translation> <translation id="8410695015584479363">Suivre les prix</translation> <translation id="8413126021676339697">Afficher l'historique complet</translation> -<translation id="8425213833346101688">Modifier</translation> <translation id="8427875596167638501">L'onglet "Aperçu" est ouvert à moitié</translation> <translation id="8428213095426709021">Paramètres</translation> <translation id="8438566539970814960">Améliorer les recherches et la navigation</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Supprimer votre activité Chrome de Bien-être numérique</translation> <translation id="927968626442779827">Utilisez le mode simplifié dans Google Chrome</translation> <translation id="932327136139879170">Accueil</translation> -<translation id="93753284658583800">Page d'accueil modifiée</translation> <translation id="938850635132480979">Erreur <ph name="ERROR_CODE" />.</translation> <translation id="939598580284253335">Saisir la phrase secrète</translation> <translation id="948039501338975565">Liste des dossiers de favoris</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index f01931f..7a5ac1e9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Activa a sincronización para personalizar todos os teus dispositivos e sincronizalos</translation> <translation id="1209206284964581585">Ocultar por agora</translation> <translation id="1227058898775614466">Historial de navegación</translation> -<translation id="1229399675748764149">Fai que esta sexa a túa páxina de inicio</translation> <translation id="1231733316453485619">Queres activar a sincronización?</translation> <translation id="123724288017357924">Cargar a páxina, ignorando o contido da caché</translation> <translation id="124678866338384709">Pechar a pestana actual</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Eliminar contrasinal</translation> <translation id="1521774566618522728">Dispositivo activo hoxe</translation> <translation id="1538801903729528855">Mellora a túa experiencia de busca por voz na Web</translation> -<translation id="1543538514740974167">Accede aquí máis rápido</translation> <translation id="1544826120773021464">Para xestionar a túa conta de Google, toca o botón Xestionar conta</translation> <translation id="1549000191223877751">Mover a outra ventá</translation> <translation id="1553358976309200471">Actualizar Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sitios</translation> <translation id="4594952190837476234">Esta páxina sen conexión creouse o <ph name="CREATION_TIME" /> e pode ser diferente da versión en liña.</translation> <translation id="4605958867780575332">Elemento eliminado: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Garda páxinas para acceder a elas máis tarde e recibe un recordatorio</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Usar contrasinal</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 contrasinal vulnerado}other{# contrasinais vulnerados}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Restaurouse <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Contrasinais</translation> <translation id="7030675613184250187">Podes gardar páxinas na túa lista de lecturas para atopalas de novo ou lelas sen conexión</translation> -<translation id="703523980599857277">Cambiar páxina de inicio</translation> <translation id="7054588988317389591">Queres obter descricións de imaxes?</translation> <translation id="7055152154916055070">Bloqueouse unha redirección:</translation> <translation id="7063006564040364415">Non se puido conectar co servidor de sincronización.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome está actualizado</translation> <translation id="7106762743910369165">A túa organización xestiona o teu navegador</translation> <translation id="7121362699166175603">Borra o historial e os completados automáticos na barra de enderezos. É posible que a túa conta de Google teña outras formas do historial de navegación en <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Consulta os teus sitios principais e as túas historias recentes sempre que toques o botón de inicio</translation> <translation id="7138678301420049075">Outros</translation> <translation id="7146622961999026732">Estes sitios e aplicacións parecen importantes para ti:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Cargar páxina orixinal<ph name="END_LINK" /> desde <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Escolle <ph name="APP_NAME" />\n2. Toca Sempre</translation> <translation id="8410695015584479363">Facer seguimento de prezos</translation> <translation id="8413126021676339697">Mostrar historial completo</translation> -<translation id="8425213833346101688">Cambiar</translation> <translation id="8427875596167638501">A pestana de vista previa abriuse ata a metade</translation> <translation id="8428213095426709021">Configuración</translation> <translation id="8438566539970814960">Mellorar as buscas e a navegación</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Quitar a túa actividade de Chrome de Benestar dixital</translation> <translation id="927968626442779827">Usa o modo básico en Google Chrome</translation> <translation id="932327136139879170">Inicio</translation> -<translation id="93753284658583800">A páxina de inicio cambiou</translation> <translation id="938850635132480979">Erro: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introducir frase de acceso</translation> <translation id="948039501338975565">Lista de cartafoles de marcadores</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 0a3ab55b..f42ba053 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">સમગ્ર ઉપકરણોમાં સિંક તથા વ્યક્તિગત કરવા માટે સિંક ચાલુ કરો</translation> <translation id="1209206284964581585">હમણાં માટે છુપાવો</translation> <translation id="1227058898775614466">નૅવિગેશન ઇતિહાસ</translation> -<translation id="1229399675748764149">આ પેજને તમારું હોમપેજ બનાવો</translation> <translation id="1231733316453485619">સિંક કરવાનું ચાલુ કરીએ?</translation> <translation id="123724288017357924">કૅશ કરેલ કન્ટેન્ટને અવગણીને વર્તમાન પેજ ફરીથી લોડ કરો</translation> <translation id="124678866338384709">વર્તમાન ટૅબ બંધ કરો</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">પાસવર્ડ ડિલીટ કરો</translation> <translation id="1521774566618522728">આજે સક્રિય છે</translation> <translation id="1538801903729528855">વેબ પર બહેતર વૉઇસ અનુભવ મેળવો</translation> -<translation id="1543538514740974167">અહીં ઝડપથી મેળવો</translation> <translation id="1544826120773021464">તમારું Google એકાઉન્ટ મેનેજ કરવા માટે, "એકાઉન્ટ મેનેજ કરો" બટન પર ટૅપ કરો</translation> <translation id="1549000191223877751">અન્ય વિંડો પર ખસેડો</translation> <translation id="1553358976309200471">Chrome અપડેટ કરો</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">સાઇટ</translation> <translation id="4594952190837476234">આ ઑફલાઇન પેજ <ph name="CREATION_TIME" /> ના રોજનું છે અને તે ઑનલાઇન વર્ઝનથી અલગ હોઈ શકે છે.</translation> <translation id="4605958867780575332">આઇટમ દૂર કરી: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">પેજને ભવિષ્ય માટે સાચવો અને રિમાઇન્ડર મેળવો</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ખોલો</translation> <translation id="4634124774493850572">પાસવર્ડનો ઉપયોગ કરો</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{ચેડાં કરાયેલો 1 પાસવર્ડ}one{ચેડાં કરાયેલો # પાસવર્ડ}other{ચેડાં કરાયેલા # પાસવર્ડ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> રિસ્ટોર કર્યું</translation> <translation id="7029809446516969842">પાસવર્ડ</translation> <translation id="7030675613184250187">તમે પેજને ફરીથી શોધવા અથવા ઑફલાઇન વાંચવા માટે તેને તમારી વાંચન સૂચિમાં સાચવી શકો છો</translation> -<translation id="703523980599857277">હોમ પેજ બદલો</translation> <translation id="7054588988317389591">છબીના વર્ણનો મેળવીએ?</translation> <translation id="7055152154916055070">રીડાયરેક્ટ કરવાનું બ્લૉક કરવામાં આવ્યું છે:</translation> <translation id="7063006564040364415">સમન્વયન સર્વર સાથે કનેક્ટ કરી શકાયું નથી</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome અપ ટૂ ડેટ છે</translation> <translation id="7106762743910369165">તમારી સંસ્થા દ્વારા તમારું બ્રાઉઝર મેનેજ કરવામાં આવે છે</translation> <translation id="7121362699166175603">ઍડ્રેસ બારમાં ઇતિહાસ અને ઑટોમૅટિક રીતે પૂર્ણતા સાફ કરે છે. તમારા Google એકાઉન્ટમાં <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> પર બ્રાઉઝિંગ ઇતિહાસના બીજા સ્વરૂપો હોય શકે.</translation> -<translation id="7128355412245153445">જ્યારે પણ તમે હોમ બટન પર ટૅપ કરો ત્યારે તમારી શ્રેષ્ઠ અને એકદમ નવી સ્ટોરી જુઓ</translation> <translation id="7138678301420049075">અન્ય</translation> <translation id="7146622961999026732">આ સાઇટ અને ઍપ તમારા માટે મહત્ત્વના લાગી રહ્યાં છે:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" />માંથી <ph name="BEGIN_LINK" />ઑરિજિનલ પેજ લોડ કરો<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> પસંદ કરો\n2. “હંમેશા” પર ટૅપ કરો</translation> <translation id="8410695015584479363">કિંમત ટ્રૅક કરો</translation> <translation id="8413126021676339697">પૂર્ણ ઇતિહાસ બતાવો</translation> -<translation id="8425213833346101688">બદલો</translation> <translation id="8427875596167638501">પ્રીવ્યૂ ટૅબ અડધી ઊંચાઈએ ખુલી</translation> <translation id="8428213095426709021">સેટિંગ્સ</translation> <translation id="8438566539970814960">શોધ અને બ્રાઉઝિંગ વધુ સારું બનાવો</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ડિજિટલ લાઇફસ્ટાઇલમાંથી તમારી Chromeની પ્રવૃત્તિને કેવી રીતે કાઢવી</translation> <translation id="927968626442779827">Google Chrome પર લાઇટ મોડનો ઉપયોગ કરો</translation> <translation id="932327136139879170">હોમ</translation> -<translation id="93753284658583800">હોમપેજ બદલ્યું</translation> <translation id="938850635132480979">ભૂલ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">પાસફ્રેઝ દાખલ કરો</translation> <translation id="948039501338975565">બુકમાર્ક ફોલ્ડરોની સૂચિ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 3e54db8..2af5fa7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">सभी डिवाइस पर सिंक करने और मनमुताबिक बनाने के लिए, 'सिंक करें' को चालू करें</translation> <translation id="1209206284964581585">अभी छिपाएं</translation> <translation id="1227058898775614466">नेविगेशन का इतिहास</translation> -<translation id="1229399675748764149">इस पेज को अपना होम पेज बनाएं</translation> <translation id="1231733316453485619">क्या सिंक करना चालू करें?</translation> <translation id="123724288017357924">कैश सामग्री को अनदेखा कर, मौजूदा पेज फिर लोड करें</translation> <translation id="124678866338384709">वर्तमान टैब को बंद करें</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">पासवर्ड मिटाएं</translation> <translation id="1521774566618522728">आज सक्रिय है</translation> <translation id="1538801903729528855">वेब पर वॉइस सर्च का बेहतर अनुभव पाएं</translation> -<translation id="1543538514740974167">यहां तेज़ी से पहुंचें</translation> <translation id="1544826120773021464">अपना Google खाता प्रबंधित करने के लिए, "खाता प्रबंधित करें" बटन पर टैप करें</translation> <translation id="1549000191223877751">अन्य विंडो में ले जाएं</translation> <translation id="1553358976309200471">Chrome अपडेट करें</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">यह पेज <ph name="CREATION_TIME" /> का है और यह ऑनलाइन वर्शन से अलग हो सकता है.</translation> <translation id="4605958867780575332">आइटम निकाला गया: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">पेजों को बाद के लिए सेव करें और रिमाइंडर पाएं</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> को खोलें</translation> <translation id="4634124774493850572">पासवर्ड का इस्तेमाल करें</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 पासवर्ड या तो हैक हुआ है या चोरी हुआ है}one{# पासवर्ड या तो हैक हुआ है या चोरी हुआ है}other{# पासवर्ड या तो हैक हुए हैं या चोरी हुए हैं}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> को पहले जैसा किया गया</translation> <translation id="7029809446516969842">पासवर्ड</translation> <translation id="7030675613184250187">आप पेजों को, पढ़ने की चीज़ों की सूची में सेव कर सकते हैं, ताकि आप उन्हें आसानी से दोबारा खोज सकें या उन्हें ऑफ़लाइन पढ़ सकें</translation> -<translation id="703523980599857277">होम पेज बदलें</translation> <translation id="7054588988317389591">क्या आप इमेज की जानकारी पाना चाहते हैं?</translation> <translation id="7055152154916055070">रीडायरेक्ट ब्लॉक किया गया:</translation> <translation id="7063006564040364415">समन्वयन सर्वर से कनेक्ट नहीं किया जा सका.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome अप-टू-डेट है</translation> <translation id="7106762743910369165">आपका संगठन आपके ब्राउज़र को प्रबंधित करता है</translation> <translation id="7121362699166175603">पता बार मेंअपने-आपपूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation> -<translation id="7128355412245153445">होम बटन पर टैप करके, अपनी पसंदीदा साइटें और हाल ही की खबरें देखें</translation> <translation id="7138678301420049075">अन्य</translation> <translation id="7146622961999026732">शायद ये साइटें और ऐप्लिकेशन आपके लिए अहम हैं:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> से <ph name="BEGIN_LINK" />मूल पेज लोड करें<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> चुनें\n2. “हमेशा” पर टैप करें</translation> <translation id="8410695015584479363">कीमतें ट्रैक करें</translation> <translation id="8413126021676339697">पूरा इतिहास दिखाएं</translation> -<translation id="8425213833346101688">बदलें</translation> <translation id="8427875596167638501">'झलक' टैब आधी स्क्रीन में खुला हुआ है</translation> <translation id="8428213095426709021">सेटिंग</translation> <translation id="8438566539970814960">खोजों और ब्राउज़िंग को बेहतर बनाएं</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">'डिजिटल वेलबीइंग' से अपनी Chrome गतिविधि हटाएं</translation> <translation id="927968626442779827">Google Chrome पर लाइट मोड का इस्तेमाल करें</translation> <translation id="932327136139879170">होम बटन</translation> -<translation id="93753284658583800">होम पेज बदल गया</translation> <translation id="938850635132480979">गड़बड़ी: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">'पासफ़्रेज़' दर्ज करें</translation> <translation id="948039501338975565">बुकमार्क फ़ोल्डर वाली सूची</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index e526044..2a4b7c6f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Da biste sinkronizirali i prilagodili više uređaja, uključite sinkronizaciju</translation> <translation id="1209206284964581585">Sakrij za sad</translation> <translation id="1227058898775614466">Povijest navigacije</translation> -<translation id="1229399675748764149">Postavite ovu stranicu kao početnu stranicu</translation> <translation id="1231733316453485619">Želite li uključiti sinkronizaciju?</translation> <translation id="123724288017357924">Ponovno učitavanje trenutačne stranice uz zanemarivanje sadržaja iz predmemorije</translation> <translation id="124678866338384709">Zatvaranje trenutačne kartice</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Izbriši zaporku</translation> <translation id="1521774566618522728">Aktivan danas</translation> <translation id="1538801903729528855">Ostvarite bolji glasovni doživljaj na webu</translation> -<translation id="1543538514740974167">Brže otvaranje ove stranice</translation> <translation id="1544826120773021464">Da biste upravljali svojim Google računom, dodirnite gumb "Upravljanje računom"</translation> <translation id="1549000191223877751">Premjesti u drugi prozor</translation> <translation id="1553358976309200471">Ažuriraj Chrome</translation> @@ -497,7 +495,6 @@ <translation id="4587589328781138893">Web-lokacije</translation> <translation id="4594952190837476234">Ova offline stranica nastala je <ph name="CREATION_TIME" /> i možda se razlikuje od online verzije.</translation> <translation id="4605958867780575332">Stavka je uklonjena: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Spremite stranice za kasnije i postavite podsjetnik</translation> <translation id="4616150815774728855">Otvori <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Upotrijebi zaporku</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Jedna ugrožena zaporka}one{# ugrožena zaporka}few{# ugrožene zaporke}other{# ugroženih zaporki}}</translation> @@ -876,7 +873,6 @@ <translation id="7027549951530753705">Vraćeno: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Zaporke</translation> <translation id="7030675613184250187">Stranice možete spremati na popis za čitanje da biste ih kasnije pronašli ili čitali izvanmrežno</translation> -<translation id="703523980599857277">Promijeni početnu stranicu</translation> <translation id="7054588988317389591">Primati opise slike?</translation> <translation id="7055152154916055070">Preusmjeravanje je blokirano:</translation> <translation id="7063006564040364415">Nije uspjelo povezivanje s poslužiteljem za sinkronizaciju.</translation> @@ -887,7 +883,6 @@ <translation id="7088681679121566888">Chrome je ažuriran</translation> <translation id="7106762743910369165">Vašim preglednikom upravlja vaša organizacija</translation> <translation id="7121362699166175603">Briše povijest i automatska dovršavanja u adresnoj traci. Na vašem Google računu možda postoje drugi oblici povijesti pregledavanja na stranici <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Web-lokacije koje najčešće posjećujete i najnovije vijesti mogu se prikazivati svaki put kad dodirnete gumb početnog zaslona</translation> <translation id="7138678301420049075">Ostalo</translation> <translation id="7146622961999026732">Čini se da su vam ove web-lokacije i aplikacije važne:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Učitajte izvornu stranicu<ph name="END_LINK" /> s domene <ph name="DOMAIN_NAME" /></translation> @@ -1077,7 +1072,6 @@ <translation id="8407396331882458341">1. Odaberite <ph name="APP_NAME" />.\n2. Dodirnite opciju "Uvijek".</translation> <translation id="8410695015584479363">Prati cijene</translation> <translation id="8413126021676339697">Pokaži cijelu povijest</translation> -<translation id="8425213833346101688">Promijeni</translation> <translation id="8427875596167638501">Kartica pregleda je poluotvorena</translation> <translation id="8428213095426709021">Postavke</translation> <translation id="8438566539970814960">Poboljšajte pretraživanje i pregledavanje</translation> @@ -1195,7 +1189,6 @@ <translation id="926205370408745186">Uklanjanje vaše aktivnosti u Chromeu iz Digitalne ravnoteže</translation> <translation id="927968626442779827">Koristite Jednostavni način na Google Chromeu</translation> <translation id="932327136139879170">Početna stranica</translation> -<translation id="93753284658583800">Promijenjena je početna stranica</translation> <translation id="938850635132480979">Pogreška: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Unesite zaporku</translation> <translation id="948039501338975565">Popis mapa s oznakama</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index 54bf370..97a604e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Az eszközök közötti szinkronizáláshoz és személyre szabáshoz kapcsolja be a szinkronizálást</translation> <translation id="1209206284964581585">Elrejtés most</translation> <translation id="1227058898775614466">Navigációs előzmények</translation> -<translation id="1229399675748764149">Legyen ez az oldal a kezdőlap?</translation> <translation id="1231733316453485619">Bekapcsolja a szinkronizálást?</translation> <translation id="123724288017357924">Oldal újratöltése a gyorsítótárat figyelmen kívül hagyva</translation> <translation id="124678866338384709">Az aktuális lap bezárása</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Jelszó törlése</translation> <translation id="1521774566618522728">Ma volt aktív</translation> <translation id="1538801903729528855">Jobb felhasználói élmény a weben hangalapú keresésnél</translation> -<translation id="1543538514740974167">Gyorsabban idejuthat</translation> <translation id="1544826120773021464">Google-fiókjának kezeléséhez koppintson a „Fiók kezelése” gombra</translation> <translation id="1549000191223877751">Áthelyezés másik ablakba</translation> <translation id="1553358976309200471">A Chrome böngésző frissítése</translation> @@ -270,7 +268,7 @@ <translation id="2888126860611144412">A Chrome névjegye</translation> <translation id="2891154217021530873">Oldal betöltésének leállítása</translation> <translation id="2892647708214602204">Értesítést kap, amikor a fájl elkészült</translation> -<translation id="2893180576842394309">A Google felhasználhatja az Ön előzményeit a Keresés és más Google-szolgáltatások személyre szabására</translation> +<translation id="2893180576842394309">A Google felhasználhatja az Ön előzményeit a Kereső és más Google-szolgáltatások személyre szabására</translation> <translation id="2900528713135656174">Esemény létrehozása</translation> <translation id="2901411048554510387">Javaslatok megjelenítése a következőhöz: <ph name="WEBSITE_TITLE" /></translation> <translation id="2904414404539560095">Lap megosztására szolgáló eszközök listája teljes magasságban megnyitva.</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Webhelyek</translation> <translation id="4594952190837476234">Az offline oldal létrehozási ideje: <ph name="CREATION_TIME" />. Az oldal eltérhet az online változattól.</translation> <translation id="4605958867780575332">A következő elem eltávolítva: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Elmentheti későbbre az oldalakat, és emlékeztetőt kaphat</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> megnyitása</translation> <translation id="4634124774493850572">Jelszó használata</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 jelszó, amelyhez illetéktelenül hozzáfértek}other{# jelszó, amelyhez illetéktelenül hozzáfértek}}</translation> @@ -677,7 +674,7 @@ <translation id="5776970333778123608">Nem fontos adatok</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />/<ph name="SPACE_USED" /> használatban</translation> <translation id="5795872532621730126">Keresés és böngészés</translation> -<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Keresés, a hirdetések és más Google-szolgáltatások személyre szabására</translation> +<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# órája}other{# órája}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Minden jog fenntartva.</translation> <translation id="5810864297166300463">Webes segítség</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Visszaállítás dátuma: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Jelszavak</translation> <translation id="7030675613184250187">Oldalakat menthet az olvasólistájára, hogy később újra megtalálhassa, illetve offline elolvashassa őket.</translation> -<translation id="703523980599857277">Kezdőlap módosítása</translation> <translation id="7054588988317389591">Lekéri a képleírásokat?</translation> <translation id="7055152154916055070">Átirányítás letiltva:</translation> <translation id="7063006564040364415">Nem sikerült csatlakozni a szinkronizálószerverhez.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">A Chrome naprakész</translation> <translation id="7106762743910369165">Böngészőjét a szervezete kezeli.</translation> <translation id="7121362699166175603">Törli a címsávban található előzményeket és automatikus kiegészítéseket. Előfordulhat, hogy a böngészési előzmények más formái még megtalálhatók Google-fiókjában a <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webhelyen.</translation> -<translation id="7128355412245153445">A Kezdőképernyő gombra koppintva bármikor a leggyakoribb webhelyeihez és a legfrissebb hírekhez ugorhat.</translation> <translation id="7138678301420049075">Egyéb</translation> <translation id="7146622961999026732">Úgy tűnik, ezek a webhelyek és alkalmazások fontosak Önnek:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Eredeti oldal betöltése<ph name="END_LINK" /> innen: <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Válassza ki a(z) <ph name="APP_NAME" /> alkalmazást.\n2. Koppintson a „Mindig” lehetőségre.</translation> <translation id="8410695015584479363">Árak nyomon követése</translation> <translation id="8413126021676339697">Az összes előzmény</translation> -<translation id="8425213833346101688">Módosítás</translation> <translation id="8427875596167638501">Félmagasságban megnyitott előnézeti ablak</translation> <translation id="8428213095426709021">Beállítások</translation> <translation id="8438566539970814960">Keresések és böngészés javítása</translation> @@ -1106,7 +1100,7 @@ <translation id="8561196567344536112">1. Nyissa meg a Beállításokat.\n2. Koppintson a „Böngészőalkalmazás” lehetőségre.\n3. Válassza ki a(z) <ph name="APP_NAME" /> alkalmazást.</translation> <translation id="8562452229998620586">A mentett jelszavak itt jelennek meg.</translation> <translation id="8569404424186215731"><ph name="DATE" /> óta</translation> -<translation id="8571213806525832805">Az elmúlt négy hétből</translation> +<translation id="8571213806525832805">Az elmúlt 4 hétből</translation> <translation id="8572344201470131220">Kép vágólapra másolva</translation> <translation id="8583805026567836021">Fiókadatok törlése</translation> <translation id="8587585930972369234">Lenyomva tartás a kereséshez</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome-beli tevékenység eltávolítása a digitális jóllét funkcióból</translation> <translation id="927968626442779827">Használja az Egyszerűsített módot a Google Chrome-ban</translation> <translation id="932327136139879170">Főoldal</translation> -<translation id="93753284658583800">Kezdőlap módosítva</translation> <translation id="938850635132480979">Hiba: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Összetett jelszó megadása</translation> <translation id="948039501338975565">Könyvjelzőmappák listája</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index 2edcb2f3..ce48920 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Սարքերը համաժամացնելու և անհատականացնելու համար միացրեք համաժամացումը</translation> <translation id="1209206284964581585">Առայժմ թաքցնել</translation> <translation id="1227058898775614466">Նավարկման պատմություն</translation> -<translation id="1229399675748764149">Դարձրեք այս էջը գլխավոր</translation> <translation id="1231733316453485619">Միացնե՞լ համաժամացումը</translation> <translation id="123724288017357924">Վերաբեռնել ընթացիկ էջը` անտեսելով հիշապահեստի բովանդակությունը</translation> <translation id="124678866338384709">Փակել ընթացիկ ներդիրը</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Ջնջել գաղտնաբառը</translation> <translation id="1521774566618522728">Այսօր ակտիվ է եղել</translation> <translation id="1538801903729528855">Օգտագործեք ձայնային ներածումը համացանցում</translation> -<translation id="1543538514740974167">Արագ հասանելիություն</translation> <translation id="1544826120773021464">Google հաշիվը կառավարելու համար հպեք «Կառավարել հաշիվը» կոճակին</translation> <translation id="1549000191223877751">Տեղափոխել այլ պատուհան</translation> <translation id="1553358976309200471">Թարմացնել Chrome-ը</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Կայքեր</translation> <translation id="4594952190837476234">Այս էջը պահվել է <ph name="CREATION_TIME" />-ին, և կարող է տարբերվել առցանց տարբերակից։</translation> <translation id="4605958867780575332">Տարրը հեռացվեց՝ <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Պահեք էջերը հետագայի համար և ստացեք հիշեցում</translation> <translation id="4616150815774728855">Բացել <ph name="WEBAPK_NAME" /> հավելվածը</translation> <translation id="4634124774493850572">Օգտագործել գաղտնաբառը</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 կոտրված գաղտնաբառ}one{# կոտրված գաղտնաբառ}other{# կոտրված գաղտնաբառ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Վերականգնման ամսաթիվը՝ <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Գաղտնաբառեր</translation> <translation id="7030675613184250187">Դուք կարող եք ձեր ընթերցանության ցանկում պահել էջեր՝ դրանք նորից գտնելու և անցանց ռեժիմում կարդալու համար։</translation> -<translation id="703523980599857277">Փոխել գլխավոր էջը</translation> <translation id="7054588988317389591">Ուզո՞ւմ եք ստանալ պատկերների նկարագրություններ</translation> <translation id="7055152154916055070">Վերահասցեավորումն արգելափակված է՝</translation> <translation id="7063006564040364415">Չհաջողվեց կապակցվել համաժամացման սերվերին:</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome-ը թարմացված է</translation> <translation id="7106762743910369165">Ձեր դիտարկիչը կառավարվում է ձեր կազմակերպության կողմից</translation> <translation id="7121362699166175603">Մաքրում է պատմությունն ու ինքնալրացումները հասցեագոտում: Ձեր Google հաշվում կարող են լինել այցելությունների պատմության այլ ձևեր ևս: Դրանք կարող եք գտնել <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> էջում:</translation> -<translation id="7128355412245153445">Ձեր թոփ կայքերն ու վերջին հոդվածները տեսնելու համար պարզապես սեղմեք Սկիզբ կոճակը</translation> <translation id="7138678301420049075">Այլ</translation> <translation id="7146622961999026732">Այս կայքերը և հավելվածները կարող են կարևոր լինել ձեզ համար՝</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Բեռնել էջի բնօրինակը<ph name="END_LINK" /> <ph name="DOMAIN_NAME" /> տիրույթից</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Ընտրեք <ph name="APP_NAME" /> հավելվածը\n2. Հպեք «Միշտ»</translation> <translation id="8410695015584479363">Հետևել գներին</translation> <translation id="8413126021676339697">Ցույց տալ ամբողջ պատմությունը</translation> -<translation id="8425213833346101688">Փոխել</translation> <translation id="8427875596167638501">Նախադիտման ներդիրը կիսաբաց է</translation> <translation id="8428213095426709021">Կարգավորումներ</translation> <translation id="8438566539970814960">Լավացնել որոնումն ու էջերի դիտումը</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Հեռացրեք Chrome-ի պատմությունը Թվային բարեկեցությունից</translation> <translation id="927968626442779827">Փորձեք Lite ռեժիմը Google Chrome-ում</translation> <translation id="932327136139879170">Գլխավոր էջ</translation> -<translation id="93753284658583800">Գլխավոր էջը փոխվեց</translation> <translation id="938850635132480979">Սխալ՝ <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Մուտքագրեք անցաբառը</translation> <translation id="948039501338975565">Էջանիշներով պանակների ցանկ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 9ae9f70..2ab3dff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Untuk menyinkronkan dan mempersonalisasi berbagai perangkat, aktifkan sinkronisasi</translation> <translation id="1209206284964581585">Sembunyikan sekarang</translation> <translation id="1227058898775614466">Histori navigasi</translation> -<translation id="1229399675748764149">Jadikan ini halaman beranda Anda</translation> <translation id="1231733316453485619">Aktifkan sinkronisasi?</translation> <translation id="123724288017357924">Memuat ulang halaman, mengabaikan konten dalam cache</translation> <translation id="124678866338384709">Menutup tab aktif</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Hapus sandi</translation> <translation id="1521774566618522728">Aktif hari ini</translation> <translation id="1538801903729528855">Dapatkan pengalaman penelusuran suara yang lebih baik di web</translation> -<translation id="1543538514740974167">Buka halaman ini lebih cepat</translation> <translation id="1544826120773021464">Untuk mengelola akun Google Anda, ketuk tombol "Kelola akun"</translation> <translation id="1549000191223877751">Beralih ke jendela lain</translation> <translation id="1553358976309200471">Perbarui browser Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Situs</translation> <translation id="4594952190837476234">Halaman offline ini dibuat pada <ph name="CREATION_TIME" /> dan mungkin berbeda dengan versi onlinenya.</translation> <translation id="4605958867780575332">Item yang dihapus: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Simpan halaman untuk dilihat nanti dan dapatkan pengingat</translation> <translation id="4616150815774728855">Buka <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Gunakan sandi</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 sandi telah dibobol}other{# sandi telah dibobol}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Memulihkan <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Sandi</translation> <translation id="7030675613184250187">Anda dapat menyimpan halaman ke daftar bacaan untuk menemukannya lagi atau membaca secara offline</translation> -<translation id="703523980599857277">Ubah halaman beranda</translation> <translation id="7054588988317389591">Dapatkan deskripsi gambar?</translation> <translation id="7055152154916055070">Pengalihan diblokir:</translation> <translation id="7063006564040364415">Tidak dapat menyambung ke server sinkronisasi.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome sudah versi terbaru</translation> <translation id="7106762743910369165">Browser dikelola oleh organisasi Anda</translation> <translation id="7121362699166175603">Menghapus histori dan pelengkapan otomatis di kolom URL. Akun Google Anda mungkin memiliki bentuk histori penjelajahan lainnya di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Lihat situs populer dan artikel terbaru saat Anda mengetuk tombol Beranda</translation> <translation id="7138678301420049075">Lainnya</translation> <translation id="7146622961999026732">Situs dan aplikasi ini sepertinya penting untuk Anda:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Muat halaman asli<ph name="END_LINK" /> dari <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Pilih <ph name="APP_NAME" />\n2. Ketuk "Selalu"</translation> <translation id="8410695015584479363">Pantau harga</translation> <translation id="8413126021676339697">Tampilkan histori lengkap</translation> -<translation id="8425213833346101688">Ubah</translation> <translation id="8427875596167638501">Tab pratinjau terbuka setengah</translation> <translation id="8428213095426709021">Setelan</translation> <translation id="8438566539970814960">Jadikan penelusuran dan penjelajahan lebih baik</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Hapus aktivitas Chrome Anda dari Kesehatan Digital</translation> <translation id="927968626442779827">Gunakan Mode Ringan di Google Chrome</translation> <translation id="932327136139879170">Beranda</translation> -<translation id="93753284658583800">Halaman beranda diubah</translation> <translation id="938850635132480979">Kesalahan: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Masukkan frasa sandi</translation> <translation id="948039501338975565">Daftar folder bookmark</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 2aecb01a..9db44895 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Kveiktu á samstillingu til að hafa allt samstillt og sérsniðið í tækjunum þínum</translation> <translation id="1209206284964581585">Fela í bili</translation> <translation id="1227058898775614466">Ferill</translation> -<translation id="1229399675748764149">Gera þessa síðu að heimasíðu</translation> <translation id="1231733316453485619">Kveikja á samstillingu?</translation> <translation id="123724288017357924">Endurhlaða núverandi síðu, hunsa efni í skyndiminni</translation> <translation id="124678866338384709">Loka núverandi flipa</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Eyða aðgangsorði</translation> <translation id="1521774566618522728">Virkt í dag</translation> <translation id="1538801903729528855">Láttu röddina þjóna þér betur á vefnum</translation> -<translation id="1543538514740974167">Fljótari leið hingað</translation> <translation id="1544826120773021464">Til að hafa umsjón með Google reikningnum þínum skaltu velja hnappinn „Stjórna reikningi“</translation> <translation id="1549000191223877751">Færa í annan glugga</translation> <translation id="1553358976309200471">Uppfæra Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Svæði</translation> <translation id="4594952190837476234">Þessi síða án nettengingar er frá <ph name="CREATION_TIME" /> og hún gæti verið frábrugðin útgáfunni sem er á netinu.</translation> <translation id="4605958867780575332">Atriði fjarlægt: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Vista síður til að skoða seinna og fá áminningu</translation> <translation id="4616150815774728855">Opna <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Nota aðgangsorð</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 aðgangsorð í hættu}one{# aðgangsorð í hættu}other{# aðgangsorð í hættu}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Endurheimti <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Aðgangsorð</translation> <translation id="7030675613184250187">Þú getur vistað síður á leslistanum til að finna þær aftur síðar eða lesa án nettengingar</translation> -<translation id="703523980599857277">Breyta heimasíðu</translation> <translation id="7054588988317389591">Fá myndlýsingar?</translation> <translation id="7055152154916055070">Lokað á framsendingu:</translation> <translation id="7063006564040364415">Ekki var hægt að tengjast samstillingarþjóninum.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome er uppfærður</translation> <translation id="7106762743910369165">Vafranum er stjórnað af fyrirtækinu þínu</translation> <translation id="7121362699166175603">Hreinsar ferilinn og sjálfvirka útfyllingu í veffangastikunni. Google reikningurinn þinn kann að vera með annars konar vefskoðunarferil á <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Sjáðu vefsvæðin sem þú heimsækir oftast og nýlegar sögur þegar þú ýtir á heimahnappinn</translation> <translation id="7138678301420049075">Annað</translation> <translation id="7146622961999026732">Þessi svæði og forrit virðast vera þér mikilvæg:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Hlaða upprunalegri síðu<ph name="END_LINK" /> frá <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Veldu <ph name="APP_NAME" />\n2. Ýttu á „Alltaf“</translation> <translation id="8410695015584479363">Vakta verð</translation> <translation id="8413126021676339697">Sýna allan feril</translation> -<translation id="8425213833346101688">Breyta</translation> <translation id="8427875596167638501">Forskoðunarflipinn er hálfopinn</translation> <translation id="8428213095426709021">Stillingar</translation> <translation id="8438566539970814960">Bæta leit og vafra</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Fjarlægja það sem þú gerir í Chrome úr stafrænni vellíðan</translation> <translation id="927968626442779827">Nota Léttútgáfu í Google Chrome</translation> <translation id="932327136139879170">Heim</translation> -<translation id="93753284658583800">Heimasíðu breytt</translation> <translation id="938850635132480979">Villa: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Sláðu inn aðgangsorð</translation> <translation id="948039501338975565">Listi bókamerkjamappa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index ef23f15..fc519d07 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Attiva la sincronizzazione per sincronizzare e personalizzare tutti i dispositivi</translation> <translation id="1209206284964581585">Nascondi per ora</translation> <translation id="1227058898775614466">Cronologia di navigazione</translation> -<translation id="1229399675748764149">Imposta questa pagina come pagina iniziale</translation> <translation id="1231733316453485619">Attivare la sincronizzazione?</translation> <translation id="123724288017357924">Ricarica pag. corr. Ignora i contenuti nella cache</translation> <translation id="124678866338384709">Chiudi scheda corrente</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Elimina la password</translation> <translation id="1521774566618522728">Attivo oggi</translation> <translation id="1538801903729528855">Vivi un'esperienza vocale migliore sul Web</translation> -<translation id="1543538514740974167">Arriva qui più velocemente</translation> <translation id="1544826120773021464">Per gestire il tuo Account Google, tocca il pulsante "Gestisci account"</translation> <translation id="1549000191223877751">Passa a un'altra finestra</translation> <translation id="1553358976309200471">Aggiorna Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Siti</translation> <translation id="4594952190837476234">Questa pagina offline risale al giorno <ph name="CREATION_TIME" /> e potrebbe essere diversa dalla versione online.</translation> <translation id="4605958867780575332">Elemento rimosso: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Salva le pagine per un secondo momento e ricevi un promemoria</translation> <translation id="4616150815774728855">Apri <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Utilizza password</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 password compromessa}other{# password compromesse}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ripristinato</translation> <translation id="7029809446516969842">Password</translation> <translation id="7030675613184250187">Puoi salvare pagine nel tuo elenco di lettura per ritrovarle o leggerle offline</translation> -<translation id="703523980599857277">Cambia pagina iniziale</translation> <translation id="7054588988317389591">Vuoi recuperare le descrizioni delle immagini?</translation> <translation id="7055152154916055070">Reindirizzamento bloccato:</translation> <translation id="7063006564040364415">Impossibile collegarsi al server di sincronizzazione.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome è aggiornato</translation> <translation id="7106762743910369165">Il tuo browser è gestito dalla tua organizzazione</translation> <translation id="7121362699166175603">Consente di cancellare la cronologia e i completamenti automatici nella barra degli indirizzi. Il tuo Account Google potrebbe avere altri tipi di cronologia di navigazione all'indirizzo <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Accedi ai siti che visiti più spesso e alle notizie recenti quando tocchi il pulsante Pagina iniziale</translation> <translation id="7138678301420049075">Altro</translation> <translation id="7146622961999026732">Questi siti e app sembrano importanti per te:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Carica la pagina originale<ph name="END_LINK" /> da <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Scegli <ph name="APP_NAME" />\n2. Tocca "Sempre"</translation> <translation id="8410695015584479363">Monitora prezzi</translation> <translation id="8413126021676339697">Mostra cronologia completa</translation> -<translation id="8425213833346101688">Cambia</translation> <translation id="8427875596167638501">La scheda di anteprima è aperta nella parte inferiore dello schermo</translation> <translation id="8428213095426709021">Impostazioni</translation> <translation id="8438566539970814960">Migliora le ricerche e le attività di navigazione</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Rimuovi la tua attività di Chrome da Benessere digitale</translation> <translation id="927968626442779827">Usa la modalità Lite su Google Chrome</translation> <translation id="932327136139879170">Home page</translation> -<translation id="93753284658583800">Pagina iniziale modificata</translation> <translation id="938850635132480979">Errore: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Inserisci passphrase</translation> <translation id="948039501338975565">Elenco di cartelle di preferiti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index fded62d1..c23e4b61 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">כדי לסנכרן ולהתאים אישית את החוויה במכשירים שונים, יש להפעיל את הסנכרון</translation> <translation id="1209206284964581585">להסתיר בינתיים</translation> <translation id="1227058898775614466">היסטוריית ניווט</translation> -<translation id="1229399675748764149">הגדרת הדף הזה כדף הבית</translation> <translation id="1231733316453485619">להפעיל סנכרון?</translation> <translation id="123724288017357924">טעינה מחדש של הדף הנוכחי, תוך התעלמות מתוכן שמאוחסן בקובץ השמור</translation> <translation id="124678866338384709">סגירת הכרטיסייה הנוכחית</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">מחיקת סיסמה</translation> <translation id="1521774566618522728">סנכרון אחרון: היום</translation> <translation id="1538801903729528855">חוויה קולית טובה יותר באינטרנט</translation> -<translation id="1543538514740974167">רוצה להגיע לכאן מהר יותר?</translation> <translation id="1544826120773021464">כדי לנהל את חשבון Google, יש להקיש על הלחצן "ניהול החשבון"</translation> <translation id="1549000191223877751">העברה לחלון האחר</translation> <translation id="1553358976309200471">כדאי לעדכן את Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">אתרים</translation> <translation id="4594952190837476234">הדף האופליין הזה נוצר ב-<ph name="CREATION_TIME" /> ויכול להיות שהגרסה המקוונת שלו שונה.</translation> <translation id="4605958867780575332">פריטים שהוסרו: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">שמירת הדפים לקריאה במועד מאוחר יותר והגדרת תזכורת</translation> <translation id="4616150815774728855">פתיחה של <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">שימוש בסיסמה</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{סיסמה אחת שנחשפה}two{# סיסמאות שנחשפו}many{# סיסמאות שנחשפו}other{# סיסמאות שנחשפו}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">בוצע שחזור של <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">סיסמאות</translation> <translation id="7030675613184250187">אפשר לשמור דפים ברשימת הקריאה כדי למצוא אותם שוב או כדי לקרוא אותם במצב אופליין</translation> -<translation id="703523980599857277">שינוי דף הבית</translation> <translation id="7054588988317389591">רוצה לקבל תיאורי תמונות?</translation> <translation id="7055152154916055070">הפניה אוטומטית נחסמה:</translation> <translation id="7063006564040364415">לא ניתן היה להתחבר אל שרת הסנכרון.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome מעודכן</translation> <translation id="7106762743910369165">הדפדפן מנוהל על ידי הארגון שלך</translation> <translation id="7121362699166175603">ניקוי ההיסטוריה וההשלמות האוטומטיות בשורת כתובת האתר. ייתכן שלחשבון Google שלך יהיו צורות אחרות של היסטוריית גלישה בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">אתרים מובילים ומאמרים עדכניים יוצגו לאחר הקשה על לחצן דף הבית</translation> <translation id="7138678301420049075">אחר</translation> <translation id="7146622961999026732">נראה שהאתרים והאפליקציות האלה חשובים לך:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />טעינת הדף המקורי<ph name="END_LINK" /> מ-<ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. בוחרים את <ph name="APP_NAME" />.\n2. מקישים על 'תמיד'.</translation> <translation id="8410695015584479363">מעקב אחר מחירים</translation> <translation id="8413126021676339697">להצגת ההיסטוריה המלאה</translation> -<translation id="8425213833346101688">שינוי</translation> <translation id="8427875596167638501">כרטיסיית התצוגה המקדימה פתוחה בחצי גובה המסך</translation> <translation id="8428213095426709021">הגדרות</translation> <translation id="8438566539970814960">שיפור החיפושים והגלישה</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">הסרת הפעילות שלך ב-Chrome מ'שימוש חכם בדיגיטל'.</translation> <translation id="927968626442779827">כדאי להשתמש במצב הטעינה המהירה ב-Google Chrome</translation> <translation id="932327136139879170">בית</translation> -<translation id="93753284658583800">דף הבית השתנה</translation> <translation id="938850635132480979">שגיאה: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">הזנת ביטוי סיסמה</translation> <translation id="948039501338975565">רשימת תיקיות של סימניות</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 99e25161..c4a482c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">複数のデバイスで独自の設定を同期して共有するには、同期を有効にします</translation> <translation id="1209206284964581585">今は表示しない</translation> <translation id="1227058898775614466">ナビゲーション履歴</translation> -<translation id="1229399675748764149">このページをホームページに設定する</translation> <translation id="1231733316453485619">同期を有効にしますか?</translation> <translation id="123724288017357924">キャッシュ コンテンツを無視して現在のページを再読み込みする</translation> <translation id="124678866338384709">現在のタブを閉じる</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">パスワードを削除</translation> <translation id="1521774566618522728">最終同期: 今日</translation> <translation id="1538801903729528855">ウェブにおける音声操作の利便性を向上</translation> -<translation id="1543538514740974167">このページにすばやくアクセス</translation> <translation id="1544826120773021464">Google アカウントを管理するには、[アカウントを管理] をタップします。</translation> <translation id="1549000191223877751">他のウィンドウに移動</translation> <translation id="1553358976309200471">Chrome を更新</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">サイト</translation> <translation id="4594952190837476234">このオフライン ページは <ph name="CREATION_TIME" /> 時点のものであり、オンライン版とは異なる可能性があります。</translation> <translation id="4605958867780575332">削除したアイテム: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ページを後で読めるように保存してリマインダーを受け取ります</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> を起動</translation> <translation id="4634124774493850572">パスワードを使用</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{不正使用されたパスワード: 1 件}other{不正使用されたパスワード: # 件}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> を復元しました</translation> <translation id="7029809446516969842">パスワード</translation> <translation id="7030675613184250187">リーディング リストにページを保存すると、後から簡単にアクセスして、オフラインでも読めるようになります</translation> -<translation id="703523980599857277">ホームページを変更</translation> <translation id="7054588988317389591">画像の説明文を取得しますか?</translation> <translation id="7055152154916055070">リダイレクトがブロックされました</translation> <translation id="7063006564040364415">同期サーバーに接続できませんでした。</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome は最新の状態です</translation> <translation id="7106762743910369165">お使いのブラウザは組織によって管理されています</translation> <translation id="7121362699166175603">アドレスバーの履歴とオートコンプリートを削除します。お使いの Google アカウントの <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> に、他の形式の閲覧履歴が記録されている場合があります。</translation> -<translation id="7128355412245153445">ホームボタンをタップして、よく使用するサイトや最新の記事を表示できます</translation> <translation id="7138678301420049075">その他</translation> <translation id="7146622961999026732">以下のサイトやアプリは重要な可能性があります。</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> から<ph name="BEGIN_LINK" />元のページを読み込む<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> を選択します\n2. [常時] をタップします</translation> <translation id="8410695015584479363">料金をチェック</translation> <translation id="8413126021676339697">全履歴を表示</translation> -<translation id="8425213833346101688">変更</translation> <translation id="8427875596167638501">[プレビュー] タブが半分開いています</translation> <translation id="8428213095426709021">設定</translation> <translation id="8438566539970814960">検索とブラウジングを改善する</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome のアクティビティを Digital Wellbeing から削除</translation> <translation id="927968626442779827">Google Chrome のライトモードをご活用ください</translation> <translation id="932327136139879170">ホーム</translation> -<translation id="93753284658583800">ホームページを変更しました</translation> <translation id="938850635132480979">エラー: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">パスフレーズを入力</translation> <translation id="948039501338975565">ブックマーク フォルダのリスト</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 10cc0ec..d4584f3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">თქვენი ყველა მოწყობილობის სინქრონიზაციისთვისა და პერსონალიზებისთვის ჩართეთ სინქრონიზაცია</translation> <translation id="1209206284964581585">ამჯერად დამალვა</translation> <translation id="1227058898775614466">ნავიგაციის ისტორია</translation> -<translation id="1229399675748764149">აქციეთ ეს გვერდი მთავარ გვერდად</translation> <translation id="1231733316453485619">გსურთ სინქრონიზაციის ჩართვა?</translation> <translation id="123724288017357924">გვერდის გადატვირთვა ქეშირ. კონტენტის იგნორირებით</translation> <translation id="124678866338384709">მიმდინარე ჩანართის დახურვა</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">პაროლის წაშლა</translation> <translation id="1521774566618522728">აქტიური იყო დღეს</translation> <translation id="1538801903729528855">შეასრულეთ მეტი ხმის მეშვეობით ვებში</translation> -<translation id="1543538514740974167">გადმოდით აქ უფრო სწრაფად</translation> <translation id="1544826120773021464">თქვენი Google ანგარიშის სამართავად შეეხეთ „ანგარიშის მართვის“ ღილაკს</translation> <translation id="1549000191223877751">სხვა ფანჯარაში გადატანა</translation> <translation id="1553358976309200471">Chrome-ის განახლება</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">საიტები</translation> <translation id="4594952190837476234">ეს ხაზგარეშე გვერდი თარიღდება <ph name="CREATION_TIME" />-ით და შეიძლება განსხვავდებოდეს ონლაინ-ვერსიისგან.</translation> <translation id="4605958867780575332">ერთეული „<ph name="ITEM_TITLE" />“ ამოიშალა</translation> -<translation id="4614535611158687827">შეინახეთ გვერდები მოგვიანებით წასაკითხად და მიიღეთ შეხსენება</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" />-ის გახსნა</translation> <translation id="4634124774493850572">პაროლის გამოყენება</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 გატეხილი პაროლი}other{# გატეხილი პაროლი}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">აღდგენის თარიღი: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">პაროლები</translation> <translation id="7030675613184250187">შეგიძლიათ შეინახოთ გვერდები თქვენს საკითხავ სიაში, რომ მოგვიანებით იპოვოთ ან ხაზგარეშე რეჟიმში წაიკითხოთ</translation> -<translation id="703523980599857277">მთავარი გვერდის შეცვლა</translation> <translation id="7054588988317389591">გსურთ სურათების აღწერილობების მიღება?</translation> <translation id="7055152154916055070">გადამისამართება დაიბლოკა:</translation> <translation id="7063006564040364415">ვერ ვუკავშირდებით სინქრონიზაციის სერვერს.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome განახლებულია</translation> <translation id="7106762743910369165">თქვენს ბრაუზერს მართავს თქვენი ორგანიზაცია</translation> <translation id="7121362699166175603">მისამართთა ზოლში გაასუფთავებს ისტორიასა და ავტომატურ დასრულებებს. თქვენს Google ანგარიშში შეიძლება ინახებოდეს სხვა ტიპის დათვალიერების ისტორიაც, რომელიც ხელმისაწვდომია მისამართზე: <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">იხილეთ ყველაზე პოპულარული საიტები და ბოლოდროინდელი ამბები მთავარ ეკრანზე გადასვლის ღილაკზე ყოველი შეხებისას.</translation> <translation id="7138678301420049075">სხვა</translation> <translation id="7146622961999026732">როგორც ჩანს, თქვენთვის მნიშვნელოვანია შემდეგი აპები და საიტები:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />გვერდის ორიგინალის ჩატვირთვა<ph name="END_LINK" /> <ph name="DOMAIN_NAME" />-დან</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. აირჩიეთ <ph name="APP_NAME" />\n2. შეხებით აირჩიეთ „ყოველთვის“</translation> <translation id="8410695015584479363">ფასებზე თვალის დევნება</translation> <translation id="8413126021676339697">სრული ისტორიის ჩვენება</translation> -<translation id="8425213833346101688">შეცვლა</translation> <translation id="8427875596167638501">გადახედვის ჩანართი ნახევრადგახსნილია</translation> <translation id="8428213095426709021">პარამეტრები</translation> <translation id="8438566539970814960">გააუმჯობესეთ ძიებები და ვებსაიტების დათვალიერება</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ციფრული კომფორტიდან Chrome-ში თქვენი აქტივობის ამოშლა</translation> <translation id="927968626442779827">გამოიყენეთ Lite რეჟიმი Google Chrome-ში</translation> <translation id="932327136139879170">საწყისი გვერდი</translation> -<translation id="93753284658583800">მთავარი გვერდი შეიცვალა</translation> <translation id="938850635132480979">შეცდომა: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">შეიყვანეთ საიდუმლო ფრაზა</translation> <translation id="948039501338975565">სანიშნეების საქაღალდეების სია</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 6fb455aa..08b005b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Барлық құрылғыларда синхрондау және жекелендіру үшін синхрондау функциясын қосыңыз</translation> <translation id="1209206284964581585">Әзірге жасыру</translation> <translation id="1227058898775614466">Навигация тарихы</translation> -<translation id="1229399675748764149">Бұл бетті негізгі етіңіз</translation> <translation id="1231733316453485619">Синхрондау қосылсын ба?</translation> <translation id="123724288017357924">Кэштелген мазмұнды елемей, ағымдағы бетті жаңарту</translation> <translation id="124678866338384709">Ағымдағы қойындыны жабу</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Құпия сөзді жою</translation> <translation id="1521774566618522728">Бүгін белсенді болды</translation> <translation id="1538801903729528855">Интернетті дауыспен тиімдірек қолданыңыз</translation> -<translation id="1543538514740974167">Жылдам өту</translation> <translation id="1544826120773021464">Google есептік жазбасын басқару үшін "Есептік жазбаны басқару" түймесін түртіңіз.</translation> <translation id="1549000191223877751">Басқа терезеге өту</translation> <translation id="1553358976309200471">Chrome жаңарту</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайттар</translation> <translation id="4594952190837476234">Бұл офлайн бет <ph name="CREATION_TIME" /> күні жасалған, сондықтан онлайн нұсқасынан өзгеше болуы мүмкін.</translation> <translation id="4605958867780575332">Өшірілді: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Бұл беттерді кейінірек көруге сақтап, еске салғыш алыңыз.</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> қолданбасын ашу</translation> <translation id="4634124774493850572">Құпия сөзді пайдалану</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 құпия сөз ұрланды.}other{# құпия сөз ұрланды.}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Қалпына келтірілген <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Құпия сөздер</translation> <translation id="7030675613184250187">Беттерді оқу тізіміне сақтап, кейін оларды сол жерден табуыңызға не офлайн режимде оқуыңызға болады.</translation> -<translation id="703523980599857277">Негізгі бетті өзгерту</translation> <translation id="7054588988317389591">Сурет сипаттамаларын аласыз ба?</translation> <translation id="7055152154916055070">Бағыттау функциясына тыйым салынды.</translation> <translation id="7063006564040364415">Синхрондау серверіне қосылу мүмкін емес.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome жаңартылған.</translation> <translation id="7106762743910369165">Браузеріңізді ұйым басқарады.</translation> <translation id="7121362699166175603">Мекенжай жолағында тарих пен автотолтыруларды өшіреді. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> сайтында Google есептік жазбасымен шолу тарихының басқа да үлгілері болуы мүмкін.</translation> -<translation id="7128355412245153445">Негізгі экран түймесін түрткен кезде, үздік сайттар мен соңғы жаңалықтарды көру</translation> <translation id="7138678301420049075">Басқа</translation> <translation id="7146622961999026732">Бұл сайттар мен қолданбалар маңызды болуы мүмкін:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Беттің<ph name="END_LINK" /> түпнұсқасын <ph name="DOMAIN_NAME" /> доменінен жүктеу</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> қолданбасын таңдаңыз.\n2. "Әрқашан" түймесін түртіңіз.</translation> <translation id="8410695015584479363">Бағаларды қадағалау</translation> <translation id="8413126021676339697">Толық журналды көрсету</translation> -<translation id="8425213833346101688">Өзгерту</translation> <translation id="8427875596167638501">"Алдын ала қарау" қойындысы жартылай ашық.</translation> <translation id="8428213095426709021">Параметрлер</translation> <translation id="8438566539970814960">Іздеу және сайттарды шолу жұмысын жақсарту</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Digital Wellbeing функциясынан Chrome браузерін пайдалану деректерін өшіру</translation> <translation id="927968626442779827">Google Chrome браузерінде Lite режимін пайдаланыңыз.</translation> <translation id="932327136139879170">Негізгі бет</translation> -<translation id="93753284658583800">Негізгі бет өзгертілді.</translation> <translation id="938850635132480979">Қате: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Құпия фразаны енгізу</translation> <translation id="948039501338975565">Бетбелгі қалталарының тізімі</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index a35d4a2f..1111fe40 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">ដើម្បីធ្វើសមកាលកម្ម និងកំណត់ផ្ទាល់ខ្លួននៅលើឧបករណ៍នានា សូមបើកសមកាលកម្ម</translation> <translation id="1209206284964581585">លាក់ឥឡូវនេះ</translation> <translation id="1227058898775614466">ប្រវត្តិរុករក</translation> -<translation id="1229399675748764149">កំណត់ទំព័រនេះជាទំព័រដើមរបស់អ្នក</translation> <translation id="1231733316453485619">បើកសមកាលកម្ម?</translation> <translation id="123724288017357924">ផ្ទុកទំព័របច្ចុប្បន្នឡើងវិញ ដោយមិនអើពីនឹងមាតិកាដែលបានរក្សាទុកក្នុងឃ្លាំងផ្ទុកទិន្នន័យ</translation> <translation id="124678866338384709">បិទផ្ទាំងបច្ចុប្បន្ន</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">លុបពាក្យសម្ងាត់</translation> <translation id="1521774566618522728">ដំណើរការថ្ងៃនេះ</translation> <translation id="1538801903729528855">ទទួលបានបទពិសោធន៍ប្រើប្រាស់សំឡេងកាន់តែប្រសើរនៅលើបណ្ដាញ</translation> -<translation id="1543538514740974167">មកទីនេះបានរហ័សជាងមុន</translation> <translation id="1544826120773021464">ដើម្បីគ្រប់គ្រងគណនី Google របស់អ្នក សូមចុចប៊ូតុង "គ្រប់គ្រងគណនី"</translation> <translation id="1549000191223877751">ផ្លាស់ទៅផ្ទាំងវិនដូផ្សេងទៀត</translation> <translation id="1553358976309200471">ធ្វើបច្ចុប្បន្នភាព Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">ទំព័រ</translation> <translation id="4594952190837476234">ទំព័រសម្រាប់ប្រើពេលគ្មានអ៊ីនធឺណិតនេះបង្កើតឡើងនៅថ្ងៃទី <ph name="CREATION_TIME" /> ហើយវាអាចខុសពីកំណែសម្រាប់ប្រើពេលមានអ៊ីនធឺណិត។</translation> <translation id="4605958867780575332">បានលុបធាតុ៖ <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">រក្សាទុកទំព័រសម្រាប់ពេលក្រោយ និងទទួលការរំលឹក</translation> <translation id="4616150815774728855">បើក <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">ប្រើពាក្យសម្ងាត់</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{ពាក្យសម្ងាត់ដែលរងការលុកលុយ 1}other{ពាក្យសម្ងាត់ដែលរងការលុកលុយ #}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">បានស្ដារ <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">ពាក្យសម្ងាត់</translation> <translation id="7030675613184250187">អ្នកអាចរក្សាទុកទំព័រទៅក្នុងបញ្ជីអានរបស់អ្នក ដើម្បីអាចរកមើលទំព័រទាំងនោះម្ដងទៀត ឬអានដោយគ្មានអ៊ីនធឺណិត</translation> -<translation id="703523980599857277">ប្ដូរទំព័រដើម</translation> <translation id="7054588988317389591">យកការពណ៌នាអំពីរូបភាពឬ?</translation> <translation id="7055152154916055070">បានទប់ស្កាត់ការបញ្ជូនបន្ត៖</translation> <translation id="7063006564040364415">មិនអាចភ្ជាប់ទៅម៉ាស៊ីនមេសមកម្មទេ។</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome ជាកំណែថ្មីហើយ</translation> <translation id="7106762743910369165">កម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក</translation> <translation id="7121362699166175603">សម្អាតប្រវត្តិ និងការបំពេញដោយស្វ័យប្រវត្តិនៅក្នុងរបារអាសយដ្ឋាននេះ។ គណនី Google របស់អ្នកអាចនឹងមានទម្រង់ប្រវត្តិរុករកផ្សេងទៀតនៅ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ។</translation> -<translation id="7128355412245153445">មើលឃើញគេហទំព័រពេញនិយម និងអត្ថបទថ្មីៗរបស់អ្នក រាល់ពេលដែលអ្នកចុចប៊ូតុងដើម</translation> <translation id="7138678301420049075">ផ្សេងទៀត</translation> <translation id="7146622961999026732">គេហទំព័រ និងកម្មវិធីទាំងនេះហាក់ដូចជាសំខាន់ចំពោះអ្នក៖</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />ផ្ទុកទំព័រដើម<ph name="END_LINK" />ពី <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. ជ្រើសរើស <ph name="APP_NAME" />\n2. ចុច "ជានិច្ច"</translation> <translation id="8410695015584479363">តាមដានតម្លៃ</translation> <translation id="8413126021676339697">បង្ហាញប្រវត្តិពេញលេញ</translation> -<translation id="8425213833346101688">ប្តូរ</translation> <translation id="8427875596167638501">ផ្ទាំងមើលសាកល្បងបានបើកពាក់កណ្ដាល</translation> <translation id="8428213095426709021">ការកំណត់</translation> <translation id="8438566539970814960">ធ្វើឱ្យការស្វែងរក និងការរុករកប្រសើរជាងមុន</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">លុបសកម្មភាព Chrome របស់អ្នកពីសុខុមាលភាពឌីជីថល</translation> <translation id="927968626442779827">ប្រើមុខងារស្រាលនៅលើ Google Chrome</translation> <translation id="932327136139879170">ទំព័រដើម</translation> -<translation id="93753284658583800">បានប្ដូរទំព័រដើម</translation> <translation id="938850635132480979">កំហុស៖ <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">បញ្ចូលឃ្លាសម្ងាត់</translation> <translation id="948039501338975565">បញ្ជីថតចំណាំ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index 0a26f1d..f6d8c49f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">ಸಾಧನಗಳಾದ್ಯಂತ ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು, ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation> <translation id="1209206284964581585">ಸದ್ಯಕ್ಕೆ ಮರೆಮಾಡಿ</translation> <translation id="1227058898775614466">ನ್ಯಾವಿಗೇಶನ್ ಇತಿಹಾಸ</translation> -<translation id="1229399675748764149">ಈ ಪುಟವನ್ನು ನಿಮ್ಮ ಮುಖಪುಟವಾಗಿ ಮಾಡಿಕೊಳ್ಳಿ</translation> <translation id="1231733316453485619">ಸಿಂಕ್ ಆನ್ ಮಾಡುವುದೇ?</translation> <translation id="123724288017357924">ಸಂಗ್ರಹ ಮಾಡಿದ ವಿಷಯವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ, ಪ್ರಸ್ತುತ ಪುಟ ಮರುಲೋಡ್ ಮಾಡಿ</translation> <translation id="124678866338384709">ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್ ಮುಚ್ಚಿ</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">ಪಾಸ್ವರ್ಡ್ ಅಳಿಸಿ</translation> <translation id="1521774566618522728">ಇಂದು ಸಕ್ರಿಯ</translation> <translation id="1538801903729528855">ವೆಬ್ನಲ್ಲಿ ಉತ್ತಮವಾದ ಧ್ವನಿ ಅನುಭವವನ್ನು ಪಡೆಯಿರಿ</translation> -<translation id="1543538514740974167">ತ್ವರಿತವಾಗಿ ಇಲ್ಲಿ ಪಡೆಯಿರಿ</translation> <translation id="1544826120773021464">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸಲು, "ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸಿ" ಬಟನ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="1549000191223877751">ಇತರ ವಿಂಡೋಗೆ ಸರಿಸಿ</translation> <translation id="1553358976309200471">Chrome ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">ಈ ಆಫ್ಲೈನ್ ಪುಟವನ್ನು <ph name="CREATION_TIME" /> ರಂದು ರಚಿಸಲಾಗಿದೆ ಮತ್ತು ಇದು ಆನ್ಲೈನ್ ಆವೃತ್ತಿಗಿಂತ ಭಿನ್ನವಾಗಿರಬಹುದು.</translation> <translation id="4605958867780575332">ತೆಗೆದುಹಾಕಲಾಗಿರುವ ಐಟಂ: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ನಂತರದ ಬಳಕೆಗಾಗಿ ಪುಟಗಳನ್ನು ಉಳಿಸಿ ಹಾಗೂ ರಿಮೈಂಡರ್ ಪಡೆದುಕೊಳ್ಳಿ</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ತೆರೆಯಿರಿ</translation> <translation id="4634124774493850572">ಪಾಸ್ವರ್ಡ್ ಬಳಸಿ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ಪಾಸ್ವರ್ಡ್ ಅಪಾಯಕ್ಕೀಡಾಗಿದೆ}one{# ಪಾಸ್ವರ್ಡ್ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}other{# ಪಾಸ್ವರ್ಡ್ಗಳು ಅಪಾಯಕ್ಕೀಡಾಗಿವೆ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ</translation> <translation id="7029809446516969842">ಪಾಸ್ವರ್ಡ್ಗಳು</translation> <translation id="7030675613184250187">ಪುಟಗಳನ್ನು ಮತ್ತೆ ಹುಡುಕಲು ಅಥವಾ ಆಫ್ಲೈನ್ನಲ್ಲಿ ಓದಲು ನೀವು ಅವುಗಳನ್ನು ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿಗೆ ಉಳಿಸಬಹುದು</translation> -<translation id="703523980599857277">ಮುಖಪುಟವನ್ನು ಬದಲಾಯಿಸಿ</translation> <translation id="7054588988317389591">ಚಿತ್ರದ ವಿವರಣೆ ಪಡೆಯಬೇಕೇ?</translation> <translation id="7055152154916055070">ಮರುನಿರ್ದೇಶಿಸುವಿಕೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ:</translation> <translation id="7063006564040364415">ಸಿಂಕ್ ಸರ್ವರ್ಗೆ ಸಂಪರ್ಕ ಹೊಂದಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> <translation id="7106762743910369165">ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation> <translation id="7121362699166175603">ವಿಳಾಸ ಪಟ್ಟಿಯ ಇತಿಹಾಸ ಮತ್ತು ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಸುವಿಕೆಯನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ನಲ್ಲಿ ಇತರ ವಿಧಗಳ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೊಂದಿರಬಹುದು.</translation> -<translation id="7128355412245153445">ನೀವು ಮುಖಪುಟ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗಲೆಲ್ಲಾ, ನಿಮ್ಮ ಪ್ರಮುಖ ಸೈಟ್ಗಳು ಮತ್ತು ಇತ್ತೀಚಿನ ಸುದ್ದಿಗಳನ್ನು ನೋಡಿ</translation> <translation id="7138678301420049075">ಇತರೆ</translation> <translation id="7146622961999026732">ಈ ಸೈಟ್ಗಳು ಮತ್ತು ಆ್ಯಪ್ಗಳು ನಿಮಗೆ ಮುಖ್ಯವಾದವು ಎನಿಸುತ್ತಿದೆ:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> ನಿಂದ <ph name="BEGIN_LINK" />ಮೂಲ ಪುಟವನ್ನು ಲೋಡ್ ಮಾಡಿ<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ\n2. “ಯಾವಾಗಲೂ” ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="8410695015584479363">ದರಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ</translation> <translation id="8413126021676339697">ಪೂರ್ತಿ ಇತಿಹಾಸವನ್ನು ತೋರಿಸಿ</translation> -<translation id="8425213833346101688">ಬದಲಿಸಿ</translation> <translation id="8427875596167638501">ಪೂರ್ವವೀಕ್ಷಣೆ ಟ್ಯಾಬ್ ಅರ್ಧ ತೆರೆದಿದೆ</translation> <translation id="8428213095426709021">ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="8438566539970814960">ಹುಡುಕಾಟಗಳನ್ನು ಮತ್ತು ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಉತ್ತಮಗೊಳಿಸುವಂತೆ ಮಾಡಿ</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ಡಿಜಿಟಲ್ ಯೋಗಕ್ಷೇಮದಿಂದ ನಿಮ್ಮ Chrome ಚಟುವಟಿಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ</translation> <translation id="927968626442779827">Google Chrome ನಲ್ಲಿ ಲೈಟ್ ಮೋಡ್ ಬಳಸಿ</translation> <translation id="932327136139879170">ಹೋಮ್</translation> -<translation id="93753284658583800">ಮುಖಪುಟವನ್ನು ಬದಲಿಸಲಾಗಿದೆ</translation> <translation id="938850635132480979">ದೋಷ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ನಮೂದಿಸಿ</translation> <translation id="948039501338975565">ಬುಕ್ಮಾರ್ಕ್ ಫೋಲ್ಡರ್ಗಳ ಪಟ್ಟಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index fe7a7d0..1f506af7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">모든 기기에서 동기화 및 맞춤설정하려면 동기화를 사용 설정하세요.</translation> <translation id="1209206284964581585">지금 숨기기</translation> <translation id="1227058898775614466">탐색 기록</translation> -<translation id="1229399675748764149">이 페이지를 홈페이지로 지정</translation> <translation id="1231733316453485619">동기화를 사용하시겠습니까?</translation> <translation id="123724288017357924">캐시된 콘텐츠를 무시하고 현재 페이지 새로고침</translation> <translation id="124678866338384709">현재 탭 닫기</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">비밀번호 삭제</translation> <translation id="1521774566618522728">오늘 사용</translation> <translation id="1538801903729528855">웹에서의 음성 사용 환경 개선하기</translation> -<translation id="1543538514740974167">여기로 더 빠르게 이동하기</translation> <translation id="1544826120773021464">Google 계정을 관리하려면 '계정 관리' 버튼을 탭하세요.</translation> <translation id="1549000191223877751">다른 창으로 이동</translation> <translation id="1553358976309200471">Chrome 업데이트</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">사이트</translation> <translation id="4594952190837476234">이 오프라인 페이지는 <ph name="CREATION_TIME" />에 생성되었으며 온라인 버전과 다를 수 있습니다.</translation> <translation id="4605958867780575332"><ph name="ITEM_TITLE" /> 삭제됨</translation> -<translation id="4614535611158687827">나중에 읽을 수 있게 페이지를 저장하고 알림 받기</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> 열기</translation> <translation id="4634124774493850572">비밀번호 사용</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{유출된 비밀번호 1개}other{유출된 비밀번호 #개}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> 복원됨</translation> <translation id="7029809446516969842">비밀번호</translation> <translation id="7030675613184250187">읽기 목록에 페이지를 저장하여 다시 찾아보거나 오프라인 상태에서 읽을 수 있습니다.</translation> -<translation id="703523980599857277">홈페이지 변경</translation> <translation id="7054588988317389591">이미지 설명을 표시하시겠습니까?</translation> <translation id="7055152154916055070">다음 주소로의 리디렉션이 차단됨:</translation> <translation id="7063006564040364415">동기화 서버에 연결할 수 없습니다.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome이 최신 버전입니다.</translation> <translation id="7106762743910369165">조직에서 관리하는 브라우저입니다.</translation> <translation id="7121362699166175603">검색주소창에 저장된 방문 기록과 자동 완성 내역을 지웁니다. Google 계정의 내 활동(<ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />)에는 인터넷 사용 기록이 다른 형식으로 남아 있을 수도 있습니다.</translation> -<translation id="7128355412245153445">홈 버튼을 탭할 때마다 자주 방문하는 사이트 및 최근 스토리가 표시됩니다.</translation> <translation id="7138678301420049075">기타</translation> <translation id="7146622961999026732">다음 사이트와 앱은 중요할 수도 있습니다.</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" />에서 <ph name="BEGIN_LINK" />원본 페이지 로드<ph name="END_LINK" />하기</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" />을 선택합니다.\n2. '항상'을 탭합니다.</translation> <translation id="8410695015584479363">가격 추적</translation> <translation id="8413126021676339697">방문 기록 전체 보기</translation> -<translation id="8425213833346101688">변경</translation> <translation id="8427875596167638501">미리보기 탭이 절반 높이로 열림</translation> <translation id="8428213095426709021">설정</translation> <translation id="8438566539970814960">검색 및 탐색 기능 개선</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">디지털 웰빙에서 Chrome 활동 삭제</translation> <translation id="927968626442779827">Chrome에서 라이트 모드를 사용하세요.</translation> <translation id="932327136139879170">홈</translation> -<translation id="93753284658583800">홈페이지 변경됨</translation> <translation id="938850635132480979">오류: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">암호 입력</translation> <translation id="948039501338975565">북마크 폴더 목록</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 642616d..e9c5c98 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Бардык түзмөктөрүңүздө шайкештирүү жана жекечелештирүү үчүн шайкештирүүнү иштетиңиз</translation> <translation id="1209206284964581585">Азырынча жашыруу</translation> <translation id="1227058898775614466">Чабыттоо таржымалы</translation> -<translation id="1229399675748764149">Бул баракты башкы бет кылып алыңыз</translation> <translation id="1231733316453485619">Шайкештирүү күйгүзүлсүнбү?</translation> <translation id="123724288017357924">Кэшти колдонбой, учурдагы баракты кайра жүктөө</translation> <translation id="124678866338384709">Учурдагы өтмөктү жабуу</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Сырсөздү жок кылуу</translation> <translation id="1521774566618522728">Акыркы аракеттер: бүгүн</translation> <translation id="1538801903729528855">Вебде оозеки издегенде жакшыраак натыйжаларды алыңыз</translation> -<translation id="1543538514740974167">Бул жакка бир заматта кириңиз</translation> <translation id="1544826120773021464">Google аккаунтуңузду башкаруу үчүн "Аккаунтту башкаруу" баскычын таптап коюңуз</translation> <translation id="1549000191223877751">Башка терезеге жылдыруу</translation> <translation id="1553358976309200471">Chrome'ду жаңыртуу</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайттар</translation> <translation id="4594952190837476234">Бул оффлайн режиминдеги баракча <ph name="CREATION_TIME" /> сакталган жана онлайн версиясынан айырмаланышы мүмкүн.</translation> <translation id="4605958867780575332">Бул нерсе өчүрүлдү: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Баракчаларды кийинчерээк көрүү үчүн сактоо жана эскертме алуу</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> колдонмосун ачуу</translation> <translation id="4634124774493850572">Сырсөздү колдонуу</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 уурдалган сырсөз бар}other{# уурдалган сырсөз бар}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> калыбына келтирилди</translation> <translation id="7029809446516969842">Сырсөздөр</translation> <translation id="7030675613184250187">Барактарды кийин кайра таап же оффлайн режиминде окуу үчүн окула тургандардын тизмесине кошуп койсоңуз болот</translation> -<translation id="703523980599857277">Башкы бетти өзгөртүү</translation> <translation id="7054588988317389591">Сүрөттүн сүрөттөмөлөрүн аласызбы?</translation> <translation id="7055152154916055070">Багыттоо бөгөттөлгөн:</translation> <translation id="7063006564040364415">Шайкештештирүү серверине туташкан жок.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome жаңыртылды</translation> <translation id="7106762743910369165">Серепчиңиз уюмуңуз тарабынан башкарылат</translation> <translation id="7121362699166175603">Таржымал жана дарек тилкесиндеги автоматтык түрдө бүтүрүлгөн сөздөр тазаланат. Google аккаунтуңуздун серептөө таржымалынын башка түрлөрү <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> дарегинде болушу мүмкүн.</translation> -<translation id="7128355412245153445">Башкы бет баскычын таптаган сайын эң көп колдонгон сайттарыңыз жана акыркы окуяларыңыз көрүнөт</translation> <translation id="7138678301420049075">Башка</translation> <translation id="7146622961999026732">Бул сайттар менен колдонмолор сиз үчүн маанилүү окшойт:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> домениндеги <ph name="BEGIN_LINK" />түпнуска баракты жүктөө<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> колдонмосун тандаңыз\n2. "Ар дайымды" таптаңыз</translation> <translation id="8410695015584479363">Бааларга көз салуу</translation> <translation id="8413126021676339697">Таржымалды толугу менен көрсөтүү</translation> -<translation id="8425213833346101688">Өзгөртүү</translation> <translation id="8427875596167638501">Алдын ала көрүү өтмөгүнүн жарымы жабык</translation> <translation id="8428213095426709021">Жөндөөлөр</translation> <translation id="8438566539970814960">Издөө жана серептөө аракеттериңизди жакшыртыңыз</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome'ду колдонуу дайын-даректериңизди Санариптик бакубаттык кызматынан алып салыңыз</translation> <translation id="927968626442779827">Google Chrome'до Жөнөкөй режимди колдонуңуз</translation> <translation id="932327136139879170">Башкы</translation> -<translation id="93753284658583800">Башкы бет өзгөртүлдү</translation> <translation id="938850635132480979">Ката: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Купуя сөз айкашын киргизиңиз</translation> <translation id="948039501338975565">Кыстарма папкаларынын тизмеси</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 880971d..729da49 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">ເພື່ອຊິ້ງຂໍ້ມູນ ແລະ ປັບແຕ່ງເປັນແບບສ່ວນຕົວໃນທົ່ວອຸປະກອນ, ກະລຸນາເປີດການຊິ້ງຂໍ້ມູນກ່ອນ</translation> <translation id="1209206284964581585">ເຊື່ອງສຳລັບຕອນນີ້</translation> <translation id="1227058898775614466">ປະຫວັດການນຳທາງ</translation> -<translation id="1229399675748764149">ເຮັດໃຫ້ໜ້ານີ້ເປັນໜ້າຫຼັກຂອງທ່ານ</translation> <translation id="1231733316453485619">ເປີດການຊິ້ງຂໍ້ມູນບໍ?</translation> <translation id="123724288017357924">ໂຫຼດໜ້າປັດຈຸບັນຄືນໃໝ່, ໂດຍລະເລີຍເນື້ອຫາທີ່ຈັດເກັບໄວ້ຖາວອນ</translation> <translation id="124678866338384709">ປິດແຖບປັດຈຸບັນ</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">ລຶບລະຫັດຜ່ານ</translation> <translation id="1521774566618522728">ເປີດນຳໃຊ້ມື້ນີ້</translation> <translation id="1538801903729528855">ມີປະສົບການສຽງທີ່ດີກວ່າໃນເວັບ</translation> -<translation id="1543538514740974167">ມາທີ່ນີ້ໄດ້ໄວກວ່າ</translation> <translation id="1544826120773021464">ເພື່ອຈັດການບັນຊີ Google ຂອງທ່ານ, ກະລຸນາແຕະປຸ່ມ "ຈັດການບັນຊີ"</translation> <translation id="1549000191223877751">ຍ້າຍໄປຫາໜ້າຈໍອື່ນ</translation> <translation id="1553358976309200471">ອັບເດດ Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">ເວັບໄຊ</translation> <translation id="4594952190837476234">ໜ້າອອບລາຍນີ້ມາຈາກ <ph name="CREATION_TIME" /> ແລະ ອາດຈະແຕກຕ່າງຈາກເວີຊັນອອນລາຍ.</translation> <translation id="4605958867780575332">ລຶບລາຍການແລ້ວ: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ບັນທຶກໜ້າສຳລັບພາຍຫຼັງ ແລະ ຮັບການແຈ້ງເຕືອນ</translation> <translation id="4616150815774728855">ເປີດ <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">ໃຊ້ລະຫັດຜ່ານ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{ມີລະຫັດຜ່ານທີ່ຖືກລະເມີດ 1 ລາຍການ}other{ມີລະຫັດຜ່ານທີ່ຖືກລະເມີດ # ລາຍການ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">ກູ້ຂໍ້ມູນເມື່ອ <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">ລະຫັດຜ່ານ</translation> <translation id="7030675613184250187">ທ່ານສາມາດບັນທຶກໜ້າໃສ່ລາຍຊື່ການອ່ານຂອງທ່ານເພື່ອຊອກເຫັນພວກມັນອີກຄັ້ງ ຫຼື ອ່ານແບບອອບລາຍໄດ້</translation> -<translation id="703523980599857277">ປ່ຽນໜ້າຫຼັກ</translation> <translation id="7054588988317389591">ຮັບຄຳອະທິບາຍຮູບບໍ?</translation> <translation id="7055152154916055070">ບລັອກການປ່ຽນເສັ້ນທາງແລ້ວ:</translation> <translation id="7063006564040364415">ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບເຊີບເວີຊິງຄ໌ໄດ້.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome ໃໝ່ຫຼ້າສຸດແລ້ວ</translation> <translation id="7106762743910369165">ໂປຣແກຣມທ່ອງເວັບຂອງທ່ານໄດ້ຮັບການຈັດການໂດຍອົງການຈັດຕັ້ງຂອງທ່ານ</translation> <translation id="7121362699166175603">ລຶບລ້າງປະຫວັດ ແລະ ການປະກອບຂໍ້ມູນອັດຕະໂນມັດໃນແຖບທີ່ຢູ່. ບັນຊີ Google ຂອງທ່ານອາດຈະມີຮູບແບບອື່ນຂອງປະຫວັດການທ່ອງເວັບຢູ່ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">ເບິ່ງເວັບໄຊຍອດນິຍົມ ແລະ ເລື່ອງລາວຫຼ້າສຸດໃນທຸກເມື່ອທີ່ທ່ານແຕະປຸ່ມໜ້າທໍາອິດ</translation> <translation id="7138678301420049075">ອື່ນໆ</translation> <translation id="7146622961999026732">ເວັບໄຊ ແລະ ແອັບເຫຼົ່ານີ້ປາກົດວ່າສຳຄັນຕໍ່ກັບທ່ານ:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />ໂຫຼດໜ້າຕົ້ນສະບັບ<ph name="END_LINK" /> ຈາກ <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. ເລືອກ <ph name="APP_NAME" />\n2. ແຕະ “ທຸກຄັ້ງ”</translation> <translation id="8410695015584479363">ຕິດຕາມລາຄາ</translation> <translation id="8413126021676339697">ສະແດງປະຫວັດທັງໝົດ</translation> -<translation id="8425213833346101688">ປ່ຽນແປງ</translation> <translation id="8427875596167638501">ແຖບສະແດງຕົວຢ່າງເປີດເຄິ່ງໜຶ່ງ</translation> <translation id="8428213095426709021">ການຕັ້ງຄ່າ</translation> <translation id="8438566539970814960">ເຮັດໃຫ້ການຊອກຫາ ແລະ ການທ່ອງເວັບດີຂຶ້ນ</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ລຶບການເຄື່ອນໄຫວໃນ Chrome ຂອງທ່ານອອກຈາກ Digital Wellbeing</translation> <translation id="927968626442779827">ໃຊ້ໂໝດ Lite ໃນ Google Chrome</translation> <translation id="932327136139879170">ບ້ານ</translation> -<translation id="93753284658583800">ປ່ຽນໜ້າຫຼັກແລ້ວ</translation> <translation id="938850635132480979">ຜິດພາດ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ປ້ອນວະລີຜ່ານໃສ່</translation> <translation id="948039501338975565">ລາຍຊື່ໂຟນເດີບຸກມາກ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 336cd4e3..13ab3a8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Kad turinys būtų sinchronizuojamas visuose įrenginiuose, įjunkite sinchronizavimą</translation> <translation id="1209206284964581585">Slėpti dabar</translation> <translation id="1227058898775614466">Naršymo istorija</translation> -<translation id="1229399675748764149">Šio puslapio nustatymas kaip pagrindinio puslapio</translation> <translation id="1231733316453485619">Įjungti sinchronizavimą?</translation> <translation id="123724288017357924">Įk. šį puslapį iš naujo, nepais. talp. es. turinio</translation> <translation id="124678866338384709">Uždaryti dabartinį skirtuką</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Ištrinti slaptažodį</translation> <translation id="1521774566618522728">Aktyvus šiandien</translation> <translation id="1538801903729528855">Dar geriau išnaudokite veiksmų balsu galimybes žiniatinklyje</translation> -<translation id="1543538514740974167">Spartesnė prieiga</translation> <translation id="1544826120773021464">Jei norite tvarkyti „Google“ paskyrą, palieskite mygtuką „Tvarkyti“</translation> <translation id="1549000191223877751">Perkelti į kitą langą</translation> <translation id="1553358976309200471">Atnaujinkite „Chrome“</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Svetainės</translation> <translation id="4594952190837476234">Šis neprisijungus naudojamas puslapis sukurtas <ph name="CREATION_TIME" />, todėl gali skirtis nuo prisijungus pateiktos versijos.</translation> <translation id="4605958867780575332">Pašalintas elementas: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Išsaugokite puslapius, jei norite peržiūrėti vėliau, ir gaukite priminimą</translation> <translation id="4616150815774728855">Atidaryti „<ph name="WEBAPK_NAME" />“</translation> <translation id="4634124774493850572">Naudoti slaptažodį</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 pažeistas slaptažodis}one{# pažeistas slaptažodis}few{# pažeisti slaptažodžiai}many{# pažeisto slaptažodžio}other{# pažeistų slaptažodžių}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Atkurta „<ph name="ITEM_TITLE" />“</translation> <translation id="7029809446516969842">Slaptažodžiai</translation> <translation id="7030675613184250187">Skaitymo sąraše galite išsaugoti puslapių, kad galėtumėte rasti juos vėliau ir skaityti neprisijungę</translation> -<translation id="703523980599857277">Keisti pagrindinį puslapį</translation> <translation id="7054588988317389591">Gauti vaizdų aprašus?</translation> <translation id="7055152154916055070">Peradresavimas užblokuotas:</translation> <translation id="7063006564040364415">Nepavyko prisijungti prie sinchronizavimo serverio.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">„Chrome“ atnaujinta</translation> <translation id="7106762743910369165">Jūsų naršyklę tvarko jūsų organizacija</translation> <translation id="7121362699166175603">Išvaloma istorija ir automatiniai užbaigimai adreso juostoje. „Google“ paskyroje gali būti kito tipo naršymo istorijos, kuri pasiekiama adresu <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Peržiūrėkite populiariausias svetaines ir naujausius pasakojimus palietę pagrindinio ekrano mygtuką</translation> <translation id="7138678301420049075">Kitas</translation> <translation id="7146622961999026732">Panašu, kad toliau nurodytos svetainės ir programos jums yra svarbios.</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Įkelti pradinį puslapį<ph name="END_LINK" /> iš <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Pasirinkite „<ph name="APP_NAME" />“\n2. Palieskite „Visada“</translation> <translation id="8410695015584479363">Stebėti kainas</translation> <translation id="8413126021676339697">Rodyti visą istoriją</translation> -<translation id="8425213833346101688">Keisti</translation> <translation id="8427875596167638501">Peržiūros skirtukas atidarytas iki pusės ekrano</translation> <translation id="8428213095426709021">Nustatymai</translation> <translation id="8438566539970814960">Tobulinti paieškas ir naršymą</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">„Chrome“ veiklos pašalinimas iš Skaitmeninės gerovės</translation> <translation id="927968626442779827">Naudokite supaprastintą režimą naršyklėje „Google Chrome“</translation> <translation id="932327136139879170">Kontaktinė namų informacija</translation> -<translation id="93753284658583800">Pagrindinis puslapis pakeistas</translation> <translation id="938850635132480979">Klaida: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Įvesti slaptafrazę</translation> <translation id="948039501338975565">Žymių aplankų sąrašas</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index 9effadb..7f6741ca 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Lai sinhronizētu un personalizētu saturu dažādās ierīcēs, ieslēdziet sinhronizāciju.</translation> <translation id="1209206284964581585">Pagaidām slēpt</translation> <translation id="1227058898775614466">Navigācijas vēsture</translation> -<translation id="1229399675748764149">Iestatiet šo lapu kā sākumlapu</translation> <translation id="1231733316453485619">Vai ieslēgt sinhronizāciju?</translation> <translation id="123724288017357924">Atkārtoti ielādēt lapu, ignorējot saturu kešatmiņā</translation> <translation id="124678866338384709">Aizvērt pašreizējo cilni</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Dzēst paroli</translation> <translation id="1521774566618522728">Aktīvs šodien</translation> <translation id="1538801903729528855">Labākas balss izmantošanas iespējas tīmeklī</translation> -<translation id="1543538514740974167">Ātrāka piekļuve</translation> <translation id="1544826120773021464">Lai pārvaldītu savu Google kontu, pieskarieties pogai “Konta pārvaldība”</translation> <translation id="1549000191223877751">Pārvietot uz citu logu</translation> <translation id="1553358976309200471">Atjaunināt Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Vietnes</translation> <translation id="4594952190837476234">Šī lapas bezsaistes versija (izveidota: <ph name="CREATION_TIME" />) var atšķirties no tiešsaistes versijas.</translation> <translation id="4605958867780575332">Vienums noņemts: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Saglabājiet lapas lasīšanai vēlāk un saņemiet atgādinājumu.</translation> <translation id="4616150815774728855">Atvērt <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Izmantot paroli</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 uzlauzta parole}zero{# uzlauztu paroļu}one{# uzlauzta parole}other{# uzlauztas paroles}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Atjaunots vienums <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Paroles</translation> <translation id="7030675613184250187">Lasīšanas sarakstā varat saglabāt lapas, lai atrastu tās vēlāk vai lasītu bezsaistē</translation> -<translation id="703523980599857277">Mainīt sākumlapu</translation> <translation id="7054588988317389591">Vai vēlaties iespējot attēlu aprakstus?</translation> <translation id="7055152154916055070">Novirzīšana ir bloķēta:</translation> <translation id="7063006564040364415">Nevarēja izveidot savienojumu ar sinhronizācijas serveri.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome jaunākā versija jau ir instalēta.</translation> <translation id="7106762743910369165">Pārlūku pārvalda jūsu organizācija</translation> <translation id="7121362699166175603">Notīra vēsturi un automātiskās pabeigšanas datus adreses joslā. Jūsu Google kontam var būt cita veida pārlūkošanas vēstures dati vietnē <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Skatiet vietnes, ko apmeklējat visbiežāk, kā arī jaunākos stāstus katru reizi, kad pieskaraties pogai Sākums.</translation> <translation id="7138678301420049075">Cits</translation> <translation id="7146622961999026732">Šķiet, ka šīs vietnes un lietotnes jums ir svarīgas:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Ielādēt sākotnējo lapu<ph name="END_LINK" /> no <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Atlasiet <ph name="APP_NAME" />.\n2. Pieskarieties vienumam “Vienmēr”.</translation> <translation id="8410695015584479363">Izsekot cenām</translation> <translation id="8413126021676339697">Rādīt pilnu vēsturi</translation> -<translation id="8425213833346101688">Mainīt</translation> <translation id="8427875596167638501">Priekšskatījuma cilne ir daļēji atvērta</translation> <translation id="8428213095426709021">Iestatījumi</translation> <translation id="8438566539970814960">Uzlabot meklēšanu un pārlūkošanu</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome darbību noņemšana no Digitālās labjutības</translation> <translation id="927968626442779827">Izmantojiet Google Chrome vienkāršoto režīmu.</translation> <translation id="932327136139879170">Sākums</translation> -<translation id="93753284658583800">Sākumlapa nomainīta</translation> <translation id="938850635132480979">Kļūda: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ievadiet ieejas frāzi</translation> <translation id="948039501338975565">Grāmatzīmju mapju saraksts</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index 937feceb..c7e9151 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">За да ги синхронизирате и персонализирате уредите, вклучете синхронизација</translation> <translation id="1209206284964581585">Сокриј засега</translation> <translation id="1227058898775614466">Историја на навигација</translation> -<translation id="1229399675748764149">Направете ја страницава ваша почетна страница</translation> <translation id="1231733316453485619">Да се вклучи синхронизација?</translation> <translation id="123724288017357924">Вчитај тековна страница, без кеширана содржина</translation> <translation id="124678866338384709">Затвори ја тековната картичка</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Избриши ја лозинката</translation> <translation id="1521774566618522728">Активен денес</translation> <translation id="1538801903729528855">Добијте подобро гласовно доживување на интернет</translation> -<translation id="1543538514740974167">Стигнете тука побрзо</translation> <translation id="1544826120773021464">За да управувате со сметката на Google, допрете на копчето „Управувајте со сметката“</translation> <translation id="1549000191223877751">Премести во друг прозорец</translation> <translation id="1553358976309200471">Ажурирај го Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сајтови</translation> <translation id="4594952190837476234">Офлајн страницава е од <ph name="CREATION_TIME" /> и може да се разликува од онлајн верзијата.</translation> <translation id="4605958867780575332">Отстранета ставка: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Зачувајте ги страниците за подоцна и добијте потсетник</translation> <translation id="4616150815774728855">Отвори <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Употреби ја лозинката</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 компромитирана лозинка}one{# компромитирана лозинка}other{# компромитирани лозинки}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Преземањето на <ph name="ITEM_TITLE" /> е вратено</translation> <translation id="7029809446516969842">Лозинки</translation> <translation id="7030675613184250187">Може да зачувувате страници во списокот за читање за да ги наоѓате повторно или да ги читате офлајн</translation> -<translation id="703523980599857277">Промени ја почетната страница</translation> <translation id="7054588988317389591">Сакате ли да добивате описи на слики?</translation> <translation id="7055152154916055070">Пренасочувањето е блокирано:</translation> <translation id="7063006564040364415">Не може да се поврзе на серверот за синхронизација.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome е ажуриран</translation> <translation id="7106762743910369165">Вашата организација управува со прелистувачот</translation> <translation id="7121362699166175603">Ја чисти историјата и автоматските довршувања во лентата за адреси. Вашата сметка на Google можеби има други видови историја на прелистување на <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Гледајте ги најдобрите сајтови и неодамнешните приказни секојпат кога ќе го допрете копчето за почетен екран</translation> <translation id="7138678301420049075">Друго</translation> <translation id="7146622961999026732">Изгледа дека сајтовиве и апликацииве ви се важни:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Вчитај ја оригиналната страница<ph name="END_LINK" /> од <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Изберете <ph name="APP_NAME" />\n2. Допрете „Секогаш“</translation> <translation id="8410695015584479363">Следете ги цените</translation> <translation id="8413126021676339697">Прикажи ја целата историја</translation> -<translation id="8425213833346101688">Промени</translation> <translation id="8427875596167638501">Картичката за преглед е отворена на половина екран</translation> <translation id="8428213095426709021">Поставки</translation> <translation id="8438566539970814960">Подобрете ги пребарувањата и прелистувањето</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Отстранете ја вашата активност на Chrome од „Дигитална благосостојба“</translation> <translation id="927968626442779827">Користете „Лесен режим“ на Google Chrome</translation> <translation id="932327136139879170">Дома</translation> -<translation id="93753284658583800">Почетната страница се промени</translation> <translation id="938850635132480979">Грешка: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Внеси пристапна фраза</translation> <translation id="948039501338975565">Список со папки за обележувачи</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index f62d876..50546e34 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">ഉപകരണങ്ങളിൽ ഉടനീളം സമന്വയിപ്പിക്കാനും വ്യക്തിപരമാക്കാനും, സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> <translation id="1209206284964581585">ഇപ്പോഴത്തേയ്ക്ക് മറയ്ക്കുക</translation> <translation id="1227058898775614466">നാവിഗേഷന് ചരിത്രം</translation> -<translation id="1229399675748764149">ഈ പേജ് നിങ്ങളുടെ ഹോം പേജാക്കുക</translation> <translation id="1231733316453485619">സമന്വയിപ്പിക്കൽ ഓണാക്കണോ?</translation> <translation id="123724288017357924">കാഷെ ചെയ്ത ഉള്ളടക്കം ഒഴിവാക്കി കൊണ്ട്, നിലവിലെ പേജ് റീലോഡ് ചെയ്യുക</translation> <translation id="124678866338384709">നിലവിലെ ടാബ് അടയ്ക്കുക</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">പാസ്വേഡ് ഇല്ലാതാക്കുക</translation> <translation id="1521774566618522728">ഇന്ന് സജീവമായിരുന്നു</translation> <translation id="1538801903729528855">വെബിൽ മികച്ച ശബ്ദാനുഭവം നേടൂ</translation> -<translation id="1543538514740974167">ഇവിടെ വേഗത്തിൽ എത്തുക</translation> <translation id="1544826120773021464">നിങ്ങളുടെ Google അക്കൗണ്ട് മാനേജ് ചെയ്യാൻ, "അക്കൗണ്ട് മാനേജ് ചെയ്യുക" ബട്ടണിൽ ടാപ്പ് ചെയ്യുക</translation> <translation id="1549000191223877751">മറ്റൊരു വിൻഡോയിലേക്ക് നീക്കുക</translation> <translation id="1553358976309200471">Chrome അപ്ഡേറ്റുചെയ്യുക</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">ഈ ഓഫ്ലൈൻ പേജ് <ph name="CREATION_TIME" /> -ന് സൃഷ്ടിച്ചതാണ്, അതിനാൽ ഓൺലൈൻ പതിപ്പിൽ നിന്ന് വ്യത്യസ്തമായിരിക്കാം.</translation> <translation id="4605958867780575332">നീക്കംചെയ്ത ഇനം: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">പിന്നീട് വായിക്കുന്നതിന് പേജുകൾ സംരക്ഷിച്ച് റിമൈൻഡർ നേടുക</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> തുറക്കുക</translation> <translation id="4634124774493850572">പാസ്വേഡ് ഉപയോഗിക്കുക</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{അപഹരിക്കപ്പെട്ട ഒരു പാസ്വേഡ്}other{അപഹരിക്കപ്പെട്ട # പാസ്വേഡുകൾ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> പുനഃസ്ഥാപിച്ചു</translation> <translation id="7029809446516969842">പാസ്വേഡുകള്</translation> <translation id="7030675613184250187">പേജുകൾ വീണ്ടും കണ്ടെത്താനോ ഓഫ്ലൈനിൽ വായിക്കാനോ അവ നിങ്ങളുടെ വായനാ ലിസ്റ്റിൽ സംരക്ഷിക്കാം</translation> -<translation id="703523980599857277">ഹോം പേജ് മാറ്റുക</translation> <translation id="7054588988317389591">ചിത്ര വിവരണങ്ങൾ നേടണോ?</translation> <translation id="7055152154916055070">റീഡയറക്റ്റ് ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7063006564040364415">സമന്വയ സെർവറിലേക്ക് കണക്റ്റ് ചെയ്യാനായില്ല.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome അപ് റ്റു ഡേറ്റാണ്</translation> <translation id="7106762743910369165">നിങ്ങളുടെ സ്ഥാപനമാണ് നിങ്ങളുടെ ബ്രൗസർ മാനേജ് ചെയ്യുന്നത്</translation> <translation id="7121362699166175603">ചരിത്രവും വിലാസ ബാറിലെ സ്വയം പൂർത്തീകരണങ്ങളും മായ്ക്കുന്നു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> എന്നതിൽ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation> -<translation id="7128355412245153445">നിങ്ങൾ ഹോം ബട്ടൺ ടാപ്പ് ചെയ്യുമ്പോഴൊക്കെ പ്രധാന സൈറ്റുകളും അടുത്തിടെയുള്ള സ്റ്റോറികളും കാണുക</translation> <translation id="7138678301420049075">മറ്റുള്ളവ</translation> <translation id="7146622961999026732">ഈ സൈറ്റുകളും ആപ്പുകളും നിങ്ങൾക്ക് പ്രാധാന്യമുള്ളവയാകാം:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" />-ല് നിന്ന് <ph name="BEGIN_LINK" />യഥാര്ത്ഥ പേജ് ലോഡ് ചെയ്യുക<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> തിരഞ്ഞെടുക്കുക\n2. “എല്ലായ്പ്പോഴും” ടാപ്പ് ചെയ്യുക</translation> <translation id="8410695015584479363">നിരക്കുകൾ ട്രാക്ക് ചെയ്യുക</translation> <translation id="8413126021676339697">മുഴുവന് ചരിത്രവും കാണിക്കുക</translation> -<translation id="8425213833346101688">മാറ്റുക</translation> <translation id="8427875596167638501">പ്രിവ്യു ടാബ് പാതി തുറന്നിരിക്കുന്നു</translation> <translation id="8428213095426709021">ക്രമീകരണങ്ങള്</translation> <translation id="8438566539970814960">തിരയലുകളും ബ്രൗസിംഗും മികച്ചതാക്കുക</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ഡിജിറ്റൽ ആരോഗ്യത്തിൽ നിന്ന് നിങ്ങളുടെ Chrome ആക്റ്റിവിറ്റി നീക്കം ചെയ്യുക</translation> <translation id="927968626442779827">Google Chrome-ൽ ലൈറ്റ് മോഡ് ഉപയോഗിക്കൂ</translation> <translation id="932327136139879170">ഹോം</translation> -<translation id="93753284658583800">ഹോംപേജ് മാറ്റി</translation> <translation id="938850635132480979">പിശക്: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">പാസ്ഫ്രെയ്സ് നല്കുക</translation> <translation id="948039501338975565">ബുക്ക്മാർക്ക് ഫോൾഡറുകളുടെ ലിസ്റ്റ്</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 65b1b28..c4d7f14e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Төхөөрөмжүүдэд синк хийж хувийн болгохын тулд синкийг асаана уу</translation> <translation id="1209206284964581585">Одоо нуух</translation> <translation id="1227058898775614466">Навигацын түүх</translation> -<translation id="1229399675748764149">Энэ хуудсыг нүүр хуудсаа болгох</translation> <translation id="1231733316453485619">Синк асаах уу?</translation> <translation id="123724288017357924">Нөөцөлсөн агуулгыг алгасч одоогийн хуудсыг дахин ачаалах</translation> <translation id="124678866338384709">Үндсэн чихтэй хуудсыг хаах</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Нууц үг устгах</translation> <translation id="1521774566618522728">Өнөөдөр идэвхтэй</translation> <translation id="1538801903729528855">Веб дээр илүү сайн дуут туршлагыг авах</translation> -<translation id="1543538514740974167">Энд хурдан очих</translation> <translation id="1544826120773021464">Google бүртгэлээ удирдахын тулд "Бүртгэлээ удирдах" товчлуур дээр товшино уу</translation> <translation id="1549000191223877751">Бусад цонх руу шилжих</translation> <translation id="1553358976309200471">Chrome-г шинэчлэх</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайт</translation> <translation id="4594952190837476234">Энэ офлайн хуудсыг <ph name="CREATION_TIME" />-с харуулж байгаа бөгөөд онлайн хувилбараас өөр байж болзошгүй.</translation> <translation id="4605958867780575332">Зүйл устгасан: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Хуудаснуудыг дараа уншихаар хадгалж, сануулагч аваарай</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" />-г нээх</translation> <translation id="4634124774493850572">Нууц үг ашиглах</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Алдагдсан 1 нууц үг}other{Алдагдсан # нууц үг}}</translation> @@ -876,7 +873,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" />-г сэргээсэн</translation> <translation id="7029809446516969842">Нууц үг</translation> <translation id="7030675613184250187">Та хуудаснуудыг дахин хайж олох эсвэл офлайнаар уншихын тулд тэдгээрийг унших жагсаалтдаа хадгалах боломжтой</translation> -<translation id="703523980599857277">Нүүр хуудсыг өөрчлөх</translation> <translation id="7054588988317389591">Зургийн тайлбар авах уу?</translation> <translation id="7055152154916055070">Дахин чиглүүлэлтийг блоклосон:</translation> <translation id="7063006564040364415">Синхийн сервер лүү холбогдож чадсангүй.</translation> @@ -887,7 +883,6 @@ <translation id="7088681679121566888">Chrome шинэчлэгдсэн байна</translation> <translation id="7106762743910369165">Танай байгууллага таны хөтчийг удирддаг</translation> <translation id="7121362699166175603">Tүүх болон хаяг оруулах хэсгийн автомат гүйцээлтийг устгана. Таны Google бүртгэл <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-д хайлтын түүхийн өөр хэлбэртэй байж болзошгүй.</translation> -<translation id="7128355412245153445">Нүүр хуудасны товчлуур дээр товших бүрдээ шилдэг сайт болон сүүлийн үеийн мэдээ нийтлэлийг хараарай</translation> <translation id="7138678301420049075">Бусад</translation> <translation id="7146622961999026732">Эдгээр сайт болон апп танд чухал бололтой:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Эх хуудсыг<ph name="END_LINK" /> <ph name="DOMAIN_NAME" />-с ачаалах</translation> @@ -1077,7 +1072,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" />-г сонгоно уу\n2. “Байнга”-ыг товшино уу</translation> <translation id="8410695015584479363">Үнэ хянах</translation> <translation id="8413126021676339697">Бүрэн түүхийг харуулах</translation> -<translation id="8425213833346101688">Өөрчлөлт</translation> <translation id="8427875596167638501">Урьдчилан үзэх табыг хагас нээсэн</translation> <translation id="8428213095426709021">Тохиргоо</translation> <translation id="8438566539970814960">Хайлт болон хөтлөх явцыг сайжруулаарай</translation> @@ -1195,7 +1189,6 @@ <translation id="926205370408745186">Chrome-н үйл ажиллагаагаа Дижитал хэрэглээнээс устгах</translation> <translation id="927968626442779827">Google Chrome дээр Lite горимыг ашиглаарай</translation> <translation id="932327136139879170">Нүүр хуудас</translation> -<translation id="93753284658583800">Нүүр хуудсыг өөрчилсөн</translation> <translation id="938850635132480979">Алдаа: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Нэвтрэх үгүүдийг оруулна уу</translation> <translation id="948039501338975565">Хавчуурганы фолдерын жагсаалт</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index ef188afc..8677789 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">सर्व डिव्हाइसवर सिंक आणि पर्सनलाइझ करण्यासाठी, सिंक सुरू करा</translation> <translation id="1209206284964581585">आतासाठी लपवा</translation> <translation id="1227058898775614466">नेव्हिगेशन इतिहास</translation> -<translation id="1229399675748764149">या पेजला तुमचे होम पेज बनवा</translation> <translation id="1231733316453485619">सिंक सुरू करायचे का?</translation> <translation id="123724288017357924">कॅशे केलेला आशय दुर्लक्षित करून, सद्य पेज रीलोड करा</translation> <translation id="124678866338384709">वर्तमान टॅब बंद करा</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">पासवर्ड हटवा</translation> <translation id="1521774566618522728">आज ॲक्टिव्ह होते</translation> <translation id="1538801903729528855">वेबवर आवाजाचा चांगला अनुभव मिळवा</translation> -<translation id="1543538514740974167">येथे आणखी झटपट जा</translation> <translation id="1544826120773021464">तुमचे Google खाते व्यवस्थापित करण्यासाठी, "खाते व्यवस्थापित करा" बटणावर टॅप करा</translation> <translation id="1549000191223877751">अन्य विंडोवर हलवा</translation> <translation id="1553358976309200471">Chrome अपडेट करा</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">हे <ph name="CREATION_TIME" /> पासूनचे ऑफलाइन पेज आहे आणि ऑनलाइन आवृत्तीपेक्षा वेगळे असू शकते.</translation> <translation id="4605958867780575332">आयटम काढला: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">पेज नंतर वाचण्यासाठी सेव्ह करा आणि रिमाइंडर मिळवा</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> उघडा</translation> <translation id="4634124774493850572">पासवर्ड वापरा</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{एक धोक्यात असलेला पासवर्ड}other{# धोक्यात असलेले पासवर्ड}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> रिस्टोअर केले</translation> <translation id="7029809446516969842">पासवर्ड</translation> <translation id="7030675613184250187">पेज पुन्हा शोधण्यासाठी किंवा ऑफलाइन वाचण्यासाठी तुम्ही ती तुमच्या वाचन सूचीवर सेव्ह करू शकता</translation> -<translation id="703523980599857277">होम पेज बदला</translation> <translation id="7054588988317389591">इमेजची वर्णने मिळवायची का?</translation> <translation id="7055152154916055070">रीडिरेक्ट ब्लॉक केले:</translation> <translation id="7063006564040364415">संकालित सर्व्हरशी कनेक्ट करू शकलो नाही.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome अप टू डेट आहे</translation> <translation id="7106762743910369165">तुमचा ब्राउझर तुमच्या संस्थेद्वारे व्यवस्थापित केला जातो</translation> <translation id="7121362699166175603">अॅड्रेस बारवरील इतिहास आणि आपोआप पूर्ण करण्याचे दाखले साफ करते. तुमच्या Google खात्यामध्ये <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> वर कदाचित ब्राउझिंगचे इतर फॉर्म असतील.</translation> -<translation id="7128355412245153445">तुम्ही होम बटण टॅप करता तेव्हा तुमच्या टॉप साइट आणि अलीकडील स्टोरी पहा</translation> <translation id="7138678301420049075">इतर</translation> <translation id="7146622961999026732">या साइट आणि ही अॅप्स तुमच्यासाठी महत्त्वाची आहेत असे दिसते:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> वरून <ph name="BEGIN_LINK" />मुळचे पेज लोड करा<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">१. <ph name="APP_NAME" /> निवडा\n2. “नेहमी” वर टॅप करा</translation> <translation id="8410695015584479363">किमती ट्रॅक करा</translation> <translation id="8413126021676339697">संपूर्ण इतिहास दर्शवा</translation> -<translation id="8425213833346101688">बदल करा</translation> <translation id="8427875596167638501">पूर्वावलोकन टॅब अर्धा उघडा आहे</translation> <translation id="8428213095426709021">सेटिंग्ज</translation> <translation id="8438566539970814960">शोध आणि ब्राउझ करणे चांगले करा</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Digital wellbeing वरून तुमची Chrome ॲक्टिव्हिटी काढून टाका</translation> <translation id="927968626442779827">Google Chrome वर लाइट मोड वापरा</translation> <translation id="932327136139879170">होम</translation> -<translation id="93753284658583800">होम पेज बदलले</translation> <translation id="938850635132480979">एरर: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">सांकेतिक पासफ्रेझ एंटर करा</translation> <translation id="948039501338975565">बुकमार्क फोल्डरची सूची</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 0b19045f..e46aaf4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Hidupkan penyegerakan untuk melakukan penyegerakan dan pemperibadian pada semua peranti</translation> <translation id="1209206284964581585">Sorok sementara</translation> <translation id="1227058898775614466">Sejarah navigasi</translation> -<translation id="1229399675748764149">Jadikan halaman ini halaman utama anda</translation> <translation id="1231733316453485619">Hidupkan penyegerakan?</translation> <translation id="123724288017357924">Muat semula laman semasa dan abaikan kdgn dicache</translation> <translation id="124678866338384709">Tutup tab semasa</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Padam kata laluan</translation> <translation id="1521774566618522728">Aktif hari ini</translation> <translation id="1538801903729528855">Dapatkan pengalaman suara yang lebih baik pada web</translation> -<translation id="1543538514740974167">Akses lebih pantas</translation> <translation id="1544826120773021464">Untuk mengurus akaun Google anda, ketik butang "Urus akaun"</translation> <translation id="1549000191223877751">Alihkan ke tetingkap lain</translation> <translation id="1553358976309200471">Kemas Kini Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Tapak</translation> <translation id="4594952190837476234">Halaman luar talian ini dari <ph name="CREATION_TIME" /> dan mungkin berbeza daripada versi dalam talian.</translation> <translation id="4605958867780575332">Item dialih keluar: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Simpan halaman untuk kemudian dan dapatkan peringatan</translation> <translation id="4616150815774728855">Buka <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Gunakan kata laluan</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 kata laluan yang terjejas}other{# kata laluan yang terjejas}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> dipulihkan</translation> <translation id="7029809446516969842">Kata laluan</translation> <translation id="7030675613184250187">Anda boleh menyimpan halaman ke senarai bacaan anda untuk mencari halaman itu lagi atau membaca halaman itu secara luar talian</translation> -<translation id="703523980599857277">Tukar halaman utama</translation> <translation id="7054588988317389591">Dapatkan perihalan imej?</translation> <translation id="7055152154916055070">Ubah hala disekat:</translation> <translation id="7063006564040364415">Tidak dapat bersambung ke pelayan yang disegerakkan.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome sudah dikemas kini</translation> <translation id="7106762743910369165">Penyemak imbas anda diurus oleh organisasi anda</translation> <translation id="7121362699166175603">Mengosongkan sejarah dan autoselesai dalam bar alamat. Akaun Google anda mungkin mempunyai sejarah penyemakan imbas dalam bentuk lain di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Lihat tapak web paling kerap dilawati dan cerita baru-baru ini setiap kali anda mengetik butang Skrin utama</translation> <translation id="7138678301420049075">Lain-lain</translation> <translation id="7146622961999026732">Tapak dan apl ini nampaknya penting kepada anda:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Muatkan halaman asal<ph name="END_LINK" /> daripada <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Pilih <ph name="APP_NAME" />\n2. Ketik “Sentiasa”</translation> <translation id="8410695015584479363">Jejaki harga</translation> <translation id="8413126021676339697">Paparkan sejarah penuh</translation> -<translation id="8425213833346101688">Tukar</translation> <translation id="8427875596167638501">Tab pratonton separa terbuka</translation> <translation id="8428213095426709021">Tetapan</translation> <translation id="8438566539970814960">Mempertingkatkan carian dan penyemakan imbas</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Alih keluar aktiviti Chrome anda daripada Kesejahteraan Digital</translation> <translation id="927968626442779827">Gunakan mod Ringkas pada Google Chrome</translation> <translation id="932327136139879170">Laman Utama</translation> -<translation id="93753284658583800">Halaman utama ditukar</translation> <translation id="938850635132480979">Ralat: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Masukkan frasa laluan</translation> <translation id="948039501338975565">Senarai folder penanda halaman</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 0743bac..80f7fda8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">စက်ပစ္စည်းများအားလုံးတွင် စင့်ခ်လုပ်ရန်နှင့် ပုဂ္ဂိုလ်ရေးသီးသန့် ပြင်ဆင်ရန် စင့်ခ်လုပ်ခြင်းကို ဖွင့်ပါ</translation> <translation id="1209206284964581585">ယခု ဖျောက်ထားပါ</translation> <translation id="1227058898775614466">လမ်းညွှန်မှု မှတ်တမ်း</translation> -<translation id="1229399675748764149">ဤစာမျက်နှာကို သင့်ပင်မစာမျက်နှာ ပြုလုပ်ခြင်း</translation> <translation id="1231733316453485619">စင့်ခ်လုပ်ခြင်းကို ဖွင့်မလား။</translation> <translation id="123724288017357924">လက်ရှိစာမျက်နှာကို ပြန်ဖွင့်ပြီး ကက်ရှ်ကို ပယ်ရန်</translation> <translation id="124678866338384709">လက်ရှိတဘ်ကို ပိတ်ရန်</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">စကားဝှက်ကို ဖျက်ရန်</translation> <translation id="1521774566618522728">ယနေ့ အသုံးပြုထားသည်</translation> <translation id="1538801903729528855">ဝဘ်တွင် ပိုမိုကောင်းမွန်သော အသံအသုံးပြုမှုဖြင့် ဆောင်ရွက်လိုက်ပါ</translation> -<translation id="1543538514740974167">ဤနေရာသို့ အမြန်ရောက်ရှိစေခြင်း</translation> <translation id="1544826120773021464">သင့် Google အကောင့်ကို စီမံခန့်ခွဲရန် "အကောင့် စီမံခန့်ခွဲရန်" ခလုတ်ကို တို့ပါ</translation> <translation id="1549000191223877751">အခြားဝင်းဒိုးသို့ ရွှေ့ပါ</translation> <translation id="1553358976309200471">Update Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">ဝဘ်ဆိုက်များ</translation> <translation id="4594952190837476234">ဤအော့ဖ်လိုင်း စာမျက်နှာသည် <ph name="CREATION_TIME" /> က ဖြစ်ပြီး အွန်လိုင်းဗားရှင်းနှင့် ကွဲပြားနိုင်ပါသည်။</translation> <translation id="4605958867780575332">ဖယ်ရှားလိုက်သည့် အကြောင်းအရာ − <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">စာမျက်နှာများကို နောင်အတွက်သိမ်းပြီး သတိပေးချက်ရယူပါ</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ကို ဖွင့်ပါ</translation> <translation id="4634124774493850572">စကားဝှက်ကို အသုံးပြုရန်</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{ကျိုးပေါက်ထားသည့် စကားဝှက် 1 ခု}other{ကျိုးပေါက်ထားသည့် စကားဝှက် # ခု}}</translation> @@ -876,7 +873,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ကို ပြန်ယူပြီးပြီ</translation> <translation id="7029809446516969842">စကားဝှက်များ</translation> <translation id="7030675613184250187">စာမျက်နှာများကို ပြန်ရှာရန် သို့မဟုတ် အော့ဖ်လိုင်းဖတ်ရန် သင့်ဖတ်ရန်စာရင်းတွင် သိမ်းနိုင်သည်</translation> -<translation id="703523980599857277">ပင်မစာမျက်နှာ ပြောင်းရန်</translation> <translation id="7054588988317389591">ပုံရှင်းလင်းချက်များ ရယူမလား။</translation> <translation id="7055152154916055070">တစ်ဆင့်ပြန်ညွှန်ခြင်းကို ပိတ်ထားသည်−</translation> <translation id="7063006564040364415">စင့်ခ်ဆာဗာသို့ ချိတ်ဆက်၍ မရပါ။</translation> @@ -887,7 +883,6 @@ <translation id="7088681679121566888">Chrome က အပ်ဒိတ်ဖြစ်နေပြီ</translation> <translation id="7106762743910369165">သင့်ဘရောင်ဇာကို သင့်အဖွဲ့အစည်းက စီမံခန့်ခွဲသည်</translation> <translation id="7121362699166175603">လိပ်စာဘားရှိ မှတ်တမ်းနှင့် အလိုအလျောက်ဖြည့်ပေးခြင်းများကို ဖျက်လိုက်ပါလိမ့်မည်။ သင့် Google အကောင့်က ဖွင့်ကြည့်ထားသောမှတ်တမ်းသည် <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> တွင် အခြားပုံစံများဖြင့် ရှိနေနိုင်ပါသည်။</translation> -<translation id="7128355412245153445">'ပင်မခလုတ်' တို့လိုက်တိုင်း သင်၏ ထိပ်တန်းဝဘ်ဆိုက်နှင့် လတ်တလော သတင်းဆောင်းပါးများကို ကြည့်နိုင်သည်</translation> <translation id="7138678301420049075">အခြား</translation> <translation id="7146622961999026732">ဤဝဘ်ဆိုက်နှင့် အက်ပ်များက သင့်အတွက် အရေးကြီးပုံရသည်-</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> မှ <ph name="BEGIN_LINK" />မူရင်းစာမျက်နှာကို ဖွင့်ပါ<ph name="END_LINK" /></translation> @@ -1077,7 +1072,6 @@ <translation id="8407396331882458341">၁။ <ph name="APP_NAME" /> ကို ရွေးပါ\n၂။ “အမြဲတန်း” ကို တို့ပါ</translation> <translation id="8410695015584479363">ဈေးနှုန်းများ ခြေရာခံရန်</translation> <translation id="8413126021676339697">မှတ်တမ်း အပြည့် ပြရန်</translation> -<translation id="8425213833346101688">ပြောင်းရန်</translation> <translation id="8427875596167638501">အစမ်းကြည့်ရှုမှုတဘ်ကို တစ်ဝက်ဖွင့်ထားသည်</translation> <translation id="8428213095426709021">ဆက်တင်များ</translation> <translation id="8438566539970814960">ရှာဖွေမှုနှင့် ဖွင့်ကြည့်မှု ပိုမိုကောင်းမွန်လာအောင် လုပ်ခြင်း</translation> @@ -1195,7 +1189,6 @@ <translation id="926205370408745186">'ဒစ်ဂျစ်တယ် အာရောဂျံ' မှနေ၍ သင်၏ Chrome လုပ်ဆောင်ချက်ကို ဖယ်ရှားခြင်း</translation> <translation id="927968626442779827">Google Chrome တွင် အပေါ့စားမုဒ် သုံးရန်</translation> <translation id="932327136139879170">ပင်မ</translation> -<translation id="93753284658583800">ပင်မစာမျက်နှာ ပြောင်းလိုက်သည်</translation> <translation id="938850635132480979">အမှား- <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">စကားစုဝှက်ကို ရိုက်ထည့်ရန်</translation> <translation id="948039501338975565">လိပ်စာဖိုင်တွဲများ စာရင်း</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index c3a1bec..c5d01a00 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">यन्त्रहरूभरि सिंक र वैयक्तीकृत गर्न सिंक गर्ने सुविधा सक्रिय गर्नुहोस्</translation> <translation id="1209206284964581585">अहिलेका लागि लुकाउनुहोस्</translation> <translation id="1227058898775614466">नेभिगेसनको इतिहास</translation> -<translation id="1229399675748764149">यो पृष्ठलाई आफ्नो गृहपृष्ठ बनाउनुहोस्</translation> <translation id="1231733316453485619">सिंक गर्ने सुविधा सक्रिय गर्ने हो?</translation> <translation id="123724288017357924">क्यास गरिएको सामग्रीको बेवास्ता गर्दै हालको पृष्ठलाई पुनःलोड गर्नुहोस्</translation> <translation id="124678866338384709">हालको ट्याब बन्द गर्नुहोस्</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">पासवर्ड मेट्नुहोस्</translation> <translation id="1521774566618522728">आज सक्रिय गरिएको समय</translation> <translation id="1538801903729528855">वेबमा भ्वाइस सर्च गर्दा अझ राम्रा सुविधाहरू प्राप्त गर्नुहोस्</translation> -<translation id="1543538514740974167">यो पृष्ठमा अझ छिटो पुग्नुहोस्</translation> <translation id="1544826120773021464">आफ्नो Google खाताको व्यवस्थापन गर्न "खाताको व्यवस्थापन गर्नुहोस्" नामक बटनमा क्लिक गर्नुहोस्</translation> <translation id="1549000191223877751">अर्को विन्डोमा सार्नुहोस्</translation> <translation id="1553358976309200471">Chrome अपडेट गर्नुहोस्</translation> @@ -497,7 +495,6 @@ <translation id="4587589328781138893">साइटहरू</translation> <translation id="4594952190837476234">यो पृष्ठ <ph name="CREATION_TIME" /> मा सिर्जना गरिएको हुँदा अनलाइन संस्करणभन्दा भिन्न हुन सक्छ।</translation> <translation id="4605958867780575332">हटाइएको वस्तु: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">यी पृष्ठहरू पछि पढ्ने प्रयोजनका लागि सुरक्षित गर्नुहोस् र रिमाइन्डर प्राप्त गर्नुहोस्</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> खोल्नुहोस्</translation> <translation id="4634124774493850572">पासवर्ड प्रयोग गर्नुहोस्</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{अरूले देखेको १ पासवर्ड फेला पर्यो}other{अरूले देखेका # वटा पासवर्ड फेला परे}}</translation> @@ -876,7 +873,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> रिस्टोर गरियो</translation> <translation id="7029809446516969842">पासवर्डहरू</translation> <translation id="7030675613184250187">तपाईं पृष्ठहरूलाई आफ्नो अध्ययन सूचीमा सुरक्षित गरी ती पृष्ठ पछि फेरि फेला पार्न वा इन्टरनेट नभएका बेलामा पढ्न सक्नुहुन्छ</translation> -<translation id="703523980599857277">गृहपृष्ठ परिवर्तन गर्नुहोस्</translation> <translation id="7054588988317389591">फोटोका विवरणहरू प्राप्त गर्न चाहनुहुन्छ?</translation> <translation id="7055152154916055070">रिडिरेक्ट नामक सुविधामाथि रोक लगाइयो:</translation> <translation id="7063006564040364415">समक्रमण सर्भरमा जडान गर्न सकेन।</translation> @@ -887,7 +883,6 @@ <translation id="7088681679121566888">Chrome अपडेट छ</translation> <translation id="7106762743910369165">तपाईंको संगठनले तपाईंको ब्राउजर व्यवस्थापन गर्छ</translation> <translation id="7121362699166175603">ठेगाना पट्टीका इतिहास र स्वतः पूर्णताहरूलाई खाली गर्छ। तपाईंको Google खाताको <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> मा अन्य किसिमका ब्राउजिङ इतिहास रहेका हुन सक्छन्।</translation> -<translation id="7128355412245153445">होम बटनमा ट्याप गर्ने बित्तिकै आफ्ना शीर्ष साइट तथा ताजा समाचार देखिने बनाउनुहोस्</translation> <translation id="7138678301420049075">अन्य</translation> <translation id="7146622961999026732">यी साइट र एपहरू तपाईंका लागि महत्त्वपूर्ण हुन सक्छन्:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> को <ph name="BEGIN_LINK" />मूल पृष्ठ लोड गर्नुहोस्<ph name="END_LINK" /></translation> @@ -1077,7 +1072,6 @@ <translation id="8407396331882458341">१. <ph name="APP_NAME" /> छनौट गर्नुहोस्\n2. “सधैँ” मा ट्याप गर्नुहोस्</translation> <translation id="8410695015584479363">मूल्यहरू ट्र्याक गर्नुहोस्</translation> <translation id="8413126021676339697">पूर्ण इतिहास देखाउनुहोस्</translation> -<translation id="8425213833346101688">परिवर्तन गर्नुहोस्</translation> <translation id="8427875596167638501">पूर्वावलोकन ट्याब आधा खुला छ</translation> <translation id="8428213095426709021">सेटिङहरू</translation> <translation id="8438566539970814960">खोज तथा ब्राउजिङलाई अझ राम्रो बनाउनुहोस्</translation> @@ -1195,7 +1189,6 @@ <translation id="926205370408745186">आफूले Chrome मा गरेका क्रियाकलाप डिजिटल वेलबिइङबाट हटाउनुहोस्</translation> <translation id="927968626442779827">Google Chrome को लाइट मोड प्रयोग गर्नुहोस्</translation> <translation id="932327136139879170">गृहपृष्ठ</translation> -<translation id="93753284658583800">गृहपृष्ठ परिवर्तन गरियो</translation> <translation id="938850635132480979">त्रुटि: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">पासफ्रेज प्रविष्टि गर्नुहोस्</translation> <translation id="948039501338975565">पुस्तक चिन्ह लगाइएका फोल्डरहरूको सूची</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 70aa583..7eaff4c57 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Schakel synchronisatie in om verschillende apparaten te synchroniseren en te personaliseren</translation> <translation id="1209206284964581585">Voorlopig verbergen</translation> <translation id="1227058898775614466">Navigatiegeschiedenis</translation> -<translation id="1229399675748764149">Deze pagina instellen als je homepage</translation> <translation id="1231733316453485619">Synchronisatie inschakelen?</translation> <translation id="123724288017357924">De pagina opnieuw laden, gecachte content negeren</translation> <translation id="124678866338384709">Huidig tabblad sluiten</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Wachtwoord verwijderen</translation> <translation id="1521774566618522728">Vandaag actief</translation> <translation id="1538801903729528855">Betere spraakfunctionaliteit op internet</translation> -<translation id="1543538514740974167">Sneller terugkeren</translation> <translation id="1544826120773021464">Tik op de knop 'Account beheren' om je Google-account te beheren</translation> <translation id="1549000191223877751">Naar ander venster</translation> <translation id="1553358976309200471">Chrome updaten</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">Deze offline pagina is van <ph name="CREATION_TIME" /> en kan afwijken van de online versie.</translation> <translation id="4605958867780575332">Item verwijderd: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Pagina's opslaan voor later en een herinnering krijgen</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> openen</translation> <translation id="4634124774493850572">Wachtwoord gebruiken</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 gehackt wachtwoord}other{# gehackte wachtwoorden}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> is hersteld</translation> <translation id="7029809446516969842">Wachtwoorden</translation> <translation id="7030675613184250187">Je kunt pagina's opslaan in je leeslijst zodat je ze later kunt terugvinden of offline kunt lezen</translation> -<translation id="703523980599857277">Homepage wijzigen</translation> <translation id="7054588988317389591">Afbeeldingsbeschrijvingen ophalen?</translation> <translation id="7055152154916055070">Omleiding geblokkeerd:</translation> <translation id="7063006564040364415">Kan geen verbinding maken met synchronisatieserver.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome is up-to-date</translation> <translation id="7106762743910369165">Je browser wordt beheerd door je organisatie</translation> <translation id="7121362699166175603">Hiermee worden de geschiedenis en automatische aanvullingen voor de adresbalk gewist. Er kunnen andere vormen van browsegeschiedenis zijn opgeslagen voor je Google-account op <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Zie je topsites en recente artikelen als je op de startknop tikt</translation> <translation id="7138678301420049075">Overige</translation> <translation id="7146622961999026732">Zo te zien zijn deze sites en apps belangrijk voor jou:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Oorspronkelijke pagina laden <ph name="END_LINK" /> van <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Kies <ph name="APP_NAME" />.\n2. Tik op Altijd.</translation> <translation id="8410695015584479363">Prijzen volgen</translation> <translation id="8413126021676339697">Hele geschiedenis bekijken</translation> -<translation id="8425213833346101688">Wijzigen</translation> <translation id="8427875596167638501">Voorbeeldtabblad is half geopend</translation> <translation id="8428213095426709021">Instellingen</translation> <translation id="8438566539970814960">Zoekopdrachten en browsefunctionaliteit verbeteren</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Je Chrome-activiteit verwijderen uit Digitaal welzijn</translation> <translation id="927968626442779827">Lite-versie van Google Chrome gebruiken</translation> <translation id="932327136139879170">Homepage</translation> -<translation id="93753284658583800">Homepage gewijzigd</translation> <translation id="938850635132480979">Fout: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Wachtwoordzin opgeven</translation> <translation id="948039501338975565">Lijst met bookmarkmappen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 328e47e06..42ee5b6a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">For å synkronisere og gi et personlig preg på alle enhetene, slå på synkronisering</translation> <translation id="1209206284964581585">Skjul for øyeblikket</translation> <translation id="1227058898775614466">Navigeringslogg</translation> -<translation id="1229399675748764149">Angi denne siden som startside</translation> <translation id="1231733316453485619">Vil du slå på synkronisering?</translation> <translation id="123724288017357924">Last inn siden på nytt, men ignorer bufret innhold</translation> <translation id="124678866338384709">Lukk den aktive fanen</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Slett passordet</translation> <translation id="1521774566618522728">Aktiv i dag</translation> <translation id="1538801903729528855">Bruk stemmen til å oppleve nettet på en ny måte</translation> -<translation id="1543538514740974167">Kom hit raskere</translation> <translation id="1544826120773021464">For å administrere Google-kontoen din, trykk på «Administrer kontoen»-knappen</translation> <translation id="1549000191223877751">Flytt til det andre vinduet</translation> <translation id="1553358976309200471">Oppdater Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Nettsteder</translation> <translation id="4594952190837476234">Denne siden uten nett er fra <ph name="CREATION_TIME" /> og kan avvike fra nettversjonen.</translation> <translation id="4605958867780575332">Elementet er fjernet: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Lagre sider til senere, og få en påminnelse</translation> <translation id="4616150815774728855">Åpne <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Bruk passord</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 passord er utsatt for sikkerhetsbrudd}other{# passord er utsatt for sikkerhetsbrudd}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Gjenopprettet <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Passord</translation> <translation id="7030675613184250187">Du kan lagre sider i leselisten for å finne dem igjen senere eller lese dem uten nett</translation> -<translation id="703523980599857277">Endre startsiden</translation> <translation id="7054588988317389591">Vil du ha bildebeskrivelser?</translation> <translation id="7055152154916055070">Viderekoblingen er blokkert:</translation> <translation id="7063006564040364415">Kunne ikke koble til synkroniseringstjeneren.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome er oppdatert</translation> <translation id="7106762743910369165">Nettleseren administreres av organisasjonen din</translation> <translation id="7121362699166175603">Tømmer loggen og fjerner autofullføringer i adressefeltet. Det kan hende Google-kontoen din har andre typer nettleserlogger på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Se toppnettsteder og de siste nyhetssakene når du trykker på Hjem-knappen</translation> <translation id="7138678301420049075">Annet</translation> <translation id="7146622961999026732">Disse nettstedene og appene ser ut til å være viktige for deg:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Last inn original side<ph name="END_LINK" /> fra <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Velg <ph name="APP_NAME" />\n2. Trykk på «Alltid»</translation> <translation id="8410695015584479363">Spor priser</translation> <translation id="8413126021676339697">Vis fullstendig logg</translation> -<translation id="8425213833346101688">Endre</translation> <translation id="8427875596167638501">Fanen for forhåndsvisning er halvveis åpnet</translation> <translation id="8428213095426709021">Innstillinger</translation> <translation id="8438566539970814960">Gjør søking og surfing bedre</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Fjerne Chrome-aktiviteten din fra Digital balanse</translation> <translation id="927968626442779827">Bruk forenklet modus i Google Chrome</translation> <translation id="932327136139879170">Gå til startsiden</translation> -<translation id="93753284658583800">Startsiden er endret</translation> <translation id="938850635132480979">Feil: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Angi en passordfrase</translation> <translation id="948039501338975565">Liste over bokmerkemapper</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 6f6726e8a..fff69c7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">ସମସ୍ତ ଡିଭାଇସ୍ଗୁଡ଼ିକରେ ସିଙ୍କ୍ ଏବଂ ବ୍ୟକ୍ତିଗତକୃତ କରିବାକୁ, ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ</translation> <translation id="1209206284964581585">ବର୍ତ୍ତମାନ ପାଇଁ ଲୁଚାନ୍ତୁ</translation> <translation id="1227058898775614466">ନାଭିଗେସନ୍ ଇତିହାସ</translation> -<translation id="1229399675748764149">ଏହି ପୃଷ୍ଠାକୁ ଆପଣଙ୍କ ମୂଳପୃଷ୍ଠା କରନ୍ତୁ</translation> <translation id="1231733316453485619">ସିଙ୍କ୍ ଚାଲୁ କରିବେ?</translation> <translation id="123724288017357924">କ୍ୟାଶ୍ ବିଷୟବସ୍ତୁ ଏଡ଼ାଇ ବର୍ତ୍ତମାନ ପୃଷ୍ଠା ପୁନଃଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="124678866338384709">ସାମ୍ପ୍ରତିକ ଟାବ୍ ବନ୍ଦ କରନ୍ତୁ</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">ପାସ୍ୱାର୍ଡକୁ ଡିଲିଟ୍ କରନ୍ତୁ</translation> <translation id="1521774566618522728">ଆଜି ସକ୍ରିୟ ଅଛି</translation> <translation id="1538801903729528855">ୱେବରେ ଏକ ଉନ୍ନତ ଭଏସ୍ ଅନୁଭୂତି ପାଆନ୍ତୁ</translation> -<translation id="1543538514740974167">ଏଠାରେ ଶୀଘ୍ର ପହଞ୍ଚନ୍ତୁ</translation> <translation id="1544826120773021464">ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟ ପରିଚାଳନା କରିବାକୁ, "ଆକାଉଣ୍ଟ ପରିଚାଳନା କରନ୍ତୁ" ବଟନ୍ରେ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="1549000191223877751">ଅନ୍ୟ ୱିଣ୍ଡୋକୁ ଯାଆନ୍ତୁ</translation> <translation id="1553358976309200471">Chrome ଅପ୍ଡେଟ୍</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">ଏହି ପୃଷ୍ଠା <ph name="CREATION_TIME" />ର ଅଟେ ଏବଂ ଅନ୍ଲାଇନ୍ ସଂସ୍କରଣ ଠାରୁ ଅଲଗା ହୋଇପାରେ।</translation> <translation id="4605958867780575332">କଢ଼ାଯାଇଥିବା ଆଇଟମ୍: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ପୃଷ୍ଠାଗୁଡ଼ିକୁ ପରବର୍ତ୍ତୀ ସମୟ ପାଇଁ ସେଭ୍ କରନ୍ତୁ ଏବଂ ଏକ ରିମାଇଣ୍ଡର୍ ପାଆନ୍ତୁ</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ଖୋଲନ୍ତୁ</translation> <translation id="4634124774493850572">ପାସ୍ୱର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1ଟି ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ}other{#ଟି ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ରିଷ୍ଟୋର୍ କରାଯାଇଛି</translation> <translation id="7029809446516969842">ପାସୱାର୍ଡଗୁଡିକ</translation> <translation id="7030675613184250187">ଆପଣ ଆପଣଙ୍କ ପଢ଼ିବା ତାଲିକାରେ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ସେଭ୍ କରିପାରିବେ ଯାହା ଫଳରେ ଆପଣ ପୁଣି ସେଗୁଡ଼ିକୁ ପାଇପାରିବେ ବା ଅଫଲାଇନରେ ପଢ଼ିପାରିବେ</translation> -<translation id="703523980599857277">ମୂଳପୃଷ୍ଠା ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> <translation id="7054588988317389591">ଛବିର ବର୍ଣ୍ଣନା ପାଇବାକୁ ଚାହାଁନ୍ତି କି?</translation> <translation id="7055152154916055070">ରିଡାଇରେକ୍ଟକୁ ଅବରୋଧ କରାଯାଇଛି:</translation> <translation id="7063006564040364415">ସିଙ୍କ ସର୍ଭର ସହ ସଂଯୋଗ କରାଯାଇପାରିଲା ନାହିଁ।</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome ଅପ୍ ଟୁ ଡେଟ୍ ଅଛି</translation> <translation id="7106762743910369165">ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ଆପଣଙ୍କର ବ୍ରାଉଜର୍ ପରିଚାଳିତ ହୋଇଥାଏ</translation> <translation id="7121362699166175603">ଠିକଣା ବାର୍ରେ ଥିବା ଇତିବୃତ୍ତି ଓ ସ୍ୱତଃପୂରଣଗୁଡ଼ିକୁ ଖାଲି କରେ। ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟର ବାଉଜିଂ ଇତିବୃତ୍ତି <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />ରେ ଅନ୍ୟ ଫର୍ମରେ ଥାଇପାରେ।</translation> -<translation id="7128355412245153445">ଯେତେବେଳେ ବି ଆପଣ ହୋମ୍ ବଟନ୍ ଟାପ୍ କରନ୍ତି, ଆପଣଙ୍କ ଶ୍ରେଷ୍ଠ ସାଇଟ୍ ଏବଂ ବର୍ତ୍ତମାନର କାହାଣୀଗୁଡ଼ିକ ଦେଖନ୍ତି</translation> <translation id="7138678301420049075">ଅନ୍ୟ</translation> <translation id="7146622961999026732">ଏହି ସାଇଟ୍ ଏବଂ ଆପଗୁଡ଼ିକ ଆପଣଙ୍କ ପାଇଁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ପରି ଜଣାପଡ଼ୁଛି:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" />ରୁ <ph name="BEGIN_LINK" />ମୂଳ ପୃଷ୍ଠା ଲୋଡ୍ କରନ୍ତୁ<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> ବାଛନ୍ତୁ\n2. “ସର୍ବଦା”ରେ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="8410695015584479363">ମୂଲ୍ୟଗୁଡ଼ିକୁ ଟ୍ରାକ୍ କରନ୍ତୁ</translation> <translation id="8413126021676339697">ସମ୍ପୂର୍ଣ୍ଣ ଇତିବୃତ୍ତି ଦେଖାନ୍ତୁ</translation> -<translation id="8425213833346101688">ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> <translation id="8427875596167638501">ପ୍ରିଭ୍ୟୁ ଟାବ୍ ଅଧା ଖୋଲା ଅଛି</translation> <translation id="8428213095426709021">ସେଟିଂସ୍</translation> <translation id="8438566539970814960">ସନ୍ଧାନ ଓ ବ୍ରାଉଜିଂକୁ ଉନ୍ନତ କରନ୍ତୁ</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ଡିଜିଟାଲ୍ ୱେଲ୍ବିଂରୁ ଆପଣଙ୍କର Chrome କାର୍ଯ୍ୟକଳାପଗୁଡ଼ିକୁ କାଢ଼ନ୍ତୁ</translation> <translation id="927968626442779827">Google Chromeରେ ଲାଇଟ୍ ମୋଡ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="932327136139879170">Home</translation> -<translation id="93753284658583800">ମୂଳପୃଷ୍ଠା ପରିବର୍ତ୍ତନ କରାଯାଇଛି</translation> <translation id="938850635132480979">ତ୍ରୁଟି: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ପାସ୍-ଫ୍ରେଜ୍ ଲେଖନ୍ତୁ</translation> <translation id="948039501338975565">ବୁକମାର୍କ ଫୋଲ୍ଡରଗୁଡ଼ିକର ତାଲିକା</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 99d7f23..94bdcc3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">ਡੀਵਾਈਸਾਂ ਵਿਚਾਲੇ ਸਮਕਾਲੀਕਰਨ ਕਰਨ ਅਤੇ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ, ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ</translation> <translation id="1209206284964581585">ਫਿਲਹਾਲ ਲੁਕਾਓ</translation> <translation id="1227058898775614466">ਨੈਵੀਗੇਸ਼ਨ ਇਤਿਹਾਸ</translation> -<translation id="1229399675748764149">ਇਸ ਪੰਨੇ ਨੂੰ ਆਪਣਾ ਹੋਮਪੇਜ ਬਣਾਓ</translation> <translation id="1231733316453485619">ਕੀ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> <translation id="123724288017357924">ਕੈਸ਼ੇ ਕੀਤੀ ਸਮੱਗਰੀ ਨੂੰ ਅਣਡਿੱਠ ਕਰਕੇ ਮੌਜੂਦਾ ਪੰਨਾ ਰੀਲੋਡ ਕਰੋ</translation> <translation id="124678866338384709">ਮੌਜੂਦਾ ਟੈਬ ਬੰਦ ਕਰੋ</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">ਪਾਸਵਰਡ ਮਿਟਾਓ</translation> <translation id="1521774566618522728">ਅੱਜ ਕਿਰਿਆਸ਼ੀਲ</translation> <translation id="1538801903729528855">ਵੈੱਬ 'ਤੇ ਬਿਹਤਰ ਅਵਾਜ਼ੀ ਅਨੁਭਵ ਪ੍ਰਾਪਤ ਕਰੋ</translation> -<translation id="1543538514740974167">ਤੇਜ਼ੀ ਨਾਲ ਇੱਥੇ ਪਹੁੰਚੋ</translation> <translation id="1544826120773021464">ਆਪਣੇ Google ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ, "ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ" ਬਟਨ 'ਤੇ ਟੈਪ ਕਰੋ</translation> <translation id="1549000191223877751">ਹੋਰ ਵਿੰਡੋ 'ਤੇ ਤਬਦੀਲ ਕਰੋ</translation> <translation id="1553358976309200471">Chrome ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">ਸਾਈਟਾਂ</translation> <translation id="4594952190837476234">ਇਹ ਆਫ਼ਲਾਈਨ ਪੰਨਾ <ph name="CREATION_TIME" /> ਦਾ ਹੈ ਅਤੇ ਆਨਲਾਈਨ ਵਰਜਨ ਤੋਂ ਵੱਖਰਾ ਹੋ ਸਕਦਾ ਹੈ।</translation> <translation id="4605958867780575332">ਆਈਟਮਾਂ ਹਟਾਈਆਂ ਗਈਆਂ: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">ਪੰਨਿਆਂ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਪੜ੍ਹਣ ਲਈ ਰੱਖਿਅਤ ਕਰੋ ਅਤੇ ਇਸ ਲਈ ਇੱਕ ਰਿਮਾਈਂਡਰ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> ਖੋਲ੍ਹੋ</translation> <translation id="4634124774493850572">ਪਾਸਵਰਡ ਵਰਤੋ</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ਪਾਸਵਰਡ ਨਾਲ ਛੇੜਛਾੜ ਹੋਈ}one{# ਪਾਸਵਰਡ ਨਾਲ ਛੇੜਛਾੜ ਹੋਈ}other{# ਪਾਸਵਰਡਾਂ ਨਾਲ ਛੇੜਛਾੜ ਹੋਈ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਗਿਆ</translation> <translation id="7029809446516969842">ਪਾਸਵਰਡ</translation> <translation id="7030675613184250187">ਪੰਨਿਆਂ ਨੂੰ ਦੁਬਾਰਾ ਲੱਭਣ ਜਾਂ ਆਫ਼ਲਾਈਨ ਪੜ੍ਹਨ ਲਈ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਆਪਣੀ ਪੜ੍ਹਨ-ਸੂਚੀ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ</translation> -<translation id="703523980599857277">ਹੋਮਪੇਜ ਬਦਲੋ</translation> <translation id="7054588988317389591">ਕੀ ਚਿੱਤਰ ਵਰਣਨ ਪ੍ਰਾਪਤ ਕਰਨੇ ਹਨ?</translation> <translation id="7055152154916055070">ਇਸ ਰੀਡਾਇਰੈਕਟ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ:</translation> <translation id="7063006564040364415">ਸਿੰਕ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਿਆ।</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome ਅੱਪ-ਟੂ-ਡੇਟ ਹੈ</translation> <translation id="7106762743910369165">ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="7121362699166175603">ਪਤਾ ਬਾਰ ਵਿੱਚ ਇਤਿਹਾਸ ਅਤੇ ਸਵੈ-ਮੁਕੰਮਲ ਚੀਜ਼ਾਂ ਨੂੰ ਕਲੀਅਰ ਕਰੋ। ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 'ਤੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੀਆਂ ਹੋਰ ਕਿਸਮਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ।</translation> -<translation id="7128355412245153445">ਹੋਮ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ 'ਤੇ ਆਪਣੀਆਂ ਪ੍ਰਮੁੱਖ ਸਾਈਟਾਂ ਅਤੇ ਹਾਲੀਆ ਕਹਾਣੀਆਂ ਦੇਖੋ</translation> <translation id="7138678301420049075">ਹੋਰ</translation> <translation id="7146622961999026732">ਇਹ ਸਾਈਟਾਂ ਅਤੇ ਐਪਾਂ ਤੁਹਾਡੇ ਲਈ ਮਹੱਤਵਪੂਰਨ ਲੱਗ ਰਹੀਆਂ ਹਨ:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> ਤੋਂ <ph name="BEGIN_LINK" />ਮੂਲ ਪੰਨਾ ਲੋਡ ਕਰੋ<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> ਚੁਣੋ\n2. “ਹਮੇਸ਼ਾਂ” 'ਤੇ ਟੈਪ ਕਰੋ</translation> <translation id="8410695015584479363">ਕੀਮਤਾਂ 'ਤੇ ਨਜ਼ਰ ਰੱਖੋ</translation> <translation id="8413126021676339697">ਪੂਰਾ ਇਤਿਹਾਸ ਦਿਖਾਓ</translation> -<translation id="8425213833346101688">ਬਦਲੋ</translation> <translation id="8427875596167638501">ਪੂਰਵ-ਝਲਕ ਟੈਬ ਅੱਧੀ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ</translation> <translation id="8428213095426709021">ਸੈਟਿੰਗਾਂ</translation> <translation id="8438566539970814960">ਖੋਜਾਂ ਅਤੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਬਿਹਤਰ ਬਣਾਓ</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ਡਿਜੀਟਲ ਜੀਵਨਸ਼ੈਲੀ ਤੋਂ ਆਪਣੀ Chrome ਸਰਗਰਮੀ ਹਟਾਓ</translation> <translation id="927968626442779827">Google Chrome 'ਤੇ ਲਾਈਟ ਮੋਡ ਵਰਤੋ</translation> <translation id="932327136139879170">ਹੋਮ</translation> -<translation id="93753284658583800">ਹੋਮਪੇਜ ਬਦਲ ਦਿੱਤਾ ਗਿਆ</translation> <translation id="938850635132480979">ਗੜਬੜ: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ਪਾਸਫਰੇਜ਼ ਦਾਖਲ ਕਰੋ</translation> <translation id="948039501338975565">ਬੁੱਕਮਾਰਕ ਫੋਲਡਰਾਂ ਦੀ ਸੂਚੀ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index a26698b..951fb4d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Aby synchronizować i personalizować wszystkie swoje urządzenia, włącz synchronizację</translation> <translation id="1209206284964581585">Na razie ukryj</translation> <translation id="1227058898775614466">Historia nawigacji</translation> -<translation id="1229399675748764149">Ustaw tę stronę jako stronę główną</translation> <translation id="1231733316453485619">Włączyć synchronizację?</translation> <translation id="123724288017357924">Ponowie załaduj stronę, bez pamięci podręcznej</translation> <translation id="124678866338384709">Zamknij bieżącą kartę</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Usuń hasło</translation> <translation id="1521774566618522728">Aktywność: dzisiaj</translation> <translation id="1538801903729528855">Korzystaj z dodatkowych możliwości funkcji głosowych w internecie</translation> -<translation id="1543538514740974167">Szybciej do celu</translation> <translation id="1544826120773021464">Aby zarządzać kontem Google, kliknij przycisk „Zarządzaj kontem”</translation> <translation id="1549000191223877751">Przenieś do innego okna</translation> <translation id="1553358976309200471">Zaktualizuj Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Witryny</translation> <translation id="4594952190837476234">Ta strona offline jest z <ph name="CREATION_TIME" /> i może różnić się od wersji online.</translation> <translation id="4605958867780575332">Usunięto element: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Zapisz strony na później i ustaw przypomnienie</translation> <translation id="4616150815774728855">Otwórz <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Użyj hasła</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 przejęte hasło}few{# przejęte hasła}many{# przejętych haseł}other{# przejętego hasła}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Przywrócono: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Hasła</translation> <translation id="7030675613184250187">Na liście Do przeczytania możesz zapisywać strony, które chcesz przeczytać ponownie lub do których chcesz mieć dostęp offline</translation> -<translation id="703523980599857277">Zmień stronę główną</translation> <translation id="7054588988317389591">Czy chcesz pobierać opisy obrazów?</translation> <translation id="7055152154916055070">Zablokowano przekierowanie:</translation> <translation id="7063006564040364415">Nie udało się nawiązać połączenia z serwerem synchronizacji.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Masz aktualną wersję Chrome</translation> <translation id="7106762743910369165">Przeglądarka jest zarządzana przez Twoją organizację</translation> <translation id="7121362699166175603">Usuwa historię i pamięć autouzupełniania na pasku adresu. Inne rodzaje historii przeglądania mogą być nadal dostępne na Twoim koncie Google na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Zobacz najczęściej odwiedzane strony i ostatnie artykuły po naciśnięciu przycisku strony głównej</translation> <translation id="7138678301420049075">Inne</translation> <translation id="7146622961999026732">Wygląda na to, że te strony i aplikacje są dla Ciebie ważne:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Załaduj oryginalną stronę<ph name="END_LINK" /> z domeny <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Wybierz aplikację <ph name="APP_NAME" />\n2. Kliknij „Zawsze”</translation> <translation id="8410695015584479363">Monitoruj ceny</translation> <translation id="8413126021676339697">Wyświetl całą historię</translation> -<translation id="8425213833346101688">Zmień</translation> <translation id="8427875596167638501">Karta podglądu jest otwarta w połowie</translation> <translation id="8428213095426709021">Ustawienia</translation> <translation id="8438566539970814960">Ulepsz wyszukiwanie i przeglądanie</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Usuwa Twoją aktywność w Chrome z Cyfrowej równowagi</translation> <translation id="927968626442779827">Użyj wersji uproszczonej w Google Chrome</translation> <translation id="932327136139879170">Strona główna</translation> -<translation id="93753284658583800">Strona główna została zmieniona</translation> <translation id="938850635132480979">Błąd: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Wpisz hasło</translation> <translation id="948039501338975565">Lista folderów zakładek</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 1e775661..c9b86b0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Para sincronizar e personalizar vários dispositivos, ative a sincronização</translation> <translation id="1209206284964581585">Ocultar por enquanto</translation> <translation id="1227058898775614466">Histórico de navegação</translation> -<translation id="1229399675748764149">Torne esta a sua página inicial</translation> <translation id="1231733316453485619">Ativar sincronização?</translation> <translation id="123724288017357924">Atualizar página atual e ignorar conteúdo em cache</translation> <translation id="124678866338384709">Fechar a guia atual</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Excluir senha</translation> <translation id="1521774566618522728">Ativado hoje</translation> <translation id="1538801903729528855">Tenha uma experiência de voz melhor na Web</translation> -<translation id="1543538514740974167">Acessar esta página mais rapidamente</translation> <translation id="1544826120773021464">Para gerenciar sua Conta do Google, toque no botão "Gerenciar conta".</translation> <translation id="1549000191223877751">Mover para outra janela</translation> <translation id="1553358976309200471">Atualizar o Google Chrome</translation> @@ -499,7 +497,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">Esta página off-line é de <ph name="CREATION_TIME" /> e pode ser diferente da versão on-line.</translation> <translation id="4605958867780575332">Item removido: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Salve páginas e receba uma notificação mais tarde</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Usar senha</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 senha comprometida}one{# senha comprometida}other{# senhas comprometidas}}</translation> @@ -878,7 +875,6 @@ <translation id="7027549951530753705">Download de <ph name="ITEM_TITLE" /> restaurado</translation> <translation id="7029809446516969842">Senhas</translation> <translation id="7030675613184250187">É possível salvar páginas na sua lista de leituras para encontrá-las novamente com facilidade ou ler off-line</translation> -<translation id="703523980599857277">Mudar página inicial</translation> <translation id="7054588988317389591">Ver descrições de imagens?</translation> <translation id="7055152154916055070">Redirecionamento bloqueado:</translation> <translation id="7063006564040364415">Não foi possível conectar ao servidor de sincronização.</translation> @@ -889,7 +885,6 @@ <translation id="7088681679121566888">O Chrome está atualizado</translation> <translation id="7106762743910369165">O navegador é gerenciado pela sua organização</translation> <translation id="7121362699166175603">Limpa o histórico e os preenchimentos automáticos na barra de endereço. Sua Conta do Google pode ter outras formas de histórico de navegação em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Veja os principais sites e as matérias recentes sempre que tocar no botão home</translation> <translation id="7138678301420049075">Outro</translation> <translation id="7146622961999026732">Estes sites e apps parecem importantes para você:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Carregar página original<ph name="END_LINK" /> de <ph name="DOMAIN_NAME" /></translation> @@ -1079,7 +1074,6 @@ <translation id="8407396331882458341">1. Selecione o app <ph name="APP_NAME" />.\n2. Toque em "Sempre".</translation> <translation id="8410695015584479363">Monitorar preços</translation> <translation id="8413126021676339697">Mostrar histórico completo</translation> -<translation id="8425213833346101688">Alterar</translation> <translation id="8427875596167638501">A guia "Visualizar" está parcialmente aberta</translation> <translation id="8428213095426709021">Configurações</translation> <translation id="8438566539970814960">Melhorar as pesquisas e a navegação</translation> @@ -1197,7 +1191,6 @@ <translation id="926205370408745186">Remover sua atividade do Chorme do Bem-estar digital</translation> <translation id="927968626442779827">Use o Modo Lite no Google Chrome</translation> <translation id="932327136139879170">Início</translation> -<translation id="93753284658583800">Página inicial modificada</translation> <translation id="938850635132480979">Erro: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Inserir senha</translation> <translation id="948039501338975565">Lista de pastas de favoritos</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 9b4a829..d962e48 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Para sincronizar e personalizar entre dispositivos, ative a sincronização.</translation> <translation id="1209206284964581585">Ocultar para já</translation> <translation id="1227058898775614466">Histórico de navegação</translation> -<translation id="1229399675748764149">Tornar esta página a sua página inicial</translation> <translation id="1231733316453485619">Pretende ativar a sincronização?</translation> <translation id="123724288017357924">Atualizar página atual e ignorar conteúdo em cache</translation> <translation id="124678866338384709">Fechar o separador atual</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Eliminar palavra-passe</translation> <translation id="1521774566618522728">Ativo hoje</translation> <translation id="1538801903729528855">Obtenha uma melhor experiência de voz na Web</translation> -<translation id="1543538514740974167">Aceda aqui mais rapidamente</translation> <translation id="1544826120773021464">Para gerir a sua Conta Google, toque no botão "Gerir conta".</translation> <translation id="1549000191223877751">Mover para outra janela</translation> <translation id="1553358976309200471">Atualizar o Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">Esta página foi criada a <ph name="CREATION_TIME" /> e pode ser diferente da versão online.</translation> <translation id="4605958867780575332">Item removido: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Guarde páginas para mais tarde e receba um lembrete</translation> <translation id="4616150815774728855">Abrir <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Utilizar palavra-passe</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 palavra-passe comprometida.}other{# palavras-passe comprometidas.}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> restaurado</translation> <translation id="7029809446516969842">Palavras-passe</translation> <translation id="7030675613184250187">Pode guardar páginas na sua lista de leitura para as encontrar novamente ou para as ler offline.</translation> -<translation id="703523980599857277">Alterar página inicial</translation> <translation id="7054588988317389591">Pretende obter descrições de imagens?</translation> <translation id="7055152154916055070">Redirecionamento bloqueado:</translation> <translation id="7063006564040364415">Não foi possível estabelecer ligação ao servidor de sincronização.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">O Chrome está atualizado.</translation> <translation id="7106762743910369165">O seu navegador é gerido pela sua entidade</translation> <translation id="7121362699166175603">Limpa o histórico e os preenchimentos automáticos na barra de endereço. A sua Conta Google pode ter outras formas do histórico de navegação em <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Veja os seus sites principais e notícias recentes sempre que tocar no botão página inicial.</translation> <translation id="7138678301420049075">Outros</translation> <translation id="7146622961999026732">Estes sites e apps parecem ser importantes para si:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Carregar página original<ph name="END_LINK" /> do domínio <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Escolha o <ph name="APP_NAME" />.\n2. Toque em "Sempre".</translation> <translation id="8410695015584479363">Monitorizar preços</translation> <translation id="8413126021676339697">Mostrar histórico completo</translation> -<translation id="8425213833346101688">Alterar</translation> <translation id="8427875596167638501">O separador Pré-visualização está aberto até meio.</translation> <translation id="8428213095426709021">Definições</translation> <translation id="8438566539970814960">Melhorar as pesquisas e a navegação</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Remova a atividade do Chrome do Bem-estar digital</translation> <translation id="927968626442779827">Utilize o Modo Lite no Google Chrome.</translation> <translation id="932327136139879170">Página inicial</translation> -<translation id="93753284658583800">Página inicial alterada.</translation> <translation id="938850635132480979">Erro: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introduzir frase de acesso</translation> <translation id="948039501338975565">Lista de pastas de marcadores</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index cd03d64..27d2301c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Pentru a sincroniza și a personaliza pe toate dispozitivele, activează sincronizarea</translation> <translation id="1209206284964581585">Ascunde momentan</translation> <translation id="1227058898775614466">Istoric de navigare</translation> -<translation id="1229399675748764149">Setează pagina ca pagină de pornire</translation> <translation id="1231733316453485619">Activezi sincronizarea?</translation> <translation id="123724288017357924">Reîncarcă pagina, ignorând conținutul din cache</translation> <translation id="124678866338384709">Închide fila actuală</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Șterge parola</translation> <translation id="1521774566618522728">Activ astăzi</translation> <translation id="1538801903729528855">Bucură-te de o experiență vocală mai bună pe web</translation> -<translation id="1543538514740974167">Accesează mai rapid</translation> <translation id="1544826120773021464">Pentru a gestiona contul Google, atinge butonul „Gestionează contul”</translation> <translation id="1549000191223877751">Mută în altă fereastră</translation> <translation id="1553358976309200471">Actualizează Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Site-uri</translation> <translation id="4594952190837476234">Această pagină offline este din data de <ph name="CREATION_TIME" /> și poate fi diferită de versiunea online.</translation> <translation id="4605958867780575332">Element eliminat: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Salvează paginile pentru mai târziu și primește un memento</translation> <translation id="4616150815774728855">Deschide <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Folosește parola</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{O parolă compromisă}few{# parole compromise}other{# de parole compromise}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">S-a restabilit <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Parole</translation> <translation id="7030675613184250187">Poți să salvezi pagini în lista de lectură ca să le regăsești sau să le citești offline</translation> -<translation id="703523980599857277">Modifică pagina de pornire</translation> <translation id="7054588988317389591">Vrei să generezi descrieri ale imaginilor?</translation> <translation id="7055152154916055070">Redirecționarea a fost blocată:</translation> <translation id="7063006564040364415">Nu s-a putut stabili conexiunea cu serverul de sincronizare.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome este actualizat</translation> <translation id="7106762743910369165">Browserul este gestionat de organizația ta</translation> <translation id="7121362699166175603">Șterge istoricul și completările automate din bara de adrese. Contul Google poate să ofere alte forme ale istoricului de navigare la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Vezi principalele site-uri și subiectele recente când atingi butonul ecran de pornire</translation> <translation id="7138678301420049075">Altele</translation> <translation id="7146622961999026732">Următoarele site-uri și aplicații par importante pentru tine:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Încarcă pagina originală<ph name="END_LINK" /> de la <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Alege <ph name="APP_NAME" />.\n2. Atinge „Întotdeauna”.</translation> <translation id="8410695015584479363">Urmărește prețurile</translation> <translation id="8413126021676339697">Afișează întregul istoric</translation> -<translation id="8425213833346101688">Modificați</translation> <translation id="8427875596167638501">Fila de previzualizare este pe jumătate deschisă</translation> <translation id="8428213095426709021">Setări</translation> <translation id="8438566539970814960">Îmbunătățește căutările și navigarea</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Elimină activitatea în Chrome din Bunăstarea digitală</translation> <translation id="927968626442779827">Folosește modul Lite în Google Chrome</translation> <translation id="932327136139879170">Pagina de pornire</translation> -<translation id="93753284658583800">Pagina de pornire a fost schimbată</translation> <translation id="938850635132480979">Eroare: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Introdu expresia de acces</translation> <translation id="948039501338975565">Lista dosarelor de marcaje</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 79a0f9b..f970876 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Чтобы синхронизировать и персонализировать данные на всех устройствах, включите синхронизацию.</translation> <translation id="1209206284964581585">Скрыть</translation> <translation id="1227058898775614466">История переходов</translation> -<translation id="1229399675748764149">Сделайте эту страницу главной</translation> <translation id="1231733316453485619">Включить синхронизацию?</translation> <translation id="123724288017357924">Обновить страницу без учета кешированного контента</translation> <translation id="124678866338384709">Закрыть вкладку</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Удалить пароль</translation> <translation id="1521774566618522728">Последние действия: сегодня</translation> <translation id="1538801903729528855">Сделайте голосовой поиск в Интернете удобнее</translation> -<translation id="1543538514740974167">Быстрый доступ</translation> <translation id="1544826120773021464">Чтобы перейти к управлению аккаунтом Google, нажмите кнопку "Настройки аккаунта"</translation> <translation id="1549000191223877751">Перейти к другому окну</translation> <translation id="1553358976309200471">Обновить Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайты</translation> <translation id="4594952190837476234">Офлайн-версия страницы сохранена <ph name="CREATION_TIME" />. Она может отличаться от онлайн-версии.</translation> <translation id="4605958867780575332">Удалено: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Сохраняйте страницы офлайн и получайте напоминания</translation> <translation id="4616150815774728855">Открыть <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Использовать пароль</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 раскрытый пароль.}one{# раскрытый пароль.}few{# раскрытых пароля.}many{# раскрытых паролей.}other{# раскрытого пароля.}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Восстановлен объект "<ph name="ITEM_TITLE" />"</translation> <translation id="7029809446516969842">Пароли</translation> <translation id="7030675613184250187">Сохраняйте страницы в список для чтения, чтобы они всегда были у вас под рукой и доступны в офлайн-режиме.</translation> -<translation id="703523980599857277">Изменить главную страницу</translation> <translation id="7054588988317389591">Генерировать описания изображений?</translation> <translation id="7055152154916055070">Заблокирована попытка переадресации:</translation> <translation id="7063006564040364415">Не удалось связаться с сервером синхронизации</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">У вас установлена последняя версия Chrome.</translation> <translation id="7106762743910369165">Этим браузером управляет ваша организация.</translation> <translation id="7121362699166175603">Удаление истории и вариантов автозаполнения в адресной строке. Информация о других ваших действиях в Интернете может также храниться на странице <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Нужные сайты и недавние статьи – одним нажатием кнопки.</translation> <translation id="7138678301420049075">Другое</translation> <translation id="7146622961999026732">Кажется, следующие сайты и приложения важны для вас:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Загрузить исходную версию страницы<ph name="END_LINK" /> из <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Выберите <ph name="APP_NAME" />.\n2. Нажмите "Всегда".</translation> <translation id="8410695015584479363">Отслеживать цены</translation> <translation id="8413126021676339697">Показать всю историю</translation> -<translation id="8425213833346101688">Изменить</translation> <translation id="8427875596167638501">Вкладка предпросмотра открыта на половину высоты</translation> <translation id="8428213095426709021">Настройки</translation> <translation id="8438566539970814960">Помогать улучшить просмотр страниц и поиск</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Удалить данные о действиях в Chrome из сервиса "Цифровое благополучие"</translation> <translation id="927968626442779827">Попробуйте упрощенный режим в Google Chrome.</translation> <translation id="932327136139879170">Главная страница</translation> -<translation id="93753284658583800">Главная страница изменена.</translation> <translation id="938850635132480979">Ошибка <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Введите кодовую фразу</translation> <translation id="948039501338975565">Список папок с закладками</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 63972cf..a35c03f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">උපාංග හරහා සමමුහුර්ත කිරීමට සහ පෞද්ගලීකරණය කිරීමට, සමමුහුර්තය ක්රියාත්මක කරන්න</translation> <translation id="1209206284964581585">දැනට සඟවන්න</translation> <translation id="1227058898775614466">සංචලන ඉතිහාසය</translation> -<translation id="1229399675748764149">මෙය ඔබේ මුල් පිටුව කරන්න</translation> <translation id="1231733316453485619">සමමුහුව ක්රියාත්මක කරන්න ද?</translation> <translation id="123724288017357924">හැඹිලි අන්තර්ගත නොසලකා, වත්මන් පිටුව යළි පූරණය කර.</translation> <translation id="124678866338384709">වත්මන් ටැබය වසන්න</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">මුරපදය මකන්න</translation> <translation id="1521774566618522728">අද ක්රියාත්මකයි</translation> <translation id="1538801903729528855">වෙබයෙහි වඩා හොඳ හඬ අත්දැකීමක් ලබා ගන්න</translation> -<translation id="1543538514740974167">මෙහි වඩා වේගයෙන් පැමිණෙන්න</translation> <translation id="1544826120773021464">ඔබේ Google ගිණුම කළමනා කිරීමට, "ගිණුම කළමනා කරන්න" බොත්තමට තට්ටු කරන්න</translation> <translation id="1549000191223877751">වෙනත් කවුළුවක් වෙත යන්න</translation> <translation id="1553358976309200471">Chrome යාවත් කරන්න</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">අඩවි</translation> <translation id="4594952190837476234">මෙම නොබැඳි පිටුව <ph name="CREATION_TIME" /> වෙතින් වන අතර සබැඳි අනුවාදයෙන් වෙනස් විය හැකිය.</translation> <translation id="4605958867780575332">අයිතමය ඉවත් කරන ලදී: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">පසුව ලබා ගැනීමට පිටු සුරකින්න සහ සිහිකැඳවීමක් ලබා ගන්න</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> විවෘත කරන්න</translation> <translation id="4634124774493850572">මුරපදය භාවිත කරන්න</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{අවදානමට පත් වූ මුරපද 1}one{අවදානමට පත් වූ මුරපද #}other{අවදානමට පත් වූ මුරපද #}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> ප්රතිසාධනය කරන ලදි</translation> <translation id="7029809446516969842">මුරපද</translation> <translation id="7030675613184250187">පිටු නැවත සොයා ගැනීමට හෝ නොබැඳිව කියවීමට ඔබට ඔබේ කියවීමේ ලැයිස්තුවට ඒවා සුරැකිය හැකිය</translation> -<translation id="703523980599857277">Change මුල් පිටුව</translation> <translation id="7054588988317389591">රූප විස්තර ලබා ගන්නද?</translation> <translation id="7055152154916055070">හරවා යැවීම අවහිරයි:</translation> <translation id="7063006564040364415">සමමු සර්වරයට සම්බන්ධ විය නොහැකි විය.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome යාවත්කාලීනයි</translation> <translation id="7106762743910369165">ඔබේ බ්රවුසරය ඔබේ සංවිධානය විසින් කළමනාකරණය කරයි</translation> <translation id="7121362699166175603">ලිපින තීරුව තුළ ඉතිහාසය හා ස්වයං සම්පූර්ණ කිරීම් හිස් කරයි. ඔබේ Google ගිණුමට <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> හිදී බ්රවුස් කිරීමේ ඉතිහාසයේ වෙනත් ආකාරයන් තිබිය හැක.</translation> -<translation id="7128355412245153445">ඔබ මුල් පිටු බොත්තමට තට්ටු කරන සැම විටම ඔබේ ඉහළ ප්රවෘත්ති සහ මෑත ප්රවෘත්ති දකින්න</translation> <translation id="7138678301420049075">වෙනත්</translation> <translation id="7146622961999026732">මෙම අඩවි සහ යෙදුම් ඔබට වැදගත් යැයි පෙනේ:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> වෙතින් <ph name="BEGIN_LINK" />මූලික පිටුව පූරණ කරන්න<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> තෝරන්න\n2. “සැම විටම” තට්ටු කරන්න</translation> <translation id="8410695015584479363">මිල ගණන් හඹා යන්න</translation> <translation id="8413126021676339697">සම්පූර්ණ ඉතිහාසය පෙන්වන්න</translation> -<translation id="8425213833346101688">වෙනස් කරන්න</translation> <translation id="8427875596167638501">පෙරදසුන් පටිත්ත අඩක් විවෘතයි</translation> <translation id="8428213095426709021">සැකසුම්</translation> <translation id="8438566539970814960">සෙවීම් සහ ගවේෂණය වඩා හොඳ කරන්න</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ඩිජිටල් සුවතාව වෙතින් ඔබේ Chrome ක්රියාකාරකම් ඉවත් කරන්න</translation> <translation id="927968626442779827">Google Chrome හි සැහැල්ලු ප්රකාරය භාවිත කරන්න</translation> <translation id="932327136139879170">මුල් පිටුව</translation> -<translation id="93753284658583800">මුල් පිටුව වෙනස් විය</translation> <translation id="938850635132480979">දෝෂය: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">මුරවදන ඇතුළත් කරන්න</translation> <translation id="948039501338975565">පිටුසන් ෆෝල්ඩර ලැයිස්තුව</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 2f5ae3a8..48c063f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -32,12 +32,11 @@ <translation id="1177863135347784049">Vlastné</translation> <translation id="1197267115302279827">Presunúť záložky</translation> <translation id="1201402288615127009">Ďalej</translation> -<translation id="1204037785786432551">Stiahnuť obsah odkazu</translation> +<translation id="1204037785786432551">Stiahnuť odkaz</translation> <translation id="1206892813135768548">Kopírovať text odkazu</translation> <translation id="1208340532756947324">Ak chcete synchronizovať a prispôsobovať viaceré zariadenia, zapnite synchronizáciu</translation> <translation id="1209206284964581585">Skryť</translation> <translation id="1227058898775614466">História navigácie</translation> -<translation id="1229399675748764149">Nastavte si túto stránku ako domovskú stránku</translation> <translation id="1231733316453485619">Chcete zapnúť synchronizáciu?</translation> <translation id="123724288017357924">Opätovné načítanie aktuálnej stránky a ignorovanie obsahu vo vyrovnávacej pamäti</translation> <translation id="124678866338384709">Zavretie aktuálnej karty</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Odstrániť heslo</translation> <translation id="1521774566618522728">Aktívne dnes</translation> <translation id="1538801903729528855">Zlepšite si vyhľadávanie hlasom na internete</translation> -<translation id="1543538514740974167">Prechádzajte rýchlejšie</translation> <translation id="1544826120773021464">Ak chcete spravovať svoj účet Google, klepnite na tlačidlo Spravovať účet</translation> <translation id="1549000191223877751">Prejsť do druhého okna</translation> <translation id="1553358976309200471">Aktualizovať Chrome</translation> @@ -96,7 +94,7 @@ <translation id="1672586136351118594">Nabudúce nezobrazovať</translation> <translation id="1680919990519905526">Obr. obch. v Google Lens <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> <translation id="1682195225331129001">Vyskúšať</translation> -<translation id="1692118695553449118">Synchronizácia je zapnutá.</translation> +<translation id="1692118695553449118">Synchronizácia je zapnutá</translation> <translation id="1697284962337958118">Pridať do</translation> <translation id="1718835860248848330">Posledná hodina</translation> <translation id="1736419249208073774">Preskúmať</translation> @@ -163,7 +161,7 @@ <translation id="2122601567107267586">Aplikáciu sa nepodarilo otvoriť</translation> <translation id="2126426811489709554">Používa technológiu prehliadača Chrome</translation> <translation id="2131665479022868825">Uložené: <ph name="DATA" /></translation> -<translation id="213279576345780926">Karta <ph name="TAB_TITLE" /> je zavretá</translation> +<translation id="213279576345780926">Karta „<ph name="TAB_TITLE" />“ je zavretá</translation> <translation id="2139186145475833000">Pridať na plochu</translation> <translation id="214888715418183969">Vyberte, čo chcete zdieľať s Chromom. Zdieľané metriky pomôžu zlepšovať funkcie, výkonnosť aj stabilitu Chromu.</translation> <translation id="2154484045852737596">Úprava karty</translation> @@ -415,7 +413,7 @@ <translation id="3943557322767080599">Zobrazovať výzvy na prihlásenie do Chromu, keď sa prihlásite do svojho účtu Google</translation> <translation id="395206256282351086">Návrhy vyhľadávania a webov sú deaktivované</translation> <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome stránku načíta, keď bude k dispozícii}few{Chrome stránku načíta, keď bude k dispozícii}many{Chrome stránku načíta, keď bude k dispozícii}other{Chrome stránku načíta, keď bude k dispozícii}}</translation> -<translation id="3963007978381181125">Šifrovanie prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. Šifrované údaje si môže prečítať iba používateľ s prístupovou frázou. Prístupová fráza sa neodosiela do Googlu ani sa v ňom neuchováva. Ak ju zabudnete alebo chcete toto nastavenie zmeniť, budete musieť resetovať synchronizáciu. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> +<translation id="3963007978381181125">Šifrovanie pomocou prístupovej frázy nezahŕňa spôsoby platby a adresy zo služby Google Pay. Šifrované údaje si môže prečítať iba používateľ s prístupovou frázou. Prístupová fráza sa neodosiela do Googlu a nie je na Googli uložená. Ak ju zabudnete alebo toto nastavenie budete chcieť zmeniť, bude nutné synchronizáciu resetovať. <ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Sťahovanie dokončené</translation> <translation id="3969142555815019568">Chrome nemôže skontrolovať heslá</translation> <translation id="3974987681202239636"><ph name="APP_NAME" /> sa otvorí v Chrome. Pokračovaním vyjadrujete súhlas so <ph name="BEGIN_LINK1" />zmluvnými podmienkami spoločnosti Google<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />dodatočnými zmluvnými podmienkami prehliadača Google Chrome a systému Chrome OS<ph name="END_LINK2" />. Platí aj <ph name="BEGIN_LINK3" />oznámenie o ochrane súkromia pre účty Google spravované pomocou aplikácie Family Link<ph name="END_LINK3" />.</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Weby</translation> <translation id="4594952190837476234">Táto offline stránka je z <ph name="CREATION_TIME" /> a líši sa od online verzie.</translation> <translation id="4605958867780575332">Položka bola odstránená: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Uložte si stránky na neskôr a dostávajte pripomenutia</translation> <translation id="4616150815774728855">Otvoriť <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Použiť heslo</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 prelomené heslo}few{# prelomené heslá}many{# compromised passwords}other{# prelomených hesiel}}</translation> @@ -581,7 +578,7 @@ <translation id="509429900233858213">Vyskytla sa chyba.</translation> <translation id="510275257476243843">Zostáva: 1 h</translation> <translation id="5123685120097942451">Karta inkognito</translation> -<translation id="5127805178023152808">Synchronizácia je vypnutá.</translation> +<translation id="5127805178023152808">Synchronizácia je vypnutá</translation> <translation id="5132942445612118989">Synchronizujte svoje heslá, históriu a ďalší obsah vo všetkých zariadeniach</translation> <translation id="5136035049889637840">Kúpiť podobné výrobky <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> <translation id="5139940364318403933">Ako používať Disk Google</translation> @@ -848,7 +845,7 @@ <translation id="6845325883481699275">Pomoc so zlepšením zabezpečenia Chromu</translation> <translation id="6846298663435243399">Načítava sa…</translation> <translation id="6850409657436465440">Sťahovanie stále prebieha</translation> -<translation id="6850830437481525139">Zatvorené karty: <ph name="TAB_COUNT" /></translation> +<translation id="6850830437481525139">Všetky karty sú zatvorené (<ph name="TAB_COUNT" />)</translation> <translation id="685850645784703949">Kanál Objaviť od Googlu – vypnutý</translation> <translation id="6864459304226931083">Stiahnuť obrázok</translation> <translation id="6865313869410766144">Dáta automatického dopĺňania formulárov</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Obnovili ste položku <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Heslá</translation> <translation id="7030675613184250187">Stránky si môžete uložiť do zoznamu na čítanie, aby ste ich mohli znova nájsť alebo čítať v režime offfline</translation> -<translation id="703523980599857277">Zmeniť domovskú stránku</translation> <translation id="7054588988317389591">Chcete získať popisy obrázkov?</translation> <translation id="7055152154916055070">Presmerovanie bolo zablokované:</translation> <translation id="7063006564040364415">Nepodarilo sa pripojiť k synchronizačnému serveru.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome je aktuálny</translation> <translation id="7106762743910369165">Prehliadač je spravovaný vašou organizáciou</translation> <translation id="7121362699166175603">Vymaže históriu a záznamy automatického dopĺňania v paneli s adresou. Váš účet Google môže mať ďalšie formy histórie prehliadania na adrese <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Zobrazujte si najobľúbenejšie weby a aktuálne správy klepnutím na tlačidlo Domov</translation> <translation id="7138678301420049075">Ostatné</translation> <translation id="7146622961999026732">Tieto weby a aplikácie zrejme považujete za dôležité:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Načítať pôvodnú stránku<ph name="END_LINK" /> z domény <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Vyberte aplikáciu <ph name="APP_NAME" />.\n2. Klepnite na Vždy.</translation> <translation id="8410695015584479363">Sledovať ceny</translation> <translation id="8413126021676339697">Zobraziť celú históriu</translation> -<translation id="8425213833346101688">Zmeniť</translation> <translation id="8427875596167638501">Karta ukážky je dopoly otvorená</translation> <translation id="8428213095426709021">Nastavenia</translation> <translation id="8438566539970814960">Zlepšovať vyhľadávanie a prehliadanie</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Odstránenie aktivity v Chrome z digitálnej rovnováhy</translation> <translation id="927968626442779827">Používanie zjednodušeného režimu v prehliadači Google Chrome</translation> <translation id="932327136139879170">Domov</translation> -<translation id="93753284658583800">Domovská stránka bola zmenená</translation> <translation id="938850635132480979">Chyba: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Zadať prístupovú frázu</translation> <translation id="948039501338975565">Zoznam priečinkov so záložkami</translation> @@ -1204,7 +1197,7 @@ <translation id="962979164594783469">Inštalovať túto aplikáciu</translation> <translation id="968900484120156207">Tu sa zobrazia vami navštívené stránky</translation> <translation id="970715775301869095">Zostáva: <ph name="MINUTES" /> min</translation> -<translation id="974555521953189084">Ak chcete spustiť synchronizáciu, zadajte prístupovú frázu</translation> +<translation id="974555521953189084">Pre synchronizáciu zadajte prístupovú frázu</translation> <translation id="981121421437150478">Offline</translation> <translation id="983192555821071799">Zavrieť všetky karty</translation> <translation id="987264212798334818">Všeobecné</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index ad18cea..559f36dd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Če želite sinhronizirati in prilagajati v vseh napravah, vklopite sinhronizacijo</translation> <translation id="1209206284964581585">Zaenkrat skrij</translation> <translation id="1227058898775614466">Zgodovina krmarjenja</translation> -<translation id="1229399675748764149">Naj bo ta stran vaša domača stran</translation> <translation id="1231733316453485619">Želite vklopiti sinhronizacijo?</translation> <translation id="123724288017357924">Vnov. nalag. tren. strani s prezrtjem predp. vseb.</translation> <translation id="124678866338384709">Zapiranje trenutnega zavihka</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Izbris gesla</translation> <translation id="1521774566618522728">Aktivno danes</translation> <translation id="1538801903729528855">Boljša glasovna izkušnja v spletu</translation> -<translation id="1543538514740974167">Hitrejši pomik sem</translation> <translation id="1544826120773021464">Če želite upravljati račun Google, se dotaknite gumba »Upravljanje računa«</translation> <translation id="1549000191223877751">Premik v drugo okno</translation> <translation id="1553358976309200471">Posodobi Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Spletna mesta</translation> <translation id="4594952190837476234">Ta stran brez povezave je bila ustvarjena <ph name="CREATION_TIME" /> in se morda razlikuje od spletne različice.</translation> <translation id="4605958867780575332">Odstranjen element: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Shranite strani za pozneje in prejmite opomnik</translation> <translation id="4616150815774728855">Odpri <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Uporabi geslo</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ogroženo geslo}one{# ogroženo geslo}two{# ogroženi gesli}few{# ogrožena gesla}other{# ogroženih gesel}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Obnovljeno: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Gesla</translation> <translation id="7030675613184250187">Strani lahko shranite na seznam za branje, če jih želite poiskati znova ali brati brez povezave.</translation> -<translation id="703523980599857277">Spremeni domačo stran</translation> <translation id="7054588988317389591">Želite pridobiti opise slik?</translation> <translation id="7055152154916055070">Preusmeritev je preprečena:</translation> <translation id="7063006564040364415">Povezave s strežnikom za sinhronizacijo ni bilo mogoče vzpostaviti.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome je posodobljen</translation> <translation id="7106762743910369165">Vaš brskalnik upravlja organizacija</translation> <translation id="7121362699166175603">Izbriše zgodovino in samodokončanja v naslovni vrstici. V Google Računu so morda druge vrste zgodovine brskanja na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Oglejte si najbolj priljubljena spletna mesta in nedavne novice, kadar koli se dotaknete gumba za domačo stran</translation> <translation id="7138678301420049075">Drugo</translation> <translation id="7146622961999026732">Videti je, da so vam ta spletna mesta in aplikacije pomembni:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Naloži izvirno stran<ph name="END_LINK" /> iz domene <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Izberite aplikacijo <ph name="APP_NAME" />.\n2. Dotaknite se »Vedno«.</translation> <translation id="8410695015584479363">Spremljanje cen</translation> <translation id="8413126021676339697">Prikaži celotno zgodovino</translation> -<translation id="8425213833346101688">Spremeni</translation> <translation id="8427875596167638501">Zavihek za predogled je napol odprt</translation> <translation id="8428213095426709021">Nastavitve</translation> <translation id="8438566539970814960">Izboljšanje iskanja in brskanja</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Odstranitev dejavnosti v Chromu iz Digitalne dobrobiti</translation> <translation id="927968626442779827">Uporabite lahki način v Google Chromu</translation> <translation id="932327136139879170">Domov</translation> -<translation id="93753284658583800">Domača stran je bila spremenjena</translation> <translation id="938850635132480979">Napaka: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Vnesite geslo</translation> <translation id="948039501338975565">Seznam map z zaznamki</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 3714d5b..ff24b1d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Për të sinkronizuar dhe personalizuar mes pajisjeve, aktivizo sinkronizimin</translation> <translation id="1209206284964581585">Fshih për momentin</translation> <translation id="1227058898775614466">Historiku i navigimit</translation> -<translation id="1229399675748764149">Bëje këtë faqe faqen tënde bazë</translation> <translation id="1231733316453485619">Të aktivizohet sinkronizimi?</translation> <translation id="123724288017357924">Ringarko faqen aktuale, duke shpërfillur përmbajtjen në memorien specifike</translation> <translation id="124678866338384709">Mbyll skedën aktuale</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Fshi fjalëkalimin</translation> <translation id="1521774566618522728">Aktiv sot</translation> <translation id="1538801903729528855">Merr një përvojë më të mirë zanore në ueb</translation> -<translation id="1543538514740974167">Si të mbërrish këtu më shpejt</translation> <translation id="1544826120773021464">Për të menaxhuar "Llogarinë tënde të Google", prek butonin "Menaxho llogarinë"</translation> <translation id="1549000191223877751">Zhvendose te dritarja tjetër</translation> <translation id="1553358976309200471">Përditëso Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sajtet</translation> <translation id="4594952190837476234">Kjo faqe jashtë linje është nga <ph name="CREATION_TIME" /> dhe mund të ndryshojë nga versioni në linjë.</translation> <translation id="4605958867780575332">Artikulli u hoq: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Ruaji faqet për më vonë dhe merr një rikujtesë</translation> <translation id="4616150815774728855">Hap <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Përdor fjalëkalimin</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 fjalëkalim i komprometuar}other{# fjalëkalime të komprometuara}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Restauruar në datën <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Fjalëkalimet</translation> <translation id="7030675613184250187">Mund t'i ruash faqet në listën e leximit për t'i gjetur ato përsëri ose për t'i lexuar jashtë linje</translation> -<translation id="703523980599857277">Ndrysho faqen kryesore</translation> <translation id="7054588988317389591">Të merren përshkrimet e imazheve?</translation> <translation id="7055152154916055070">Ridrejtimi u bllokua:</translation> <translation id="7063006564040364415">Nuk mund të lidhej me serverin e sinkronizimit.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome është i përditësuar</translation> <translation id="7106762743910369165">Shfletuesi yt menaxhohet nga organizata jote</translation> <translation id="7121362699166175603">Pastron historikun dhe plotësimet automatike në shiritin e adresës. Llogaria jote e Google mund të ketë forma të tjera të historikut të shfletimit në <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Shiko sajtet kryesore dhe historitë e fundit sa herë që troket te butoni "Kreu"</translation> <translation id="7138678301420049075">Tjetër</translation> <translation id="7146622961999026732">Këto sajte dhe aplikacione duken të rëndësishme për ty:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Ngarko faqen origjinale<ph name="END_LINK" /> nga <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Zgjidh <ph name="APP_NAME" />\n2. Trokit te "Gjithmonë"</translation> <translation id="8410695015584479363">Gjurmo çmimet</translation> <translation id="8413126021676339697">Shfaq historikun e plotë</translation> -<translation id="8425213833346101688">Ndrysho</translation> <translation id="8427875596167638501">Skeda e shikimit paraprak është gjysmë e hapur</translation> <translation id="8428213095426709021">Cilësimet</translation> <translation id="8438566539970814960">Përmirëson kërkimet dhe shfletimin</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Hiq aktivitetin tënd të Chrome nga "Mirëqenia dixhitale"</translation> <translation id="927968626442779827">Përdor "Modalitetin e lehtë" në Google Chrome</translation> <translation id="932327136139879170">Faqja kryesore</translation> -<translation id="93753284658583800">Faqja kryesore u ndryshua</translation> <translation id="938850635132480979">Gabim: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Fut frazën e kalimit</translation> <translation id="948039501338975565">Lista e dosjeve të faqeshënuesit</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 1b31f51..c4f0394 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Da biste sinhronizovali i personalizovali sadržaj na uređajima, uključite sinhronizaciju</translation> <translation id="1209206284964581585">Sakrij za sada</translation> <translation id="1227058898775614466">Istorija navigacije</translation> -<translation id="1229399675748764149">Podesite ovu stranicu kao početnu stranicu</translation> <translation id="1231733316453485619">Želite li da uključite sinhronizaciju?</translation> <translation id="123724288017357924">Ponovno učitavanje aktuelne stranice, zanemarujući keširani sadržaj</translation> <translation id="124678866338384709">Zatvaranje aktuelne kartice</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Izbriši lozinku</translation> <translation id="1521774566618522728">Aktivan je danas</translation> <translation id="1538801903729528855">Ostvarite bolji doživljaj pri glasovnoj pretrazi na vebu</translation> -<translation id="1543538514740974167">Brže otvarajte ovu stranicu</translation> <translation id="1544826120773021464">Da biste upravljali Google nalogom, dodirnite dugme „Upravljajte nalogom“</translation> <translation id="1549000191223877751">Premesti u drugi prozor</translation> <translation id="1553358976309200471">Ažuriraj Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sajtovi</translation> <translation id="4594952190837476234">Ova oflajn stranica je od <ph name="CREATION_TIME" /> i može da se razlikuje od onlajn verzije.</translation> <translation id="4605958867780575332">Stavka je uklonjena: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Sačuvajte stranice za kasnije i primite podsetnik</translation> <translation id="4616150815774728855">Otvori <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Koristi lozinku</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ugrožena lozinka}one{# ugrožena lozinka}few{# ugrožene lozinke}other{# ugroženih lozinki}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Vraćena je stavka <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Lozinke</translation> <translation id="7030675613184250187">Možete da sačuvate stranice na listi za čitanje da biste ih ponovo pronašli ili čitali oflajn</translation> -<translation id="703523980599857277">Promeni početnu stranicu</translation> <translation id="7054588988317389591">Želite da dobijate opise slika?</translation> <translation id="7055152154916055070">Blokirano je preusmeravanje:</translation> <translation id="7063006564040364415">Nije moguće povezivanje sa serverom za sinhronizaciju.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome je ažuriran</translation> <translation id="7106762743910369165">Organizacija upravlja pregledačem</translation> <translation id="7121362699166175603">Briše istoriju i automatska dovršavanja u traci za adresu. Google nalog može da ima druge oblike istorije pregledanja na <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Vidite sajtove koje najčešće posećujete i nedavne vesti kad god dodirnete dugme Početna</translation> <translation id="7138678301420049075">Drugo</translation> <translation id="7146622961999026732">Izgleda da su vam ovi sajtovi i aplikacije važni:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Učitaj originalnu stranicu<ph name="END_LINK" /> sa <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Izaberite <ph name="APP_NAME" />\n2. Dodirnite „Uvek“</translation> <translation id="8410695015584479363">Pratite cene</translation> <translation id="8413126021676339697">Prikaži svu istoriju</translation> -<translation id="8425213833346101688">Promeni</translation> <translation id="8427875596167638501">Kartica za pregled je poluotvorena</translation> <translation id="8428213095426709021">Podešavanja</translation> <translation id="8438566539970814960">Poboljšaj pretrage i pregledanje</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Uklonite Chrome aktivnosti iz Digitalnog blagostanja</translation> <translation id="927968626442779827">Koristite Lite režim u Google Chrome-u</translation> <translation id="932327136139879170">Početna</translation> -<translation id="93753284658583800">Početna stranica je promenjena</translation> <translation id="938850635132480979">Greška: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Unesite pristupnu frazu</translation> <translation id="948039501338975565">Lista foldera sa obeleživačima</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index 1ac36155..01b810cc0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Да бисте синхронизовали и персонализовали садржај на уређајима, укључите синхронизацију</translation> <translation id="1209206284964581585">Сакриј за сада</translation> <translation id="1227058898775614466">Историја навигације</translation> -<translation id="1229399675748764149">Подесите ову страницу као почетну страницу</translation> <translation id="1231733316453485619">Желите ли да укључите синхронизацију?</translation> <translation id="123724288017357924">Поновно учитавање актуелне странице, занемарујући кеширани садржај</translation> <translation id="124678866338384709">Затварање актуелне картице</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Избриши лозинку</translation> <translation id="1521774566618522728">Активан је данас</translation> <translation id="1538801903729528855">Остварите бољи доживљај при гласовној претрази на вебу</translation> -<translation id="1543538514740974167">Брже отварајте ову страницу</translation> <translation id="1544826120773021464">Да бисте управљали Google налогом, додирните дугме „Управљајте налогом“</translation> <translation id="1549000191223877751">Премести у други прозор</translation> <translation id="1553358976309200471">Ажурирај Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сајтови</translation> <translation id="4594952190837476234">Ова офлајн страница је од <ph name="CREATION_TIME" /> и може да се разликује од онлајн верзије.</translation> <translation id="4605958867780575332">Ставка је уклоњена: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Сачувајте странице за касније и примите подсетник</translation> <translation id="4616150815774728855">Отвори <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Користи лозинку</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 угрожена лозинка}one{# угрожена лозинка}few{# угрожене лозинке}other{# угрожених лозинки}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Враћена је ставка <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Лозинке</translation> <translation id="7030675613184250187">Можете да сачувате странице на листи за читање да бисте их поново пронашли или читали офлајн</translation> -<translation id="703523980599857277">Промени почетну страницу</translation> <translation id="7054588988317389591">Желите да добијате описе слика?</translation> <translation id="7055152154916055070">Блокирано је преусмеравање:</translation> <translation id="7063006564040364415">Није могуће повезивање са сервером за синхронизацију.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome је ажуриран</translation> <translation id="7106762743910369165">Организација управља прегледачем</translation> <translation id="7121362699166175603">Брише историју и аутоматска довршавања у траци за адресу. Google налог може да има друге облике историје прегледања на <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Видите сајтове које најчешће посећујете и недавне вести кад год додирнете дугме Почетна</translation> <translation id="7138678301420049075">Друго</translation> <translation id="7146622961999026732">Изгледа да су вам ови сајтови и апликације важни:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Учитај оригиналну страницу<ph name="END_LINK" /> са <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Изаберите <ph name="APP_NAME" />\n2. Додирните „Увек“</translation> <translation id="8410695015584479363">Пратите цене</translation> <translation id="8413126021676339697">Прикажи сву историју</translation> -<translation id="8425213833346101688">Промени</translation> <translation id="8427875596167638501">Картица за преглед је полуотворена</translation> <translation id="8428213095426709021">Подешавања</translation> <translation id="8438566539970814960">Побољшај претраге и прегледање</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Уклоните Chrome активности из Дигиталног благостања</translation> <translation id="927968626442779827">Користите Lite режим у Google Chrome-у</translation> <translation id="932327136139879170">Почетна</translation> -<translation id="93753284658583800">Почетна страница је промењена</translation> <translation id="938850635132480979">Грешка: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Унесите приступну фразу</translation> <translation id="948039501338975565">Листа фолдера са обележивачима</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index ef3e9cef..38b337f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Aktivera synkronisering om du vill synkronisera och anpassa alla dina enheter</translation> <translation id="1209206284964581585">Dölj för tillfället</translation> <translation id="1227058898775614466">Navigeringshistorik</translation> -<translation id="1229399675748764149">Gör den här sidan till startsida</translation> <translation id="1231733316453485619">Vill du aktivera synkronisering?</translation> <translation id="123724288017357924">Läs in den aktuella sidan igen och ignorera cachelagrat innehåll</translation> <translation id="124678866338384709">Stäng den aktuella fliken</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Radera lösenord</translation> <translation id="1521774566618522728">Aktiv idag</translation> <translation id="1538801903729528855">Få en bättre upplevelse på webben med rösten</translation> -<translation id="1543538514740974167">Kom hit snabbare</translation> <translation id="1544826120773021464">Tryck på knappen Hantera kontot om du vill hantera ditt Google-konto</translation> <translation id="1549000191223877751">Flytta till annat fönster</translation> <translation id="1553358976309200471">Uppdatera Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Webbplatser</translation> <translation id="4594952190837476234">Den här offlinesidan sparades <ph name="CREATION_TIME" /> och kan skilja sig från onlineversionen.</translation> <translation id="4605958867780575332">Borttaget objekt: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Spara sidor till senare och bli påmind</translation> <translation id="4616150815774728855">Öppna <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Använd lösenordet</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 utsatt lösenord}other{# utsatta lösenord}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> återställdes</translation> <translation id="7029809446516969842">Lösenord</translation> <translation id="7030675613184250187">Du kan spara sidor i läslistan så att du kan hitta dem igen eller läsa dem offline</translation> -<translation id="703523980599857277">Ändra startsida</translation> <translation id="7054588988317389591">Vill du få bildbeskrivningar?</translation> <translation id="7055152154916055070">Omdirigeringen blockerades:</translation> <translation id="7063006564040364415">Det gick inte att ansluta till synkroniseringsservern.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome har uppdaterats</translation> <translation id="7106762743910369165">Webbläsaren hanteras av din organisation</translation> <translation id="7121362699166175603">Historik och autoslutföranden i adressfältet rensas. Det kan finnas andra former av webbhistorik i Google-kontot på <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Se dina mest besökta webbplatser och dina senaste artiklar när du trycker på hemknappen</translation> <translation id="7138678301420049075">Övrigt</translation> <translation id="7146622961999026732">De här webbplatserna och apparna verkar vara viktiga för dig:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Läs in originalsidan<ph name="END_LINK" /> från <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Välj <ph name="APP_NAME" />\n2. Tryck på Alltid</translation> <translation id="8410695015584479363">Bevaka priser</translation> <translation id="8413126021676339697">Visa fullständig historik</translation> -<translation id="8425213833346101688">Ändra</translation> <translation id="8427875596167638501">Fliken Förhandsgranskning visas på halva skärmen</translation> <translation id="8428213095426709021">Inställningar</translation> <translation id="8438566539970814960">Förbättra sökningar och surfandet</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Ta bort din aktivitet i Chrome från Digitalt välmående</translation> <translation id="927968626442779827">Använd begränsat läge i Google Chrome</translation> <translation id="932327136139879170">Startsida</translation> -<translation id="93753284658583800">Startsidan har ändrats</translation> <translation id="938850635132480979">Fel: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ange lösenfras</translation> <translation id="948039501338975565">Lista över bokmärkesmappar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 865b9264..f4a302e7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Ili usawazishe na uweke mapendeleo kwenye vifaa vyako vyote, washa kipengele cha usawazishaji</translation> <translation id="1209206284964581585">Ficha kwa sasa</translation> <translation id="1227058898775614466">Historia ya uelekezaji</translation> -<translation id="1229399675748764149">Fanya ukurasa huu uwe ukurasa wako wa kwanza</translation> <translation id="1231733316453485619">Ungependa kuwasha usawazishaji?</translation> <translation id="123724288017357924">Pakia upya ukurasa wa sasa, puuza maudhui ya akiba</translation> <translation id="124678866338384709">Funga kichupo kilichofunguka</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Futa nenosiri</translation> <translation id="1521774566618522728">Ameitumia leo</translation> <translation id="1538801903729528855">Furahia hali bora zaidi ya kutumia sauti kwenye wavuti</translation> -<translation id="1543538514740974167">Fika hapa haraka</translation> <translation id="1544826120773021464">Ili udhibiti akaunti yako ya Google, gusa kitufe cha "Dhibiti akaunti"</translation> <translation id="1549000191223877751">Nenda kwenye dirisha jingine</translation> <translation id="1553358976309200471">Sasisha Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Tovuti</translation> <translation id="4594952190837476234">Ukurasa huu wa nje ya mtandao umetoka <ph name="CREATION_TIME" /> na huenda ukatofautiana na toleo lililo mtandaoni.</translation> <translation id="4605958867780575332">Kipengee kilichoondolewa: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Hifadhi kurasa ili uzisome baadaye na upate kikumbusho</translation> <translation id="4616150815774728855">Fungua <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Tumia nenosiri</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Nenosiri moja limeathiriwa}other{Manenosiri # yameathiriwa}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Umerejesha <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Manenosiri</translation> <translation id="7030675613184250187">Unaweza kuhifadhi kurasa kwenye orodha yako ya kusoma ili uzipate tena au usome nje ya mtandao</translation> -<translation id="703523980599857277">Badilisha ukurasa wa kwanza</translation> <translation id="7054588988317389591">Ungependa kupata maelezo ya picha?</translation> <translation id="7055152154916055070">Imezuiwa kuelekeza kwingine:</translation> <translation id="7063006564040364415">Haikuweza kuunganisha kwenye seva ya usawazishaji.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome imesasishwa</translation> <translation id="7106762743910369165">Kivinjari chako kinadhibitiwa na shirika lako</translation> <translation id="7121362699166175603">Hufuta historia na ukamilishaji kiotomatiki kwenye sehemu ya anwani. Huenda Akaunti yako ya Google ikawa na aina nyingine za historia ya kuvinjari kwenye <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Angalia tovuti zako kuu na taarifa za hivi punde unapogusa kitufe cha Ukurasa wa Mwanzo</translation> <translation id="7138678301420049075">Nyingine</translation> <translation id="7146622961999026732">Tovuti na programu hizi zinaonekana kuwa muhimu kwako:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Pakia ukurasa halisi<ph name="END_LINK" /> kutoka <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Chagua <ph name="APP_NAME" />\n2. Gusa “Kila mara”</translation> <translation id="8410695015584479363">Fuatilia bei</translation> <translation id="8413126021676339697">Onyesha historia kamili</translation> -<translation id="8425213833346101688">Badilisha</translation> <translation id="8427875596167638501">Kichupo cha kukagua kwanza kimefunguliwa nusu</translation> <translation id="8428213095426709021">Mipangilio</translation> <translation id="8438566539970814960">Boresha utafutaji na kuvinjari</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Ondoa shughuli zako za Chrome kwenye mpango wa Nidhamu Dijitali</translation> <translation id="927968626442779827">Tumia Hali Nyepesi kwenye Google Chrome</translation> <translation id="932327136139879170">Mwanzo</translation> -<translation id="93753284658583800">Ukurasa wa kwanza umebadilishwa</translation> <translation id="938850635132480979">Hitilafu: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ingiza kaulisiri</translation> <translation id="948039501338975565">Orodha ya folda za alamisho</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 04f6d8b6..de0bc0bc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">அனைத்துச் சாதனங்களுக்கு இடையிலும் ஒத்திசைக்க மற்றும் தனிப்பயனாக்க, ஒத்திசைவை இயக்கவும்</translation> <translation id="1209206284964581585">இப்போதைக்கு மறை</translation> <translation id="1227058898775614466">வழிசெலுத்தல் வரலாறு</translation> -<translation id="1229399675748764149">இந்தப் பக்கத்தை முகப்புப் பக்கமாக்குங்கள்</translation> <translation id="1231733316453485619">ஒத்திசைவை இயக்கவா?</translation> <translation id="123724288017357924">தற்காலிக சேமிப்பைப் புறக்கணித்து, நடப்புப் பக்கத்தை மீண்டும் ஏற்றும்</translation> <translation id="124678866338384709">தற்போதைய தாவலை மூடும்</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">கடவுச்சொல்லை நீக்கு</translation> <translation id="1521774566618522728">இன்று பயன்படுத்தியுள்ளார்</translation> <translation id="1538801903729528855">இன்னும் சிறப்பான குரல் அனுபவத்தை இணையத்தில் பெறுங்கள்</translation> -<translation id="1543538514740974167">அடிக்கடி பயன்படுத்துபவற்றை விரைவாக அணுகுங்கள்</translation> <translation id="1544826120773021464">உங்கள் Google கணக்கை நிர்வகிக்க "கணக்கை நிர்வகி" என்ற பட்டனைத் தட்டுங்கள்</translation> <translation id="1549000191223877751">வேறு சாளரத்திற்கு நகர்த்து</translation> <translation id="1553358976309200471">Chromeஐப் புதுப்பி</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234"><ph name="CREATION_TIME" /> அன்று இந்த ஆஃப்லைன் பக்கம் உருவாக்கப்பட்டது. இது ஆன்லைன் பதிப்பிலிருந்து வேறுபடலாம்.</translation> <translation id="4605958867780575332">உருப்படி அகற்றப்பட்டது: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">பக்கங்களைப் பின்னர் பார்ப்பதற்குச் சேமித்து அதற்கான நினைவூட்டலைப் பெறலாம்</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" />ஐத் திற</translation> <translation id="4634124774493850572">கடவுச்சொல்லைப் பயன்படுத்து</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 களவாடப்பட்ட கடவுச்சொல்}other{# களவாடப்பட்ட கடவுச்சொற்கள்}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> மீட்டெடுக்கப்பட்டது</translation> <translation id="7029809446516969842">கடவுச்சொற்கள்</translation> <translation id="7030675613184250187">பக்கங்களை மீண்டும் கண்டறியவோ ஆஃப்லைனில் படிக்கவோ உங்கள் வாசிப்புப் பட்டியலில் அவற்றைச் சேமிக்கலாம்</translation> -<translation id="703523980599857277">முகப்புப்பக்கத்தை மாற்று</translation> <translation id="7054588988317389591">பட விளக்கங்களைப் பெற வேண்டுமா?</translation> <translation id="7055152154916055070">திசைதிருப்புதல் தடுக்கப்பட்டது:</translation> <translation id="7063006564040364415">ஒத்திசைவு சேவையகத்துடன் இணைக்க முடியவில்லை.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome சமீபத்திய பதிப்பில் உள்ளது</translation> <translation id="7106762743910369165">உங்கள் உலாவியை உங்கள் நிறுவனம் நிர்வகிக்கிறது</translation> <translation id="7121362699166175603">முகவரிப் பட்டியில் வரலாற்றையும் தானே நிரப்புதலையும் அழிக்கும். உங்கள் Google கணக்கு, <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> என்ற இணைப்பில் உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கக்கூடும்.</translation> -<translation id="7128355412245153445">முகப்புப் பட்டனைத் தட்டும்போது நீங்கள் அடிக்கடி பயன்படுத்தும் தளங்களையும் சமீபத்திய செய்திகளையும் காட்டும்</translation> <translation id="7138678301420049075">மற்றவை</translation> <translation id="7146622961999026732">இந்தத் தளங்களும் ஆப்ஸும் உங்களுக்கு முக்கியமானவை எனக் கருதுகிறோம்:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> இலிருந்து <ph name="BEGIN_LINK" />அசல் பக்கத்தை ஏற்று<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> ஐத் தேர்வுசெய்யவும்\n2. “எப்போதும்” என்பதைத் தட்டவும்</translation> <translation id="8410695015584479363">விலைகளைக் கண்காணி</translation> <translation id="8413126021676339697">முழு வரலாற்றையும் காண்பி</translation> -<translation id="8425213833346101688">மாற்று</translation> <translation id="8427875596167638501">மாதிரிக்காட்சித் தாவல் பாதியளவு திறந்துள்ளது</translation> <translation id="8428213095426709021">அமைப்புகள்</translation> <translation id="8438566539970814960">தேடல்களையும் உலாவலையும் மேலும் சிறப்பாக்குக</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome செயல்பாட்டை டிஜிட்டல் வெல்பீயிங்கிலிருந்து நீக்குதல்</translation> <translation id="927968626442779827">Google Chrome உலாவியில் லைட் பயன்முறையைப் பயன்படுத்தலாம்</translation> <translation id="932327136139879170">முகப்பு</translation> -<translation id="93753284658583800">முகப்புப்பக்கம் மாற்றப்பட்டது</translation> <translation id="938850635132480979">பிழை: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">கடவுச்சொற்றொடரை உள்ளிடுக</translation> <translation id="948039501338975565">புக்மார்க் கோப்புறைகளின் பட்டியல்</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index dc778173..b1c35ee 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">మీ అన్ని పరికరాలలోనూ సమకాలీకరణ చేయాలన్నా లేదా మీ అభిరుచికి అనుగుణంగా సెట్ చేయాలన్నా, తప్పనిసరిగా సమకాలీకరణ ఎంపికను ఆన్ చేయాలి</translation> <translation id="1209206284964581585">ప్రస్తుతానికి దాచు</translation> <translation id="1227058898775614466">నావిగేషన్ చరిత్ర</translation> -<translation id="1229399675748764149">ఈ పేజీను మీ హోమ్పేజీగా చేసుకోండి</translation> <translation id="1231733316453485619">సమకాలీకరణను ఆన్ చేయాలా?</translation> <translation id="123724288017357924">కాష్ కంటెంట్ విస్మరించి ప్రస్తుత పేజీ మళ్లీ లోడ్ చేయండి</translation> <translation id="124678866338384709">ప్రస్తుత ట్యాబ్ను మూసివేయండి</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">పాస్వర్డ్ను తొలగించు</translation> <translation id="1521774566618522728">ఈ రోజు యాక్టివ్గా ఉంది</translation> <translation id="1538801903729528855">వెబ్లో మెరుగైన వాయిస్ అనుభవాన్ని పొందండి</translation> -<translation id="1543538514740974167">ఇక్కడకు త్వరగా చేరుకోండి</translation> <translation id="1544826120773021464">మీ Google ఖాతాను నిర్వహించడానికి, "ఖాతాను నిర్వహించు" బటన్ను నొక్కండి</translation> <translation id="1549000191223877751">వేరే విండోకు తరలించు</translation> <translation id="1553358976309200471">Chromeని నవీకరించు</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">సైట్లు</translation> <translation id="4594952190837476234">ఈ ఆఫ్లైన్ పేజీ <ph name="CREATION_TIME" />కి చెందినది మరియు ఆన్లైన్ వెర్షన్ వేరుగా ఉండవచ్చు.</translation> <translation id="4605958867780575332">ఈ అంశం తీసివేయబడింది: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">తర్వాత కోసం పేజీలను సేవ్ చేసి, ఒక రిమైండర్ను పొందండి</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" />ని తెరువు</translation> <translation id="4634124774493850572">పాస్వర్డ్ను ఉపయోగించు</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 చోరీకి గురైన పాస్వర్డ్}other{# చోరీకి గురైన పాస్వర్డ్లు}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> రీస్టోర్ చేయబడింది</translation> <translation id="7029809446516969842">పాస్వర్డ్లు</translation> <translation id="7030675613184250187">మీ చదివే జాబితాకు పేజీలను సేవ్ చేయడం ద్వారా మీరు వాటిని మళ్లీ చూడగలరు లేదా ఆఫ్లైన్లో చదవగలరు.</translation> -<translation id="703523980599857277">హోమ్ పేజీని మార్చు</translation> <translation id="7054588988317389591">ఇమేజ్ వివరణలను పొందాలనుకుంటున్నారా?</translation> <translation id="7055152154916055070">మళ్లింపు బ్లాక్ చేయబడింది:</translation> <translation id="7063006564040364415">సింక్ సర్వర్కు కనెక్ట్ చేయడం సాధ్యపడలేదు.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome అప్డేట్ చేసి ఉంది</translation> <translation id="7106762743910369165">మీ బ్రౌజర్ మీ సంస్థ ద్వారా మేనేజ్ చేయబడుతుంది</translation> <translation id="7121362699166175603">చిరునామా బార్లో చరిత్ర, స్వీయపూరింపులను తొలగిస్తుంది. మీ Google ఖాతా <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />లో ఇతర రూపాల్లో ఉన్న బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation> -<translation id="7128355412245153445">మీరు హోమ్ బటన్ను ట్యాప్ చేసినప్పుడల్లా మీ టాప్ సైట్లు, ఇటీవలి కథనాలను చూస్తారు</translation> <translation id="7138678301420049075">ఇతర</translation> <translation id="7146622961999026732">ఈ సైట్లు, యాప్లు మీకు ముఖ్యమైనవిగా అనిపిస్తున్నాయి:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> నుండి <ph name="BEGIN_LINK" />అసలైన పేజీని లోడ్ చేయండి<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" />ను ఎంచుకోండి\n2. “ఎల్లప్పుడూ”ను ట్యాప్ చేయండి</translation> <translation id="8410695015584479363">ధరలను ట్రాక్ చేయండి</translation> <translation id="8413126021676339697">పూర్తి చరిత్రను చూపించు</translation> -<translation id="8425213833346101688">మార్చు</translation> <translation id="8427875596167638501">ప్రివ్యూ ట్యాబ్ సగం తెరవబడింది</translation> <translation id="8428213095426709021">సెట్టింగ్లు</translation> <translation id="8438566539970814960">సెర్చ్లను, బ్రౌజింగ్ను మెరుగుపరచండి</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">డిజిటల్ సంక్షేమం నుండి మీ Chrome కార్యకలాపాన్ని తీసివేస్తుంది</translation> <translation id="927968626442779827">Google Chromeలోని లైట్ మోడ్ను ఉపయోగించండి</translation> <translation id="932327136139879170">హోమ్</translation> -<translation id="93753284658583800">హోమ్ పేజీ మార్చబడింది</translation> <translation id="938850635132480979">ఎర్రర్: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">రహస్య పదబంధాన్ని నమోదు చేయండి</translation> <translation id="948039501338975565">బుక్మార్క్ ఫోల్డర్ల లిస్ట్</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index 6b37e508..26709d8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">เปิดการซิงค์เพื่อซิงค์และปรับเปลี่ยนข้อมูลตามความต้องการในอุปกรณ์ทุกเครื่อง</translation> <translation id="1209206284964581585">ซ่อนไปก่อน</translation> <translation id="1227058898775614466">ประวัติการนำทาง</translation> -<translation id="1229399675748764149">ทำให้หน้านี้เป็นหน้าแรก</translation> <translation id="1231733316453485619">เปิดการซิงค์ไหม</translation> <translation id="123724288017357924">โหลดหน้าปัจจุบันซ้ำ โดยไม่คำนึงถึงเนื้อหาที่แคชไว้</translation> <translation id="124678866338384709">ปิดแท็บปัจจุบัน</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">ลบรหัสผ่าน</translation> <translation id="1521774566618522728">ใช้งานวันนี้</translation> <translation id="1538801903729528855">รับประสบการณ์ใช้งานด้วยเสียงที่ดียิ่งขึ้นบนเว็บ</translation> -<translation id="1543538514740974167">มาที่นี่ได้เร็วขึ้น</translation> <translation id="1544826120773021464">หากต้องการจัดการบัญชี Google ให้แตะปุ่ม "จัดการบัญชี"</translation> <translation id="1549000191223877751">ย้ายไปยังหน้าต่างอื่น</translation> <translation id="1553358976309200471">อัปเดต Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">เว็บไซต์</translation> <translation id="4594952190837476234">หน้าเว็บออฟไลน์นี้สร้างเมื่อวันที่ <ph name="CREATION_TIME" /> และอาจแตกต่างไปจากเวอร์ชันออนไลน์</translation> <translation id="4605958867780575332">รายการที่นำออก: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">บันทึกหน้าไว้ใช้ในภายหลังและรับการช่วยเตือน</translation> <translation id="4616150815774728855">เปิด <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">ใช้รหัสผ่าน</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{มีรหัสผ่านที่ถูกละเมิด 1 รายการ}other{มีรหัสผ่านที่ถูกละเมิด # รายการ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">คืนค่า <ph name="ITEM_TITLE" /> แล้ว</translation> <translation id="7029809446516969842">รหัสผ่าน</translation> <translation id="7030675613184250187">คุณบันทึกหน้าในเรื่องรออ่านเพื่อให้หาเจออีกครั้งหรืออ่านแบบออฟไลน์ได้</translation> -<translation id="703523980599857277">เปลี่ยนหน้าแรก</translation> <translation id="7054588988317389591">รับคำอธิบายรูปภาพใช่ไหม</translation> <translation id="7055152154916055070">การเปลี่ยนเส้นทางถูกบล็อก</translation> <translation id="7063006564040364415">ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์การซิงค์</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome เป็นเวอร์ชันล่าสุดแล้ว</translation> <translation id="7106762743910369165">เบราว์เซอร์ได้รับการจัดการโดยองค์กรของคุณ</translation> <translation id="7121362699166175603">ล้างประวัติการเข้าชมและการเติมข้อความอัตโนมัติในแถบที่อยู่เว็บ บัญชี Google อาจมีประวัติการท่องเว็บรูปแบบอื่นๆ ที่ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /></translation> -<translation id="7128355412245153445">ดูเว็บไซต์ยอดนิยมและเรื่องราวล่าสุดได้ทุกเมื่อที่แตะปุ่มหน้าแรก</translation> <translation id="7138678301420049075">อื่นๆ</translation> <translation id="7146622961999026732">ดูเหมือนว่าเว็บไซต์และแอปต่อไปนี้จะสำคัญกับคุณ</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />โหลดหน้าต้นฉบับ<ph name="END_LINK" />จาก <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. เลือก <ph name="APP_NAME" />\n2. แตะ "ทุกครั้ง"</translation> <translation id="8410695015584479363">ติดตามราคา</translation> <translation id="8413126021676339697">แสดงประวัติการเข้าชมทั้งหมด</translation> -<translation id="8425213833346101688">เปลี่ยน</translation> <translation id="8427875596167638501">แท็บแสดงตัวอย่างเปิดอยู่ครึ่งเดียว</translation> <translation id="8428213095426709021">การตั้งค่า</translation> <translation id="8438566539970814960">ปรับปรุงการค้นหาและการท่องเว็บให้ดียิ่งขึ้น</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">นำกิจกรรม Chrome ออกจากไลฟ์สไตล์ดิจิทัล</translation> <translation id="927968626442779827">ใช้โหมด Lite ใน Google Chrome</translation> <translation id="932327136139879170">หน้าแรก</translation> -<translation id="93753284658583800">เปลี่ยนหน้าแรกแล้ว</translation> <translation id="938850635132480979">ข้อผิดพลาด: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">ป้อนข้อความรหัสผ่าน</translation> <translation id="948039501338975565">รายการโฟลเดอร์บุ๊กมาร์ก</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index fc26bc1..0ad903a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Cihazlar arasında senkronizasyon ve kişiselleştirme yapmak için senkronizasyonu etkinleştirin</translation> <translation id="1209206284964581585">Şimdilik gizle</translation> <translation id="1227058898775614466">Gezinme geçmişi</translation> -<translation id="1229399675748764149">Bu sayfayı ana sayfanız yapın</translation> <translation id="1231733316453485619">Senkronizasyon açılsın mı?</translation> <translation id="123724288017357924">Önbelleğe alınmış içeriği yoksayarak geçerli sayfayı yeniden yükler</translation> <translation id="124678866338384709">Geçerli sekmeyi kapatır</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Şifreyi sil</translation> <translation id="1521774566618522728">Son etkin olduğu zaman:</translation> <translation id="1538801903729528855">Web'de daha iyi ses deneyimi elde edin</translation> -<translation id="1543538514740974167">Buraya daha hızlı ulaşın</translation> <translation id="1544826120773021464">Google hesabınızı yönetmek için "Hesabı yönet" düğmesine dokunun</translation> <translation id="1549000191223877751">Diğer pencereye git</translation> <translation id="1553358976309200471">Chrome'u güncelle</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Siteler</translation> <translation id="4594952190837476234">Bu çevrimdışı sayfa <ph name="CREATION_TIME" /> tarihli olup web'deki sürümden farklı olabilir.</translation> <translation id="4605958867780575332">Öğe kaldırıldı: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Sayfaları daha sonrası için kaydedip hatırlatıcı alın</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> APK'sını aç</translation> <translation id="4634124774493850572">Şifre kullan</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{Güvenliği ihlal edilmiş 1 şifre}other{Güvenliği ihlal edilmiş # şifre}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> tarihinde geri yüklendi</translation> <translation id="7029809446516969842">Şifreler</translation> <translation id="7030675613184250187">Sayfaları okuma listenize kaydederek daha sonra kolayca bulabilir veya internet bağlantınız olmadığında da okuyabilirsiniz</translation> -<translation id="703523980599857277">Ana sayfayı değiştir</translation> <translation id="7054588988317389591">Resim açıklaması almak istiyor musunuz?</translation> <translation id="7055152154916055070">Yönlendirme engellendi:</translation> <translation id="7063006564040364415">Senkronizasyon sunucusuna bağlanılamadı.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome güncel</translation> <translation id="7106762743910369165">Tarayıcınız, kuruluşunuz tarafından yönetilmektedir</translation> <translation id="7121362699166175603">Geçmişi ve adres çubuğundaki otomatik tamamlamaları temizler. Google Hesabınızın <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> adresinde başka biçimlerde tarama geçmişi olabilir.</translation> -<translation id="7128355412245153445">Ana sayfa düğmesine her dokunduğunuzda popüler sitelerinizi ve son haberleri görün</translation> <translation id="7138678301420049075">Diğer</translation> <translation id="7146622961999026732">Bu siteler ve uygulamalar sizin için önemli görünüyor:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> alanından <ph name="BEGIN_LINK" />orijinal sayfayı yükle<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> uygulamasını seçin\n2. "Her zaman" seçeneğine dokunun</translation> <translation id="8410695015584479363">Fiyatları takip et</translation> <translation id="8413126021676339697">Tüm geçmişi göster</translation> -<translation id="8425213833346101688">Değiştir</translation> <translation id="8427875596167638501">Önizleme sekmesi yarım açık</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8438566539970814960">Aramaları ve göz atmayı daha iyi yap</translation> @@ -1133,7 +1127,7 @@ <translation id="8798449543960971550">Okunanlar</translation> <translation id="8812260976093120287">Bazı web sitelerinde, yukarıdaki desteklenen ödeme uygulamalarıyla cihazınızdan ödeme yapabilirsiniz.</translation> <translation id="881688628773363275">Önizleme sekmesinin içeriği görüntülenemiyor.</translation> -<translation id="8820817407110198400">Favoriler</translation> +<translation id="8820817407110198400">Yer işaretleri</translation> <translation id="883806473910249246">İçerik indirilirken bir hata oluştu.</translation> <translation id="8840953339110955557">Bu sayfa, web'deki sürümden farklı olabilir.</translation> <translation id="8853345339104747198"><ph name="TAB_TITLE" />, sekme</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome etkinliğinizi Dijital Denge'den kaldırma</translation> <translation id="927968626442779827">Google Chrome'da Basit modu kullanın</translation> <translation id="932327136139879170">Ana Sayfa</translation> -<translation id="93753284658583800">Ana sayfa değişti</translation> <translation id="938850635132480979">Hata: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Parolayı girin</translation> <translation id="948039501338975565">Yer işareti klasörlerinin listesi</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index d1074aa..0edb8d80 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Щоб синхронізувати й персоналізувати дані на пристроях, увімкніть синхронізацію</translation> <translation id="1209206284964581585">Приховати</translation> <translation id="1227058898775614466">Історія навігації</translation> -<translation id="1229399675748764149">Зробіть цю сторінку головною</translation> <translation id="1231733316453485619">Увімкнути синхронізацію?</translation> <translation id="123724288017357924">Оновити цю сторінку, ігноруючи кешований вміст</translation> <translation id="124678866338384709">Закрити поточну вкладку</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Видалити пароль</translation> <translation id="1521774566618522728">У мережі сьогодні</translation> <translation id="1538801903729528855">Кращий голосовий пошук в Інтернеті</translation> -<translation id="1543538514740974167">Відкривайте потрібні сторінки швидше</translation> <translation id="1544826120773021464">Щоб налаштувати обліковий запис Google, натисніть кнопку "Керувати обліковим записом"</translation> <translation id="1549000191223877751">Відкрити в іншому вікні</translation> <translation id="1553358976309200471">Оновити Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Сайти</translation> <translation id="4594952190837476234">Цю сторінку створено <ph name="CREATION_TIME" />. Вона може відрізнятися від онлайн-версії.</translation> <translation id="4605958867780575332">Елемент "<ph name="ITEM_TITLE" />" вилучено</translation> -<translation id="4614535611158687827">Зберігайте сторінки на пізніше й отримуйте нагадування</translation> <translation id="4616150815774728855">Відкрити файл <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Прийняти пароль</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 зламаний пароль}one{# зламаний пароль}few{# зламані паролі}many{# зламаних паролів}other{# зламаного пароля}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Відновлено об'єкт "<ph name="ITEM_TITLE" />"</translation> <translation id="7029809446516969842">Паролі</translation> <translation id="7030675613184250187">Додайте сторінку в список читання, щоб переглянути її в режимі офлайн або відвідати пізніше</translation> -<translation id="703523980599857277">Змінити головну сторінку</translation> <translation id="7054588988317389591">Отримувати описи зображень?</translation> <translation id="7055152154916055070">Переадресацію заблоковано:</translation> <translation id="7063006564040364415">Не вдалося з’єднатись із сервером синхронізації.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome оновлено</translation> <translation id="7106762743910369165">Ваша організація керує веб-переглядачем</translation> <translation id="7121362699166175603">Видалення історії й варіантів автозавершень в адресному рядку. Історія веб-перегляду може також зберігатися у вашому обліковому записі Google на сторінці <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Переглядайте улюблені сайти й нещодавні історії щоразу, коли натискаєте кнопку головного екрана</translation> <translation id="7138678301420049075">Інше</translation> <translation id="7146622961999026732">Схоже, ці сайти й додатки є важливими для вас:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Завантажити оригінальну сторінку<ph name="END_LINK" /> з домену <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Виберіть <ph name="APP_NAME" />\n2. Натисніть "Завжди".</translation> <translation id="8410695015584479363">Відстежувати ціни</translation> <translation id="8413126021676339697">Показати повну історію</translation> -<translation id="8425213833346101688">Змінити</translation> <translation id="8427875596167638501">Вкладку "Попередній перегляд" відкрито на половину висоти</translation> <translation id="8428213095426709021">Налаштування</translation> <translation id="8438566539970814960">Покращувати пошук і веб-перегляд</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Видалити активність у Chrome із Цифрового добробуту</translation> <translation id="927968626442779827">Користуйтеся спрощеним режимом у Google Chrome</translation> <translation id="932327136139879170">Домашня сторінка</translation> -<translation id="93753284658583800">Головну сторінку змінено</translation> <translation id="938850635132480979">Помилка: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Ввести парольну фразу</translation> <translation id="948039501338975565">Список папок із закладками</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 41c5e8f..b2935e76 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">سبھی آلات پر سِنک کرنے اور ذاتی نوعیت سازی کیلئے، سِنک کو آن کریں</translation> <translation id="1209206284964581585">ابھی کیلئے چھپائیں</translation> <translation id="1227058898775614466">نیویگیشن کی تاریخ</translation> -<translation id="1229399675748764149">اس صفحہ کو اپنا ہوم صفحہ بنائیں</translation> <translation id="1231733316453485619">مطابقت پذیری آن کریں؟</translation> <translation id="123724288017357924">کیش کردہ مواد نظر انداز کرکے موجودہ صفحہ پھر لوڈ کریں</translation> <translation id="124678866338384709">موجودہ ٹیب بند کریں</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">پاس ورڈ حذف کریں</translation> <translation id="1521774566618522728">آج فعال کیا گیا</translation> <translation id="1538801903729528855">ویب پر ایک بہتر صوتی تجربہ حاصل کریں</translation> -<translation id="1543538514740974167">یہاں تیزی سے پہنچیں</translation> <translation id="1544826120773021464">اپنے Google اکاؤنٹ کا نظم کرنے کے لیے، "اکاؤنٹ کا نظم کریں" بٹن پر تھپتھپائیں</translation> <translation id="1549000191223877751">دوسری ونڈو پر جائیں</translation> <translation id="1553358976309200471">Chrome کو اپ ڈیٹ کریں</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">سائٹیں</translation> <translation id="4594952190837476234">یہ آف لائن صفحہ <ph name="CREATION_TIME" /> کا ہے اور آن لائن ورژن سے مختلف ہو سکتا ہے۔</translation> <translation id="4605958867780575332">آئٹم ہٹا دیا گیا: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">بعد کے لئے صفحات کو محفوظ کریں اور یاد دہانی حاصل کریں</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> کو کھولیں</translation> <translation id="4634124774493850572">پاس ورڈ استعمال کریں</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 متاثرہ پاس ورڈ}other{# متاثرہ پاس ورڈز}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705"><ph name="ITEM_TITLE" /> کو بحال کیا گیا</translation> <translation id="7029809446516969842">پاس ورڈز</translation> <translation id="7030675613184250187">آپ صفحات کو دوبارہ تلاش کرنے یا آف لائن پڑھنے کیلئے اپنی پڑھنے کی فہرست میں محفوظ کر سکتے ہیں</translation> -<translation id="703523980599857277">ہوم صفحہ تبدیل کریں</translation> <translation id="7054588988317389591">تصویری تفصیلات حاصل کریں؟</translation> <translation id="7055152154916055070">ری ڈائریکٹ مسدود کیا گیا:</translation> <translation id="7063006564040364415">مطابقت پذیری سرور سے منسلک نہیں کیا جا سکا۔</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome اپ ٹو ڈیٹ ہے</translation> <translation id="7106762743910369165">آپ کا براؤزر آپ کی تنظیم کے زیر انتظام ہے</translation> <translation id="7121362699166175603">پتہ بار میں موجود سرگزشت اور خودکار تکمیلات کو صاف کر دیتا ہے۔ ممکن ہے کہ <ph name="BEGIN_LINK" />myactivity.google<ph name="END_LINK" /> پر آپ کے Google اکاؤنٹ میں براؤزنگ کی سرگزشت کی دیگر شکلیں موجود ہوں۔</translation> -<translation id="7128355412245153445">جب بھی آپ ہوم بٹن پر تھپتھپائیں تو اپنی سر فہرست سائٹس اور حالیہ کہانیاں دیکھیں</translation> <translation id="7138678301420049075">دوسرا</translation> <translation id="7146622961999026732">یہ سائٹیں اور ایپس آپ کے لیے اہم معلوم ہوتی ہیں:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> سے <ph name="BEGIN_LINK" />اصل صفحہ لوڈ کریں<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1۔ <ph name="APP_NAME" /> منتخب کریں\n2۔ "ہمیشہ" پر تھپتھپائیں</translation> <translation id="8410695015584479363">قیمتیں ٹریک کریں</translation> <translation id="8413126021676339697">مکمل سرگزشت دکھائیں</translation> -<translation id="8425213833346101688">تبدیل کریں</translation> <translation id="8427875596167638501">پیش منظر ٹیب آدھا کھلا ہے</translation> <translation id="8428213095426709021">ترتیبات</translation> <translation id="8438566539970814960">تلاشوں اور براؤزنگ کو بہتر بنائیں</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">ڈیجیٹل فلاح و بہبود سے اپنی Chrome کی سرگرمی ہٹائیں</translation> <translation id="927968626442779827">Google Chrome پر لائٹ موڈ کا استعمال کریں</translation> <translation id="932327136139879170">ھوم</translation> -<translation id="93753284658583800">ہوم صفحہ کو تبدیل کر دیا گیا</translation> <translation id="938850635132480979">خرابی: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">پاس فریز درج کریں</translation> <translation id="948039501338975565">بُک مارک فولڈرز کی فہرست</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 27147d3e..e1760e3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Barcha qurilmalarda sinxronlash va o‘zingizga moslash uchun sinxronizatsiyani yoqing</translation> <translation id="1209206284964581585">Berkitish</translation> <translation id="1227058898775614466">Sahifalar tarixi</translation> -<translation id="1229399675748764149">Bu sahifani asosiy qilib belgilang</translation> <translation id="1231733316453485619">Sinxronizatsiya yoqilsinmi?</translation> <translation id="123724288017357924">Keshga yuklangan ma’lumotlarsiz sahifani qayta yuklang.</translation> <translation id="124678866338384709">Joriy varaqni yopish</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Parolni o‘chirish</translation> <translation id="1521774566618522728">Bugun onlayn edi</translation> <translation id="1538801903729528855">Internetdagi axborotlarni ovoz bilan oling</translation> -<translation id="1543538514740974167">Tezkor kirish</translation> <translation id="1544826120773021464">Google hisobingizni boshqarish uchun “Hisobni boshqarish” tugmasini bosing</translation> <translation id="1549000191223877751">Boshqa oynaga o‘tkazish</translation> <translation id="1553358976309200471">Chrome‘ni yangilash</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Sites</translation> <translation id="4594952190837476234">Bu sahifa saytning <ph name="CREATION_TIME" /> kunidagi nusxasi va onlayn versiyasidan farq qilishi mumkin.</translation> <translation id="4605958867780575332">Olib tashlangan element: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Sahifalarni saqlab qolish va keyinroq eslatish</translation> <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> veb-ilovasini ochish</translation> <translation id="4634124774493850572">Paroldan foydalanish</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 ta parol oshkor etilgan}other{# ta parol oshkor etilgan}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Tiklandi: <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Parollar</translation> <translation id="7030675613184250187">Sahifalarni Mutolaa roʻyxatiga saqlash va keyinroq oflayn oʻqish mumkin</translation> -<translation id="703523980599857277">Bosh sahifani oʻzgartirish</translation> <translation id="7054588988317389591">Rasm tavsiflari chiqsinmi?</translation> <translation id="7055152154916055070">Yo‘naltirish bloklandi:</translation> <translation id="7063006564040364415">Sinxronlash serveriga ulanib bo‘lmadi.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome eng oxirgi versiyada</translation> <translation id="7106762743910369165">Brauzeringiz tashkilotingiz boshqaruvida</translation> <translation id="7121362699166175603">Manzil qatoridagi tarix va avto‘ldirishlarni tozalaydi. Google hisobingiz orqali bajargan internetdagi faoliyatingizni <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> orqali ko‘rishingiz mumkin.</translation> -<translation id="7128355412245153445">Eng sara saytlar va yangi maqolalarni koʻrish uchun bosh sahifa tugmasini bosishingiz kifoya.</translation> <translation id="7138678301420049075">Boshqa</translation> <translation id="7146622961999026732">Bu sayt va ilovalar siz uchun muhimga oʻxshaydi:</translation> <translation id="7149158118503947153"><ph name="DOMAIN_NAME" /> domenidagi <ph name="BEGIN_LINK" />asl sahifani yuklash<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. <ph name="APP_NAME" /> ilovasini tanlang\n2. “Har doim” ustiga bosing</translation> <translation id="8410695015584479363">Narxlarni kuzatish</translation> <translation id="8413126021676339697">Barcha tarixni ko‘rsatish</translation> -<translation id="8425213833346101688">O‘zgartirish</translation> <translation id="8427875596167638501">Razm solish sahifasi yarim hajmda ochildi</translation> <translation id="8428213095426709021">Sozlamalar</translation> <translation id="8438566539970814960">Sahifalarni kezish va qidiruvni yaxshilash</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Chrome amallarini Raqamli qulaylikdan olib tashlash</translation> <translation id="927968626442779827">Google Chrome brauzerida Lite rejimidan foydalanish</translation> <translation id="932327136139879170">Bosh sahifa</translation> -<translation id="93753284658583800">Bosh sahifa oʻzgartirildi</translation> <translation id="938850635132480979">Xato: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Kodli iborani kiriting</translation> <translation id="948039501338975565">Bukmark jildlari roʻyxati</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 822628c1..dd0bcc5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Để đồng bộ hóa và cá nhân hóa trên các thiết bị, hãy bật tính năng đồng bộ hóa</translation> <translation id="1209206284964581585">Ẩn ngay bây giờ</translation> <translation id="1227058898775614466">Lịch sử di chuyển</translation> -<translation id="1229399675748764149">Đặt trang này làm trang chủ</translation> <translation id="1231733316453485619">Bạn muốn bật tính năng đồng bộ hóa?</translation> <translation id="123724288017357924">Tải lại trang hiện tại, bỏ qua nội dung được lưu trong bộ nhớ đệm</translation> <translation id="124678866338384709">Đóng thẻ hiện tại</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Xóa mật khẩu</translation> <translation id="1521774566618522728">Hoạt động hôm nay</translation> <translation id="1538801903729528855">Cải thiện trải nghiệm nhập liệu bằng giọng nói trên web</translation> -<translation id="1543538514740974167">Truy cập vào trang này nhanh hơn</translation> <translation id="1544826120773021464">Để quản lý Tài khoản Google của bạn, hãy nhấn vào nút "Quản lý tài khoản"</translation> <translation id="1549000191223877751">Di chuyển đến cửa sổ khác</translation> <translation id="1553358976309200471">Cập nhật Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Trang web</translation> <translation id="4594952190837476234">Trang ngoại tuyến này được tạo từ lúc <ph name="CREATION_TIME" /> và có thể khác với phiên bản trực tuyến.</translation> <translation id="4605958867780575332">Đã xóa mục: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Lưu các trang để đọc sau và nhận lời nhắc</translation> <translation id="4616150815774728855">Mở <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Sử dụng mật khẩu</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 mật khẩu bị lộ}other{# mật khẩu bị lộ}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Đã khôi phục <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Mật khẩu</translation> <translation id="7030675613184250187">Bạn có thể lưu các trang vào danh sách đọc để tìm lại hoặc đọc khi không có mạng</translation> -<translation id="703523980599857277">Thay đổi trang chủ</translation> <translation id="7054588988317389591">Tải nội dung mô tả hình ảnh?</translation> <translation id="7055152154916055070">Liên kết chuyển hướng đã chặn:</translation> <translation id="7063006564040364415">Không thể kết nối với máy chủ đồng bộ hóa.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome đã được cập nhật</translation> <translation id="7106762743910369165">Tổ chức của bạn quản lý trình duyệt này</translation> <translation id="7121362699166175603">Xóa lịch sử duyệt web và nội dung tự động hoàn thành trong thanh địa chỉ. Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác tại <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Xem các trang web hàng đầu và những tin gần đây bất cứ khi nào bạn nhấn vào nút Trang chủ</translation> <translation id="7138678301420049075">Khác</translation> <translation id="7146622961999026732">Các trang web và ứng dụng này có vẻ quan trọng đối với bạn:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Tải trang gốc<ph name="END_LINK" /> từ <ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Chọn <ph name="APP_NAME" />\n2. Nhấn vào "Luôn chọn"</translation> <translation id="8410695015584479363">Theo dõi giá</translation> <translation id="8413126021676339697">Hiển thị toàn bộ lịch sử</translation> -<translation id="8425213833346101688">Thay đổi</translation> <translation id="8427875596167638501">Thẻ xem trước đang mở trên nửa màn hình</translation> <translation id="8428213095426709021">Cài đặt</translation> <translation id="8438566539970814960">Cải thiện tính năng tìm kiếm và duyệt web</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Xóa hoạt động của bạn trên Chrome khỏi Digital Wellbeing</translation> <translation id="927968626442779827">Dùng Chế độ thu gọn trên Google Chrome</translation> <translation id="932327136139879170">Trang chủ</translation> -<translation id="93753284658583800">Trang chủ đã thay đổi</translation> <translation id="938850635132480979">Lỗi: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Nhập cụm mật khẩu</translation> <translation id="948039501338975565">Danh sách thư mục dấu trang</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 695bcec..00267a6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -2,11 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> <translation id="1028699632127661925">正在发送到<ph name="DEVICE_NAME" />…</translation> -<translation id="103269572468856066">一并清除以下网站和应用内的数据?</translation> +<translation id="103269572468856066">一并清除来自这些网站和应用的数据?</translation> <translation id="1036348656032585052">关闭</translation> <translation id="1036727731225946849">正在添加<ph name="WEBAPK_NAME" />…</translation> <translation id="1041308826830691739">来自网站</translation> -<translation id="1045899828449635435">一并清除以下网站内的数据?</translation> +<translation id="1045899828449635435">一并清除来自这些网站的数据?</translation> <translation id="1047303875618851375">Chrome 无法验证您的信息</translation> <translation id="1049743911850919806">无痕</translation> <translation id="10614374240317010">一律不保存</translation> @@ -34,10 +34,9 @@ <translation id="1201402288615127009">下一步</translation> <translation id="1204037785786432551">下载链接</translation> <translation id="1206892813135768548">复制链接文字</translation> -<translation id="1208340532756947324">要在您的所有设备上保持同步并进行个性化设置,请开启同步功能</translation> +<translation id="1208340532756947324">要在您的所有设备上保持同步并获享个性化体验,请开启同步功能</translation> <translation id="1209206284964581585">暂时隐藏</translation> <translation id="1227058898775614466">导航历史记录</translation> -<translation id="1229399675748764149">将此页面设为您的主页</translation> <translation id="1231733316453485619">开启同步功能?</translation> <translation id="123724288017357924">重新加载当前网页(忽略缓存的内容)</translation> <translation id="124678866338384709">关闭当前标签页</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">删除密码</translation> <translation id="1521774566618522728">今天曾有活动</translation> <translation id="1538801903729528855">在网络上畅享更佳的语音使用体验</translation> -<translation id="1543538514740974167">更快速地转到此处</translation> <translation id="1544826120773021464">要管理您的 Google 帐号,请点按“管理帐号”按钮</translation> <translation id="1549000191223877751">移至其他窗口</translation> <translation id="1553358976309200471">更新 Chrome</translation> @@ -142,7 +140,7 @@ <translation id="2002537628803770967">Google Pay 中存储的信用卡和地址信息</translation> <translation id="2010780124464321179">无法为所选文本创建链接。请改为分享页面链接。</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# 个文件}other{# 个文件}}</translation> -<translation id="2017836877785168846">清除历史记录和地址栏中的自动填充项。</translation> +<translation id="2017836877785168846">清除历史记录和地址栏中的自动补全项。</translation> <translation id="2021896219286479412">全屏网站控件</translation> <translation id="2038563949887743358">开启“请求切换到桌面版网站”</translation> <translation id="204321170514947529">Chrome 中也有<ph name="APP_NAME" />的数据</translation> @@ -153,7 +151,7 @@ <translation id="2068748236079642969">观看下一个视频</translation> <translation id="2074143993849053708">针对 Google 助理语音搜索功能的用户意见征求界面已关闭</translation> <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 条结果,共 <ph name="TOTAL_RESULTS" /> 条</translation> -<translation id="2096012225669085171">在所有设备上保持同步并进行个性化设置</translation> +<translation id="2096012225669085171">在所有设备上保持同步,获享个性化体验</translation> <translation id="2100273922101894616">自动登录</translation> <translation id="2100314319871056947">请尝试使用较小的文本块进行分享</translation> <translation id="2109711654079915747">无需离开所在页面,便可了解网站上的主题。“触摸搜索”功能会将被触摸的字词及上下文一起发送给 Google 搜索,后者随即会据此返回相应的定义、图片、搜索结果及其他详情。 @@ -298,7 +296,7 @@ <translation id="3058498974290601450">您随时可在“设置”中开启同步功能</translation> <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> 个书签}other{<ph name="BOOKMARKS_COUNT_MANY" /> 个书签}}</translation> <translation id="3062802207422175757">Chrome 可提供您感兴趣的报道</translation> -<translation id="3089395242580810162">在无痕模式标签页中打开</translation> +<translation id="3089395242580810162">在无痕式标签页中打开</translation> <translation id="3098745985164956033">系统会将部分图片发送给 Google 以便为您改进说明</translation> <translation id="3114507951000454849">阅读今日新闻 <ph name="NEWS_ICON" /></translation> <translation id="3123734510202723619">通告</translation> @@ -385,7 +383,7 @@ <translation id="3716182511346448902">此网页占用的内存过多,因此 Chrome 已将其暂停。</translation> <translation id="3721119614952978349">您与 Google</translation> <translation id="3737319253362202215">翻译设置</translation> -<translation id="3738139272394829648">触摸搜索</translation> +<translation id="3738139272394829648">点按即可搜索</translation> <translation id="3739899004075612870">已在 <ph name="PRODUCT_NAME" /> 中添加书签</translation> <translation id="3749259744154402564">不支持</translation> <translation id="3771001275138982843">无法下载此项更新</translation> @@ -474,7 +472,7 @@ <translation id="4440958355523780886">由 Google 提供的精简版网页。点按即可加载原始网页。</translation> <translation id="4452411734226507615">关闭“<ph name="TAB_TITLE" />”标签页</translation> <translation id="4452548195519783679">已将书签添加到“<ph name="FOLDER_NAME" />”</translation> -<translation id="4472118726404937099">要在您的所有设备上保持同步并进行个性化设置,请登录您的帐号并开启同步功能</translation> +<translation id="4472118726404937099">要在您的所有设备上保持同步并获享个性化体验,请登录您的帐号并开启同步功能</translation> <translation id="447252321002412580">帮助我们改进 Chrome 的功能和性能</translation> <translation id="4479972344484327217">正在为 Chrome 安装<ph name="MODULE" />…</translation> <translation id="4487967297491345095">Chrome 的所有应用数据都将被永久删除,其中包括所有文件、设置、帐号、数据库等。</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">网站</translation> <translation id="4594952190837476234">此离线网页是在 <ph name="CREATION_TIME" />创建的,可能与在线版本有所不同。</translation> <translation id="4605958867780575332">以下项已移除:<ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">保存页面以供日后阅读并接收提醒</translation> <translation id="4616150815774728855">打开<ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">使用密码</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{有 1 个密码已遭泄露}other{有 # 个密码已遭泄露}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">“<ph name="ITEM_TITLE" />”已恢复</translation> <translation id="7029809446516969842">密码</translation> <translation id="7030675613184250187">您可以将所需网页保存到阅读清单中,以便再次查看或离线阅读</translation> -<translation id="703523980599857277">更改主页</translation> <translation id="7054588988317389591">获取图片说明?</translation> <translation id="7055152154916055070">已禁止重定向:</translation> <translation id="7063006564040364415">无法连接到同步服务器。</translation> @@ -887,8 +883,7 @@ <translation id="7080806333218412752">会将网址发送给“安全浏览”功能进行检查。还会发送网页、下载内容、扩展程序活动和系统信息的少量样本,以帮助发现新威胁。而且,会在您登录后暂时将这些数据关联到您的 Google 帐号,以便在各个 Google 应用中为您提供保护。</translation> <translation id="7088681679121566888">Chrome 已是最新版本</translation> <translation id="7106762743910369165">您的浏览器由贵单位管理</translation> -<translation id="7121362699166175603">清除历史记录和地址栏中的自动填充项。您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的浏览记录。</translation> -<translation id="7128355412245153445">只需点击“主页”按钮,即可查看您所在国家/地区的热门网站和近期报道</translation> +<translation id="7121362699166175603">清除历史记录和地址栏中的自动补全项。您的 Google 帐号在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的浏览记录。</translation> <translation id="7138678301420049075">其他</translation> <translation id="7146622961999026732">这些网站和应用似乎对您很重要:</translation> <translation id="7149158118503947153">从 <ph name="DOMAIN_NAME" /> <ph name="BEGIN_LINK" />加载原始网页<ph name="END_LINK" /></translation> @@ -924,7 +919,7 @@ <translation id="7396940094317457632"><ph name="FILE_NAME" />。</translation> <translation id="7400418766976504921">网址</translation> <translation id="7403691278183511381">Chrome 首次运行体验</translation> -<translation id="741204030948306876">立即启用</translation> +<translation id="741204030948306876">立即开启</translation> <translation id="7413229368719586778">开始日期:<ph name="DATE" /></translation> <translation id="7416941666639889592">加入 Web Crowd 即表示,您允许网站在不使用个人身份信息的情况下为您提供贴合需求的网络体验。Web Crowd 与音乐会中的人群类似,网站和广告主只会知道数千名用户有相似的兴趣。</translation> <translation id="7431991332293347422">控制 Google 如何利用您的浏览记录为您提供个性化的 Google 搜索和其他 Google 服务</translation> @@ -972,9 +967,9 @@ <translation id="766587987807204883">报道会显示在此处,即使在离线状态下也可以阅读</translation> <translation id="7682724950699840886">请尝试按以下提示操作:确保您的设备上有足够的空间,然后重新尝试导出。</translation> <translation id="7698359219371678927">在 <ph name="APP_NAME" /> 中创建电子邮件</translation> -<translation id="7704317875155739195">自动填充搜索字词和网址</translation> +<translation id="7704317875155739195">自动补全搜索字词和网址</translation> <translation id="7707922173985738739">使用移动数据</translation> -<translation id="7725024127233776428">您添加书签的网页会显示在此处</translation> +<translation id="7725024127233776428">您添加了书签的网页会显示在此处</translation> <translation id="7735637452482172701">使用“屏幕锁定”功能解锁</translation> <translation id="7746457520633464754">为了检测危险应用和网站,Chrome 会将您所访问的部分网页的网址、有限的系统信息以及部分网页内容发送给 Google</translation> <translation id="7757787379047923882">分享自“<ph name="DEVICE_NAME" />”的文字</translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. 选择 <ph name="APP_NAME" />\n2. 点按“始终”</translation> <translation id="8410695015584479363">跟踪价格</translation> <translation id="8413126021676339697">显示全部历史记录</translation> -<translation id="8425213833346101688">更改</translation> <translation id="8427875596167638501">预览标签页已在下半屏中打开</translation> <translation id="8428213095426709021">设置</translation> <translation id="8438566539970814960">改善搜索和浏览体验</translation> @@ -1106,7 +1100,7 @@ <translation id="8561196567344536112">1. 转到“设置”\n2. 点按“浏览器应用”\n3. 选择 <ph name="APP_NAME" /></translation> <translation id="8562452229998620586">已保存的密码将显示在这里。</translation> <translation id="8569404424186215731">自 <ph name="DATE" />以来</translation> -<translation id="8571213806525832805">近 4 周</translation> +<translation id="8571213806525832805">过去 4 周</translation> <translation id="8572344201470131220">图片已复制</translation> <translation id="8583805026567836021">清除帐号数据</translation> <translation id="8587585930972369234">轻触并按住即可搜索</translation> @@ -1118,7 +1112,7 @@ <translation id="8655129584991699539">要清除数据,请前往 Chrome 的“设置”页面</translation> <translation id="8656747343598256512">使用您的 Google 帐号登录此网站和 Chrome。您可等到需要时再开启同步功能。</translation> <translation id="8659579665266920523">如何使用 Chrome 进行搜索</translation> -<translation id="8662811608048051533">您会从大多数网站退出。</translation> +<translation id="8662811608048051533">会致使您从大多数网站退出。</translation> <translation id="8664979001105139458">文件名已存在</translation> <translation id="8683039184091909753">图片</translation> <translation id="8687353297350450808">{N_BARS,plural, =1{信号强度:# 格}other{信号强度:# 格}}</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">从“数字健康”应用中移除您的 Chrome 活动记录</translation> <translation id="927968626442779827">使用 Google Chrome 的精简模式</translation> <translation id="932327136139879170">首页</translation> -<translation id="93753284658583800">主页已更改</translation> <translation id="938850635132480979">错误:<ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">请输入密码</translation> <translation id="948039501338975565">书签文件夹列表</translation> @@ -1204,7 +1197,7 @@ <translation id="962979164594783469">安装此应用</translation> <translation id="968900484120156207">您访问的网页会显示在此处</translation> <translation id="970715775301869095">还剩 <ph name="MINUTES" /> 分钟</translation> -<translation id="974555521953189084">输入密码以开始同步</translation> +<translation id="974555521953189084">输入密码即可开始同步</translation> <translation id="981121421437150478">离线</translation> <translation id="983192555821071799">关闭所有标签页</translation> <translation id="987264212798334818">常规</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 702468c..156e5807 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">如要在不同裝置上同步和個人化內容,請開啟同步處理功能</translation> <translation id="1209206284964581585">暫時隱藏</translation> <translation id="1227058898775614466">導覽記錄</translation> -<translation id="1229399675748764149">將此頁面設為首頁</translation> <translation id="1231733316453485619">要開啟同步處理功能嗎?</translation> <translation id="123724288017357924">重新載入目前的網頁,忽略之前快取的內容</translation> <translation id="124678866338384709">關閉目前分頁</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">刪除密碼</translation> <translation id="1521774566618522728">今天已使用</translation> <translation id="1538801903729528855">獲得更佳的網上語音體驗</translation> -<translation id="1543538514740974167">輕輕一按,即時到位</translation> <translation id="1544826120773021464">如要管理 Google 帳戶,請輕按「管理帳戶」按鈕</translation> <translation id="1549000191223877751">移至其他視窗</translation> <translation id="1553358976309200471">更新 Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">網站</translation> <translation id="4594952190837476234">此離線網頁在 <ph name="CREATION_TIME" />建立,且可能與網上版本不同。</translation> <translation id="4605958867780575332">移除咗嘅項目:<ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">將頁面儲存至稍後閱讀,並接收提醒</translation> <translation id="4616150815774728855">開啟 <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">使用密碼</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 個密碼被盜用}other{# 個密碼被盜用}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">還原咗 <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">密碼</translation> <translation id="7030675613184250187">您可將網頁儲存至閱讀清單,以便日後快速瀏覽或離線閱讀</translation> -<translation id="703523980599857277">變更首頁</translation> <translation id="7054588988317389591">要取得圖片說明嗎?</translation> <translation id="7055152154916055070">已禁止重新導向:</translation> <translation id="7063006564040364415">無法連線至同步處理伺服器。</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome 目前是最新版本</translation> <translation id="7106762743910369165">您的瀏覽器由組織管理</translation> <translation id="7121362699166175603">清除記錄和網址列中的自動完成資料。您的 Google 帳戶在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的瀏覽記錄。</translation> -<translation id="7128355412245153445">輕按首頁按鈕,即可隨時查看熱門網站和近期報導</translation> <translation id="7138678301420049075">其他</translation> <translation id="7146622961999026732">這些網站和應用程式似乎對您很重要:</translation> <translation id="7149158118503947153">從 <ph name="DOMAIN_NAME" /> <ph name="BEGIN_LINK" />載入原始網頁<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. 選擇 <ph name="APP_NAME" />\n2. 輕按 [一律採用]</translation> <translation id="8410695015584479363">追蹤價格</translation> <translation id="8413126021676339697">顯示完整記錄</translation> -<translation id="8425213833346101688">變更</translation> <translation id="8427875596167638501">預覽分頁喺畫面下半部分顯示</translation> <translation id="8428213095426709021">設定</translation> <translation id="8438566539970814960">改善搜尋和瀏覽體驗</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">從「健康數碼生活」中移除您的 Chrome 活動記錄</translation> <translation id="927968626442779827">使用 Google Chrome 的「精簡模式」</translation> <translation id="932327136139879170">首頁</translation> -<translation id="93753284658583800">已變更首頁</translation> <translation id="938850635132480979">錯誤:<ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">請輸入複雜密碼</translation> <translation id="948039501338975565">書籤資料夾清單</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index b1347f02..423b2bc8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">如要進行同步處理並在所有裝置上享有個人化的體驗,請開啟同步處理功能</translation> <translation id="1209206284964581585">暫時隱藏</translation> <translation id="1227058898775614466">瀏覽記錄</translation> -<translation id="1229399675748764149">將這個頁面設為首頁</translation> <translation id="1231733316453485619">要開啟同步處理功能嗎?</translation> <translation id="123724288017357924">重新載入目前的網頁,略過已快取的內容</translation> <translation id="124678866338384709">關閉目前的分頁</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">刪除密碼</translation> <translation id="1521774566618522728">上次使用時間:今天</translation> <translation id="1538801903729528855">在網頁上享有更好的語音體驗</translation> -<translation id="1543538514740974167">更快開啟這個頁面</translation> <translation id="1544826120773021464">如要管理你的 Google 帳戶,請輕觸 [管理帳戶] 按鈕</translation> <translation id="1549000191223877751">移至其他視窗</translation> <translation id="1553358976309200471">更新 Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">網站</translation> <translation id="4594952190837476234">這個離線版網頁是於 <ph name="CREATION_TIME" />建立,可能會和線上版本有所不同。</translation> <translation id="4605958867780575332">已移除項目:<ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">儲存頁面以便稍後閱讀並接收提醒</translation> <translation id="4616150815774728855">開啟 <ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">使用密碼</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{有 1 組密碼遭外洩}other{有 # 組密碼遭外洩}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">已還原 <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">密碼</translation> <translation id="7030675613184250187">你可以將頁面儲存至閱讀清單,以便再次查看或離線閱讀</translation> -<translation id="703523980599857277">變更首頁</translation> <translation id="7054588988317389591">要取得圖片說明嗎?</translation> <translation id="7055152154916055070">已禁止重新導向:</translation> <translation id="7063006564040364415">無法連線至同步處理伺服器。</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">Chrome 目前是最新版本</translation> <translation id="7106762743910369165">你的瀏覽器是由貴機構管理</translation> <translation id="7121362699166175603">將歷史記錄和自動即時查詢從網址列中清除。你的 Google 帳戶可能會儲存其他形式的瀏覽記錄,請參閱 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />。</translation> -<translation id="7128355412245153445">只要輕觸首頁按鈕即可查看常用網站和近期報導</translation> <translation id="7138678301420049075">其他</translation> <translation id="7146622961999026732">這些網站和應用程式似乎對你很重要:</translation> <translation id="7149158118503947153">從 <ph name="DOMAIN_NAME" /> <ph name="BEGIN_LINK" />載入原始頁面<ph name="END_LINK" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. 選擇 <ph name="APP_NAME" />\n2. 輕觸 [一律採用]</translation> <translation id="8410695015584479363">追蹤價格</translation> <translation id="8413126021676339697">顯示完整記錄</translation> -<translation id="8425213833346101688">變更</translation> <translation id="8427875596167638501">已在畫面下半部顯示預覽分頁</translation> <translation id="8428213095426709021">設定</translation> <translation id="8438566539970814960">改善搜尋和瀏覽體驗</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">將你的 Chrome 活動記錄從數位健康中移除</translation> <translation id="927968626442779827">使用 Google Chrome 精簡模式</translation> <translation id="932327136139879170">首頁</translation> -<translation id="93753284658583800">已變更首頁</translation> <translation id="938850635132480979">錯誤:<ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">請輸入通關密語</translation> <translation id="948039501338975565">書籤資料夾清單</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 9076438..194ccf4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -37,7 +37,6 @@ <translation id="1208340532756947324">Ukuze uvumelanise uphinde wenze kube ngokwakho kuwo wonkana amadivayisi akho, vula ukuvumelanisa</translation> <translation id="1209206284964581585">Fihla okwamanje</translation> <translation id="1227058898775614466">Umlando wokuzula</translation> -<translation id="1229399675748764149">Yenza lokhu kube ikhasi lakho lasekhaya</translation> <translation id="1231733316453485619">vula ukuvumelanisa?</translation> <translation id="123724288017357924">Phinda ulayishe ikhasi lamanje, iziba okuqukethwe okufakwe kunqolobane</translation> <translation id="124678866338384709">Vala ithebhu yamanje</translation> @@ -79,7 +78,6 @@ <translation id="1513858653616922153">Susa iphasiwedi</translation> <translation id="1521774566618522728">Iyasebenza namhlanje</translation> <translation id="1538801903729528855">Thola umuzwa ongcono wezwi kuwebhu</translation> -<translation id="1543538514740974167">Fika lapha ngokushesha</translation> <translation id="1544826120773021464">Ukuze uphathe i-akhawunti yakho ye-Google, thepha inkinobho "Phatha i-akhawunti"</translation> <translation id="1549000191223877751">Yisa kwelinye iwindi</translation> <translation id="1553358976309200471">Buyekeza i-Chrome</translation> @@ -498,7 +496,6 @@ <translation id="4587589328781138893">Amasayithi</translation> <translation id="4594952190837476234">Leli khasi elingaxhunyiwe kwi-inthanethi livele ngo-<ph name="CREATION_TIME" /> futhi lingahluka kusukela kunguqulo eku-inthanethi.</translation> <translation id="4605958867780575332">Into isusiwe: <ph name="ITEM_TITLE" /></translation> -<translation id="4614535611158687827">Londoloza amakhasi mayelana nokwakamuva bese uthola isikhumbuzi</translation> <translation id="4616150815774728855">Vula i-<ph name="WEBAPK_NAME" /></translation> <translation id="4634124774493850572">Sebenzisa iphasiwedi</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{iphasiwedi eyonakalisiwe e-1}one{amaphasiwedi onakalisiwe angu-#}other{amaphasiwedi onakalisiwe angu-#}}</translation> @@ -877,7 +874,6 @@ <translation id="7027549951530753705">Kubuyisiwe <ph name="ITEM_TITLE" /></translation> <translation id="7029809446516969842">Amaphasiwedi</translation> <translation id="7030675613184250187">Ungalondoloza amakhasi kuhlu lwakho lokufunda ukuze uwathole futhi noma uwafunde ngokungaxhunyiwe ku-inthanethi.</translation> -<translation id="703523980599857277">Shintsha ikhasi lasekhaya</translation> <translation id="7054588988317389591">Thola incazelo yesithombe?</translation> <translation id="7055152154916055070">Ukuqondiswa kabusha kuvinjiwe:</translation> <translation id="7063006564040364415">Ayikwazanga ukuxhumeka kuseva yokuvumelanisa.</translation> @@ -888,7 +884,6 @@ <translation id="7088681679121566888">I-Chrome isesimweni sakamuva</translation> <translation id="7106762743910369165">Isiphequluli sakho siphethwe inhlangano yakho</translation> <translation id="7121362699166175603">Isula umlando nokuqedelelwa okuzenzakalelayo kubha yekheli. I-akhawunti yakho ye-Google ingaba namanye amafomu omlando okuphequlula ku-<ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> -<translation id="7128355412245153445">Bona amasayithi akho aphezulu nezindaba zakamuva noma nini lapho uthepha inkinobho Yasekhaya</translation> <translation id="7138678301420049075">Okunye</translation> <translation id="7146622961999026732">La masayithi nezinhlelo zokusebenza kubonakala kubalulekile kuwe:</translation> <translation id="7149158118503947153"><ph name="BEGIN_LINK" />Layisha ikhasi loqobo<ph name="END_LINK" /> kusuka ku-<ph name="DOMAIN_NAME" /></translation> @@ -1078,7 +1073,6 @@ <translation id="8407396331882458341">1. Khetha i-<ph name="APP_NAME" />\n2. Thepha “Njalo”</translation> <translation id="8410695015584479363">Landelela izintengo</translation> <translation id="8413126021676339697">Bonisa umlando ophelele</translation> -<translation id="8425213833346101688">Guqula</translation> <translation id="8427875596167638501">Ithebhu lokubuka kuqala livulwe ngohhafu</translation> <translation id="8428213095426709021">Izilungiselelo</translation> <translation id="8438566539970814960">Yenza usesho nokuphequlula kube ngcono</translation> @@ -1196,7 +1190,6 @@ <translation id="926205370408745186">Susa umsebenzi wakho we-Chrome kusukela ku-Digital Wellbeing</translation> <translation id="927968626442779827">Sebenzisa Imodi elula ku-Google Chrome</translation> <translation id="932327136139879170">Ikhaya</translation> -<translation id="93753284658583800">Ikhasi lasekhaya lishintshile</translation> <translation id="938850635132480979">Iphutha: <ph name="ERROR_CODE" /></translation> <translation id="939598580284253335">Faka umushwana wokungena</translation> <translation id="948039501338975565">Uhlu lwamafolda ebhukhimakhi</translation>
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc index b442a97..e56f6b9 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc
@@ -199,8 +199,7 @@ base::BindLambdaForTesting( [&](HoldingSpaceItem::Type type, const base::FilePath& path) { return std::make_unique<HoldingSpaceImage>( - path, - /*placeholder=*/gfx::ImageSkia(), + HoldingSpaceImage::GetMaxSizeForType(type), path, /*async_bitmap_resolver=*/base::DoNothing()); }));
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc index 9edf185c0..7143f1ad 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc
@@ -44,8 +44,7 @@ HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, - /*placeholder=*/gfx::ImageSkia(), + HoldingSpaceImage::GetMaxSizeForType(type), file_path, /*async_bitmap_resolver=*/base::DoNothing()); }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_browsertest.cc index fc397d6a2..6d73944 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_browsertest.cc
@@ -243,8 +243,7 @@ base::BindLambdaForTesting([&](HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, - /*placeholder=*/gfx::ImageSkia(), + HoldingSpaceImage::GetMaxSizeForType(type), file_path, /*async_bitmap_resolver=*/base::DoNothing()); }));
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc index f85e84e..2a9c22e 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -69,8 +69,7 @@ HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, - /*placeholder=*/gfx::ImageSkia(), + HoldingSpaceImage::GetMaxSizeForType(type), file_path, /*async_bitmap_resolver=*/base::DoNothing()); } @@ -520,9 +519,9 @@ *holding_space_util::ResolveImage( holding_space_service->thumbnail_loader_for_testing(), HoldingSpaceItem::Type::kScreenshot, item_1_full_path) - ->image_skia() + ->GetImageSkia() .bitmap(), - *item_1->image().image_skia().bitmap())); + *item_1->image().GetImageSkia().bitmap())); // Verify the item file system URL resolves to the correct file in the file // manager's context. EXPECT_EQ(item_1_virtual_path, @@ -536,9 +535,9 @@ *holding_space_util::ResolveImage( holding_space_service->thumbnail_loader_for_testing(), HoldingSpaceItem::Type::kScreenshot, item_2_full_path) - ->image_skia() + ->GetImageSkia() .bitmap(), - *item_2->image().image_skia().bitmap())); + *item_2->image().GetImageSkia().bitmap())); // Verify the item file system URL resolves to the correct file in the file // manager's context. EXPECT_EQ(item_2_virtual_path, @@ -1700,9 +1699,9 @@ *holding_space_util::ResolveImage( holding_space_service->thumbnail_loader_for_testing(), HoldingSpaceItem::Type::kNearbyShare, item_1_full_path) - ->image_skia() + ->GetImageSkia() .bitmap(), - *item_1->image().image_skia().bitmap())); + *item_1->image().GetImageSkia().bitmap())); // Verify the item file system URL resolves to the correct file in the file // manager's context. EXPECT_EQ(item_1_virtual_path, @@ -1716,9 +1715,9 @@ *holding_space_util::ResolveImage( holding_space_service->thumbnail_loader_for_testing(), HoldingSpaceItem::Type::kNearbyShare, item_2_full_path) - ->image_skia() + ->GetImageSkia() .bitmap(), - *item_2->image().image_skia().bitmap())); + *item_2->image().GetImageSkia().bitmap())); // Verify the item file system URL resolves to the correct file in the file // manager's context. EXPECT_EQ(item_2_virtual_path, @@ -1774,9 +1773,9 @@ *holding_space_util::ResolveImage( holding_space_service->thumbnail_loader_for_testing(), HoldingSpaceItem::Type::kScreenRecording, item_1_full_path) - ->image_skia() + ->GetImageSkia() .bitmap(), - *item_1->image().image_skia().bitmap())); + *item_1->image().GetImageSkia().bitmap())); // Verify the item file system URL resolves to the correct file in the file // manager's context. EXPECT_EQ(item_1_virtual_path, @@ -1790,9 +1789,9 @@ *holding_space_util::ResolveImage( holding_space_service->thumbnail_loader_for_testing(), HoldingSpaceItem::Type::kScreenRecording, item_2_full_path) - ->image_skia() + ->GetImageSkia() .bitmap(), - *item_2->image().image_skia().bitmap())); + *item_2->image().GetImageSkia().bitmap())); // Verify the item file system URL resolves to the correct file in the file // manager's context. EXPECT_EQ(item_2_virtual_path,
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.cc b/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.cc index 56d6efb..b6021c9d 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.h" -#include "ash/public/cpp/holding_space/holding_space_color_provider.h" #include "ash/public/cpp/image_downloader.h" #include "base/bind.h" #include "base/callback_helpers.h" @@ -21,8 +20,6 @@ #include "chrome/browser/chromeos/file_manager/fileapi_util.h" #include "chrome/browser/extensions/api/messaging/native_message_port.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/ash/holding_space/holding_space_util.h" -#include "chromeos/ui/vector_icons/vector_icons.h" #include "extensions/browser/api/messaging/channel_endpoint.h" #include "extensions/browser/api/messaging/message_service.h" #include "extensions/browser/api/messaging/native_message_host.h" @@ -35,7 +32,6 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image_skia.h" -#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/skia_util.h" #include "url/gurl.h" @@ -48,9 +44,6 @@ constexpr char kNativeMessageHostName[] = "com.google.holding_space_thumbnail_loader"; -// The DIP size for the folder icon. -const size_t kFolderIconDipSize = 20; - using ThumbnailDataCallback = base::OnceCallback<void(const std::string& data)>; // Handles a parsed message sent from image loader extension in response to a @@ -153,7 +146,7 @@ // BitmapFetcherDelegate: void OnFetchComplete(const GURL& url, const SkBitmap* bitmap) override { - std::move(callback_).Run(bitmap); + std::move(callback_).Run(bitmap, base::File::FILE_OK); } void Start(const std::string& data, @@ -165,7 +158,8 @@ // URL. GURL data_url(data); if (!data_url.is_valid() || !data_url.SchemeIs(url::kDataScheme)) { - std::move(callback).Run(nullptr); + std::move(callback).Run(/*bitmap=*/nullptr, + base::File::FILE_ERROR_FAILED); return; } @@ -196,9 +190,8 @@ HoldingSpaceThumbnailLoader::ThumbnailRequest::ThumbnailRequest( const base::FilePath& item_path, - const gfx::Size& size, - float scale_factor) - : item_path(item_path), size(size), scale_factor(scale_factor) {} + const gfx::Size& size) + : item_path(item_path), size(size) {} HoldingSpaceThumbnailLoader::ThumbnailRequest::~ThumbnailRequest() = default; @@ -227,20 +220,16 @@ base::File::Error result, const base::File::Info& file_info) { if (result != base::File::FILE_OK) { - std::move(callback).Run(nullptr); + std::move(callback).Run(/*bitmap=*/nullptr, result); return; } // Short-circuit icons for folders. if (file_info.is_directory) { - std::move(callback).Run( - holding_space_util::CreatePlaceholderImage( - gfx::CreateVectorIcon( - chromeos::kFiletypeFolderIcon, - request.scale_factor * kFolderIconDipSize, - HoldingSpaceColorProvider::Get()->GetFileIconColor()), - request.size) - .bitmap()); + // `FILE_ERROR_NOT_A_FILE` is a special value used to signify that the + // file for which the thumbnail was requested is actually a folder. + std::move(callback).Run(/*bitmap=*/nullptr, + base::File::FILE_ERROR_NOT_A_FILE); return; } @@ -248,7 +237,14 @@ if (!file_manager::util::ConvertAbsoluteFilePathToFileSystemUrl( profile_, request.item_path, file_manager::kImageLoaderExtensionId, &thumbnail_url)) { - std::move(callback).Run(nullptr); + std::move(callback).Run(/*bitmap=*/nullptr, base::File::FILE_ERROR_FAILED); + return; + } + + extensions::MessageService* const message_service = + extensions::MessageService::Get(profile_); + if (!message_service) { // May be `nullptr` in tests. + std::move(callback).Run(/*bitmap=*/nullptr, base::File::FILE_ERROR_FAILED); return; } @@ -284,8 +280,6 @@ weak_factory_.GetWeakPtr(), request_id, request.size)); const extensions::PortId port_id(base::UnguessableToken::Create(), 1 /* port_number */, true /* is_opener */); - extensions::MessageService* const message_service = - extensions::MessageService::Get(profile_); auto native_message_port = std::make_unique<extensions::NativeMessagePort>( message_service->GetChannelDelegate(), port_id, std::move(native_message_host)); @@ -304,7 +298,8 @@ return; if (data.empty()) { - RespondToRequest(request_id, requested_size, nullptr); + RespondToRequest(request_id, requested_size, /*bitmap=*/nullptr, + base::File::FILE_ERROR_FAILED); return; } @@ -320,7 +315,8 @@ void HoldingSpaceThumbnailLoader::RespondToRequest( const base::UnguessableToken& request_id, const gfx::Size& requested_size, - const SkBitmap* bitmap) { + const SkBitmap* bitmap, + base::File::Error error) { thumbnail_decoders_.erase(request_id); auto request_it = requests_.find(request_id); if (request_it == requests_.end()) @@ -341,7 +337,8 @@ ImageCallback callback = std::move(request_it->second); requests_.erase(request_it); - std::move(callback).Run(cropped_bitmap.isNull() ? bitmap : &cropped_bitmap); + std::move(callback).Run(cropped_bitmap.isNull() ? bitmap : &cropped_bitmap, + error); } } // namespace ash
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.h b/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.h index 401d5e7..ad55304 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader.h
@@ -38,9 +38,7 @@ // Thumbnail request data that will be forwarded to the image loader. struct ThumbnailRequest { - ThumbnailRequest(const base::FilePath& item_path, - const gfx::Size& size, - float scale_factor); + ThumbnailRequest(const base::FilePath& item_path, const gfx::Size& size); ~ThumbnailRequest(); // The absolute item file path. @@ -48,15 +46,13 @@ // The desired bitmap size. const gfx::Size size; - - // The scale factor for which the bitmap is being generated. - float scale_factor; }; // Returns a weak pointer to this instance. base::WeakPtr<HoldingSpaceThumbnailLoader> GetWeakPtr(); - using ImageCallback = base::OnceCallback<void(const SkBitmap* bitmap)>; + using ImageCallback = + base::OnceCallback<void(const SkBitmap* bitmap, base::File::Error error)>; // Starts a request for a thumbnail. `callback` called with the generated // bitmap. On error, the bitmap will be null. void Load(const ThumbnailRequest& request, ImageCallback callback); @@ -86,7 +82,8 @@ // originally `requested_size`, the bitmap will be cropped. void RespondToRequest(const base::UnguessableToken& request_id, const gfx::Size& requested_size, - const SkBitmap* bitmap); + const SkBitmap* bitmap, + base::File::Error error); Profile* const profile_;
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader_browsertest.cc index f357afe3..d1e7d4c1 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_thumbnail_loader_browsertest.cc
@@ -35,11 +35,15 @@ // Copies |bitmap| into |copy| and runs |callback|. void CopyBitmapAndRunClosure(base::OnceClosure callback, SkBitmap* copy, - const SkBitmap* bitmap) { - if (bitmap) + const SkBitmap* bitmap, + base::File::Error error) { + if (bitmap) { + EXPECT_EQ(base::File::FILE_OK, error); *copy = *bitmap; - else + } else { + EXPECT_NE(base::File::FILE_OK, error); ADD_FAILURE() << "Got null bitmap"; + } std::move(callback).Run(); } @@ -166,11 +170,12 @@ base::RunLoop run_loop; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kNonExistent), gfx::Size(48, 48), - /*scale_factor=*/1.0f); + GetTestPath(TestPath::kNonExistent), gfx::Size(48, 48)); loader->Load(request, - base::BindLambdaForTesting([&run_loop](const SkBitmap* bitmap) { + base::BindLambdaForTesting([&run_loop](const SkBitmap* bitmap, + base::File::Error error) { EXPECT_FALSE(bitmap); + EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, error); run_loop.Quit(); })); run_loop.Run(); @@ -181,33 +186,16 @@ ASSERT_TRUE(loader); base::RunLoop run_loop; - SkBitmap bitmap; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kEmptyDir), gfx::Size(48, 48), - /*scale_factor=*/1.0f); - loader->Load(request, base::BindOnce(&CopyBitmapAndRunClosure, - run_loop.QuitClosure(), &bitmap)); + GetTestPath(TestPath::kEmptyDir), gfx::Size(48, 48)); + loader->Load(request, + base::BindLambdaForTesting([&run_loop](const SkBitmap* bitmap, + base::File::Error error) { + EXPECT_FALSE(bitmap); + EXPECT_EQ(base::File::FILE_ERROR_NOT_A_FILE, error); + run_loop.Quit(); + })); run_loop.Run(); - EXPECT_FALSE(bitmap.isNull()); - EXPECT_EQ(48, bitmap.width()); - EXPECT_EQ(48, bitmap.height()); -} - -IN_PROC_BROWSER_TEST_F(HoldingSpaceThumbnailLoaderTest, LoadFolderScale2) { - ash::HoldingSpaceThumbnailLoader* loader = GetThumbnailLoader(); - ASSERT_TRUE(loader); - - base::RunLoop run_loop; - SkBitmap bitmap; - ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kEmptyDir), gfx::Size(48, 48), - /*scale_factor=*/2.0f); - loader->Load(request, base::BindOnce(&CopyBitmapAndRunClosure, - run_loop.QuitClosure(), &bitmap)); - run_loop.Run(); - EXPECT_FALSE(bitmap.isNull()); - EXPECT_EQ(48, bitmap.width()); - EXPECT_EQ(48, bitmap.height()); } IN_PROC_BROWSER_TEST_F(HoldingSpaceThumbnailLoaderTest, LoadJpg) { @@ -217,7 +205,7 @@ SkBitmap bitmap; base::RunLoop run_loop; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kJpg), gfx::Size(48, 48), /*scale_factor=*/1.0f); + GetTestPath(TestPath::kJpg), gfx::Size(48, 48)); loader->Load(request, base::BindOnce(&CopyBitmapAndRunClosure, run_loop.QuitClosure(), &bitmap)); run_loop.Run(); @@ -233,11 +221,12 @@ base::RunLoop run_loop; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kBrokenJpg), gfx::Size(48, 48), - /*scale_factor=*/1.0f); + GetTestPath(TestPath::kBrokenJpg), gfx::Size(48, 48)); loader->Load(request, - base::BindLambdaForTesting([&run_loop](const SkBitmap* bitmap) { + base::BindLambdaForTesting([&run_loop](const SkBitmap* bitmap, + base::File::Error error) { EXPECT_FALSE(bitmap); + EXPECT_EQ(base::File::FILE_ERROR_FAILED, error); run_loop.Quit(); })); run_loop.Run(); @@ -250,7 +239,7 @@ SkBitmap bitmap; base::RunLoop run_loop; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kPng), gfx::Size(48, 48), /*scale_factor=*/1.0f); + GetTestPath(TestPath::kPng), gfx::Size(48, 48)); loader->Load(request, base::BindOnce(&CopyBitmapAndRunClosure, run_loop.QuitClosure(), &bitmap)); run_loop.Run(); @@ -264,7 +253,7 @@ ASSERT_TRUE(loader); ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request( - GetTestPath(TestPath::kPng), gfx::Size(48, 48), /*scale_factor=*/1.0f); + GetTestPath(TestPath::kPng), gfx::Size(48, 48)); SkBitmap bitmap1; base::RunLoop run_loop1; @@ -305,14 +294,14 @@ SkBitmap bitmap1; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request1( - GetTestPath(TestPath::kPng), gfx::Size(48, 48), /*scale_factor=*/1.0f); + GetTestPath(TestPath::kPng), gfx::Size(48, 48)); base::RunLoop run_loop1; loader->Load(request1, base::BindOnce(&CopyBitmapAndRunClosure, run_loop1.QuitClosure(), &bitmap1)); SkBitmap bitmap2; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request2( - GetTestPath(TestPath::kPng), gfx::Size(96, 96), /*scale_factor=*/2.0f); + GetTestPath(TestPath::kPng), gfx::Size(96, 96)); base::RunLoop run_loop2; loader->Load(request2, base::BindOnce(&CopyBitmapAndRunClosure, run_loop2.QuitClosure(), &bitmap2)); @@ -320,7 +309,7 @@ SkBitmap bitmap3; base::RunLoop run_loop3; ash::HoldingSpaceThumbnailLoader::ThumbnailRequest request3( - GetTestPath(TestPath::kJpg), gfx::Size(48, 48), /*scale_factor=*/1.0f); + GetTestPath(TestPath::kJpg), gfx::Size(48, 48)); loader->Load(request3, base::BindOnce(&CopyBitmapAndRunClosure, run_loop3.QuitClosure(), &bitmap3));
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_util.cc b/chrome/browser/ui/ash/holding_space/holding_space_util.cc index b040d18..0b32b13 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_util.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_util.cc
@@ -4,8 +4,6 @@ #include "chrome/browser/ui/ash/holding_space/holding_space_util.h" -#include "ash/public/cpp/file_icon_util.h" -#include "ash/public/cpp/holding_space/holding_space_color_provider.h" #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_image.h" #include "base/barrier_closure.h" @@ -25,27 +23,6 @@ base::Optional<base::Time> now_for_testing; -// Helpers --------------------------------------------------------------------- - -gfx::ImageSkia GetPlaceholderImage(HoldingSpaceItem::Type type, - const base::FilePath& file_path) { - gfx::Size size; - switch (type) { - case HoldingSpaceItem::Type::kDownload: - case HoldingSpaceItem::Type::kNearbyShare: - case HoldingSpaceItem::Type::kPinnedFile: - size = gfx::Size(kHoldingSpaceChipIconSize, kHoldingSpaceChipIconSize); - break; - case HoldingSpaceItem::Type::kScreenRecording: - case HoldingSpaceItem::Type::kScreenshot: - size = kHoldingSpaceScreenCaptureSize; - break; - } - - const SkColor color = HoldingSpaceColorProvider::Get()->GetFileIconColor(); - return CreatePlaceholderImage(GetIconForPath(file_path, color), size); -} - } // namespace ValidityRequirement::ValidityRequirement() = default; @@ -179,28 +156,17 @@ HoldingSpaceItem::Type type, const base::FilePath& file_path) { return std::make_unique<HoldingSpaceImage>( - file_path, GetPlaceholderImage(type, file_path), + HoldingSpaceImage::GetMaxSizeForType(type), file_path, base::BindRepeating( [](const base::WeakPtr<HoldingSpaceThumbnailLoader>& thumbnail_loader, const base::FilePath& file_path, const gfx::Size& size, - float scale_factor, HoldingSpaceImage::BitmapCallback callback) { + HoldingSpaceImage::BitmapCallback callback) { if (thumbnail_loader) - thumbnail_loader->Load({file_path, size, scale_factor}, - std::move(callback)); + thumbnail_loader->Load({file_path, size}, std::move(callback)); }, thumbnail_loader->GetWeakPtr())); } -gfx::ImageSkia CreatePlaceholderImage(const gfx::ImageSkia& file_type_image, - const gfx::Size& size) { - // NOTE: We superimpose the file type icon for `file_path` over a transparent - // bitmap in order to center it within the placeholder image at a fixed size. - SkBitmap bitmap; - bitmap.allocN32Pixels(size.width(), size.height()); - return gfx::ImageSkiaOperations::CreateSuperimposedImage( - gfx::ImageSkia::CreateFrom1xBitmap(bitmap), file_type_image); -} - void SetNowForTesting(base::Optional<base::Time> now) { now_for_testing = now; }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_util.h b/chrome/browser/ui/ash/holding_space/holding_space_util.h index d64e11f9..7ed4c750 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_util.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_util.h
@@ -19,11 +19,6 @@ class FilePath; } // namespace base -namespace gfx { -class ImageSkia; -class Size; -} // namespace gfx - namespace ash { class HoldingSpaceImage; @@ -79,11 +74,6 @@ HoldingSpaceItem::Type type, const base::FilePath& file_path); -// Given a base image for a file type, returns a placeholder image to be used in -// the holding space UI. -gfx::ImageSkia CreatePlaceholderImage(const gfx::ImageSkia& file_type_image, - const gfx::Size& size); - void SetNowForTesting(base::Optional<base::Time> now); } // namespace holding_space_util
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 31e56420..9296abf2 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc
@@ -90,6 +90,7 @@ #include "components/prefs/pref_service.h" #include "components/reading_list/core/reading_list_entry.h" #include "components/reading_list/core/reading_list_model.h" +#include "components/reading_list/core/reading_list_pref_names.h" #include "components/services/app_service/public/mojom/types.mojom.h" #include "components/sessions/core/live_tab_context.h" #include "components/sessions/core/tab_restore_service.h" @@ -1055,6 +1056,7 @@ return false; model->AddEntry(url, base::UTF16ToUTF8(title), reading_list::EntrySource::ADDED_VIA_CURRENT_APP); + MaybeShowBookmarkBarForReadLater(browser); return true; } @@ -1081,6 +1083,20 @@ return entry && !entry->IsRead(); } +void MaybeShowBookmarkBarForReadLater(Browser* browser) { +#if !defined(OS_ANDROID) + PrefService* pref_service = browser->profile()->GetPrefs(); + if (pref_service && + !pref_service->GetBoolean( + reading_list::prefs::kReadingListDesktopFirstUseExperienceShown)) { + pref_service->SetBoolean( + reading_list::prefs::kReadingListDesktopFirstUseExperienceShown, true); + if (browser->bookmark_bar_state() == BookmarkBar::HIDDEN) + ToggleBookmarkBar(browser); + } +#endif // defined(OS_ANDROID) +} + void SaveCreditCard(Browser* browser) { WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h index eaa4431..6eecdf0e 100644 --- a/chrome/browser/ui/browser_commands.h +++ b/chrome/browser/ui/browser_commands.h
@@ -145,6 +145,7 @@ bool MoveCurrentTabToReadLater(Browser* browser); bool MarkCurrentTabAsReadInReadLater(Browser* browser); bool IsCurrentTabUnreadInReadLater(Browser* browser); +void MaybeShowBookmarkBarForReadLater(Browser* browser); void SaveCreditCard(Browser* browser); void MigrateLocalCards(Browser* browser); void MaybeShowSaveLocalCardSignInPromo(Browser* browser);
diff --git a/chrome/browser/ui/browser_commands_browsertest.cc b/chrome/browser/ui/browser_commands_browsertest.cc index 1292e1c..2914ad3e 100644 --- a/chrome/browser/ui/browser_commands_browsertest.cc +++ b/chrome/browser/ui/browser_commands_browsertest.cc
@@ -4,12 +4,14 @@ #include "chrome/browser/ui/browser_commands.h" +#include "base/test/scoped_feature_list.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/reading_list/features/reading_list_switches.h" #include "content/public/test/browser_test.h" namespace chrome { @@ -165,4 +167,46 @@ url2); } +class ReadLaterBrowserCommandsTest : public BrowserCommandsTest { + public: + ReadLaterBrowserCommandsTest() { + feature_list_.InitAndEnableFeature(reading_list::switches::kReadLater); + } + ~ReadLaterBrowserCommandsTest() override = default; + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// Verify that the bookmark bar is shown the first time someone saves to read +// later. +IN_PROC_BROWSER_TEST_F(ReadLaterBrowserCommandsTest, + PRE_ReadLaterOpensBookmarksBarOnFirstUse) { + GURL url("https://www.google.com"); + ui_test_utils::NavigateToURL(browser(), url); + + EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); + // Verify the bookmark bar is shown after saving to the reading list. + MoveCurrentTabToReadLater(browser()); + EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state()); + ToggleBookmarkBar(browser()); + EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); + // Verify the bookmark bar isn't reshown on subsequent saves to the reading + // list. + MoveCurrentTabToReadLater(browser()); + EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); +} + +// Verify that the bookmark bar is not reshown after Chrome restarts. +IN_PROC_BROWSER_TEST_F(ReadLaterBrowserCommandsTest, + ReadLaterOpensBookmarksBarOnFirstUse) { + GURL url("https://www.google.com"); + ui_test_utils::NavigateToURL(browser(), url); + + EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); + // Verify the bookmark bar is still hidden after saving to the reading list. + MoveCurrentTabToReadLater(browser()); + EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); +} + } // namespace chrome
diff --git a/chrome/browser/ui/hats/hats_survey_status_checker.cc b/chrome/browser/ui/hats/hats_survey_status_checker.cc index 59b7cded..c9371fd7 100644 --- a/chrome/browser/ui/hats/hats_survey_status_checker.cc +++ b/chrome/browser/ui/hats/hats_survey_status_checker.cc
@@ -40,6 +40,7 @@ GURL cookie_url = GURL("https://www.google.com"); auto survey_cookie = net::CanonicalCookie::Create( cookie_url, "PAIDCONTENT=0", base::Time::Now(), base::nullopt); + DCHECK(survey_cookie); network::mojom::CookieManager* cookie_manager = GetStoragePartition()->GetCookieManagerForBrowserProcess(); cookie_manager->SetCanonicalCookie(*survey_cookie, cookie_url,
diff --git a/chrome/browser/ui/read_later/reading_list_model_factory.cc b/chrome/browser/ui/read_later/reading_list_model_factory.cc index 177030c..b46a5fb 100644 --- a/chrome/browser/ui/read_later/reading_list_model_factory.cc +++ b/chrome/browser/ui/read_later/reading_list_model_factory.cc
@@ -89,6 +89,11 @@ registry->RegisterBooleanPref( reading_list::prefs::kReadingListHasUnseenEntries, false, PrefRegistry::NO_REGISTRATION_FLAGS); +#if !defined(OS_ANDROID) + registry->RegisterBooleanPref( + reading_list::prefs::kReadingListDesktopFirstUseExperienceShown, false, + PrefRegistry::NO_REGISTRATION_FLAGS); +#endif // !defined(OS_ANDROID) } content::BrowserContext* ReadingListModelFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc index f90422b9..19cc99b 100644 --- a/chrome/browser/ui/tabs/tab_strip_model.cc +++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -30,6 +30,7 @@ #include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h" #include "chrome/browser/ui/bookmarks/bookmark_utils.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/read_later/reading_list_model_factory.h" #include "chrome/browser/ui/tab_ui_helper.h" @@ -2154,6 +2155,11 @@ reading_list::EntrySource::ADDED_VIA_CURRENT_APP); } } + // Maybe show the bookmark bar if an item exists in read later. + if (model->size()) { + chrome::MaybeShowBookmarkBarForReadLater( + chrome::FindBrowserWithWebContents(GetWebContentsAt(indices[0]))); + } } base::Optional<tab_groups::TabGroupId> TabStripModel::UngroupTab(int index) {
diff --git a/chrome/browser/ui/views/find_bar_view.cc b/chrome/browser/ui/views/find_bar_view.cc index 6fd5388..2e51ac5a 100644 --- a/chrome/browser/ui/views/find_bar_view.cc +++ b/chrome/browser/ui/views/find_bar_view.cc
@@ -447,12 +447,8 @@ views::BubbleBorder::NONE, views::BubbleBorder::STANDARD_SHADOW, bg_color); - border->SetCornerRadius( - base::FeatureList::IsEnabled( - views::features::kEnableMDRoundedCornersOnDialogs) - ? views::LayoutProvider::Get()->GetCornerRadiusMetric( - views::EMPHASIS_MEDIUM) - : 2); + border->SetCornerRadius(views::LayoutProvider::Get()->GetCornerRadiusMetric( + views::EMPHASIS_MEDIUM)); SetBackground(std::make_unique<views::BubbleBackground>(border.get())); SetBorder(std::move(border));
diff --git a/chrome/browser/ui/views/location_bar/star_view.cc b/chrome/browser/ui/views/location_bar/star_view.cc index 9c47f65f..9edaafeb 100644 --- a/chrome/browser/ui/views/location_bar/star_view.cc +++ b/chrome/browser/ui/views/location_bar/star_view.cc
@@ -74,6 +74,7 @@ } void StarView::ExecuteCommand(ExecuteSource source) { + OnExecuting(source); if (base::FeatureList::IsEnabled(reading_list::switches::kReadLater)) { menu_model_ = std::make_unique<StarMenuModel>( this, active(), chrome::CanMoveActiveTabToReadLater(browser_), @@ -85,7 +86,6 @@ views::MenuAnchorPosition::kTopRight, ui::MENU_SOURCE_NONE); } else { - OnExecuting(source); chrome::BookmarkCurrentTab(browser_); } }
diff --git a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc index 940637d2..bc71c8f 100644 --- a/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc +++ b/chrome/browser/ui/views/profiles/dice_web_signin_interception_bubble_view.cc
@@ -155,11 +155,10 @@ std::unique_ptr<views::WebView> web_view = std::make_unique<views::WebView>(profile); web_view->LoadInitialURL(GURL(chrome::kChromeUIDiceWebSigninInterceptURL)); - web_view->SetPreferredSize( - gfx::Size(kInterceptionBubbleWidth, - DiceWebSigninInterceptUI::ShouldShowGuestOption() - ? kInterceptionBubbleWithGuestHeight - : kInterceptionBubbleWithoutGuestHeight)); + web_view->SetPreferredSize(gfx::Size( + kInterceptionBubbleWidth, bubble_parameters.show_guest_option + ? kInterceptionBubbleWithGuestHeight + : kInterceptionBubbleWithoutGuestHeight)); DiceWebSigninInterceptUI* web_ui = web_view->GetWebContents() ->GetWebUI() ->GetController()
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc index 6d109c4..ae0f53c 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -63,6 +63,7 @@ #include "ui/native_theme/native_theme.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/metadata/metadata_impl_macros.h" namespace { @@ -744,3 +745,7 @@ } } #endif // BUILDFLAG(IS_CHROMEOS_ASH) + +BEGIN_METADATA(ProfileMenuView, ProfileMenuViewBase) +ADD_READONLY_PROPERTY_METADATA(gfx::ImageSkia, SyncIcon) +END_METADATA
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.h b/chrome/browser/ui/views/profiles/profile_menu_view.h index 279a495..e626eae9 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.h +++ b/chrome/browser/ui/views/profiles/profile_menu_view.h
@@ -33,6 +33,8 @@ // It displays a list of profiles and allows users to switch between profiles. class ProfileMenuView : public ProfileMenuViewBase { public: + METADATA_HEADER(ProfileMenuView); + ProfileMenuView(views::Button* anchor_button, Browser* browser); ~ProfileMenuView() override;
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc index 90c01ce..db21b6f 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -134,6 +134,25 @@ return signin_url; } +class ProfilePickerWidget : public views::Widget { + public: + explicit ProfilePickerWidget(ProfilePickerView* profile_picker_view) + : profile_picker_view_(profile_picker_view) { + views::Widget::InitParams params; + params.delegate = profile_picker_view_; + Init(std::move(params)); + } + ~ProfilePickerWidget() override = default; + + // views::Widget: + const ui::ThemeProvider* GetThemeProvider() const override { + return profile_picker_view_->GetThemeProviderForProfileBeingCreated(); + } + + private: + ProfilePickerView* const profile_picker_view_; +}; + } // namespace // static @@ -232,14 +251,22 @@ } } +const ui::ThemeProvider* +ProfilePickerView::GetThemeProviderForProfileBeingCreated() const { + if (!signed_in_profile_being_created_) + return nullptr; + return &ThemeService::GetThemeProviderForProfile( + signed_in_profile_being_created_); +} + ProfilePickerView::ProfilePickerView() : keep_alive_(KeepAliveOrigin::USER_MANAGER_VIEW, KeepAliveRestartOption::DISABLED), extended_account_info_timeout_(kExtendedAccountInfoTimeout) { + // Setup the WidgetDelegate. SetHasWindowSizeControls(true); - SetButtons(ui::DIALOG_BUTTON_NONE); SetTitle(IDS_PRODUCT_NAME); - set_use_custom_frame(false); + ConfigureAccelerators(); // TODO(crbug.com/1063856): Add |RecordDialogCreation|. } @@ -309,7 +336,8 @@ extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( system_profile_contents_.get()); - CreateDialogWidget(this, nullptr, nullptr); + // The widget is owned by the native widget. + new ProfilePickerWidget(this); #if defined(OS_WIN) // Set the app id for the user manager to the app id of its parent. @@ -432,6 +460,22 @@ sync_confirmation_ui->InitializeMessageHandlerForCreationFlow(profile_color_); } +void ProfilePickerView::WindowClosing() { + // Now that the window is closed, we can allow a new one to be opened. + // (WindowClosing comes in asynchronously from the call to Close() and we + // may have already opened a new instance). + if (g_profile_picker_view == this) + g_profile_picker_view = nullptr; +} + +views::ClientView* ProfilePickerView::CreateClientView(views::Widget* widget) { + return new views::ClientView(widget, TransferOwnershipOfContentsView()); +} + +views::View* ProfilePickerView::GetContentsView() { + return this; +} + gfx::Size ProfilePickerView::CalculatePreferredSize() const { gfx::Size preferred_size = gfx::Size(kWindowWidth, kWindowHeight); gfx::Size work_area_size = GetWidget()->GetWorkAreaBoundsInScreen().size(); @@ -443,14 +487,6 @@ return preferred_size; } -void ProfilePickerView::WindowClosing() { - // Now that the window is closed, we can allow a new one to be opened. - // (WindowClosing comes in asynchronously from the call to Close() and we - // may have already opened a new instance). - if (g_profile_picker_view == this) - g_profile_picker_view = nullptr; -} - gfx::Size ProfilePickerView::GetMinimumSize() const { // On small screens, the preferred size may be smaller than the picker // minimum size. In that case there will be scrollbars on the picker.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.h b/chrome/browser/ui/views/profiles/profile_picker_view.h index effd6b9..91bb348 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.h +++ b/chrome/browser/ui/views/profiles/profile_picker_view.h
@@ -15,7 +15,8 @@ #include "content/public/browser/web_contents_delegate.h" #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h" #include "ui/views/controls/webview/webview.h" -#include "ui/views/window/dialog_delegate.h" +#include "ui/views/view.h" +#include "ui/views/widget/widget_delegate.h" struct AccountInfo; class Browser; @@ -31,12 +32,14 @@ } // namespace content // Dialog widget that contains the Desktop Profile picker webui. -class ProfilePickerView : public views::DialogDelegateView, +class ProfilePickerView : public views::WidgetDelegateView, public content::WebContentsDelegate, public signin::IdentityManager::Observer { public: using BrowserOpenedCallback = base::OnceCallback<void(Browser*)>; + const ui::ThemeProvider* GetThemeProviderForProfileBeingCreated() const; + private: friend class ProfilePicker; @@ -73,11 +76,13 @@ // Switches the layout to the sync confirmation screen. void SwitchToSyncConfirmation(); - // views::DialogDelegateView: - gfx::Size CalculatePreferredSize() const override; + // views::WidgetDelegate: void WindowClosing() override; + views::ClientView* CreateClientView(views::Widget* widget) override; + views::View* GetContentsView() override; - // views::View; + // views::View: + gfx::Size CalculatePreferredSize() const override; gfx::Size GetMinimumSize() const override; bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc index 8757384..5f68959 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -616,7 +616,9 @@ if (GetWidget()->IsVisible()) ++hover_cards_seen_count_; - if (GetWidget()->IsVisible() && !disable_animations_for_testing_) { + const bool animations_enabled = gfx::Animation::ShouldRenderRichAnimation(); + if (GetWidget()->IsVisible() && !disable_animations_for_testing_ && + animations_enabled) { slide_animation_delegate_->AnimateToAnchorView(tab); } else { if (!anchor_view_set) @@ -628,7 +630,8 @@ } if (!GetWidget()->IsVisible()) { - if (disable_animations_for_testing_ || show_immediately) { + if (disable_animations_for_testing_ || show_immediately || + !animations_enabled) { GetWidget()->SetOpacity(1.0f); GetWidget()->Show(); } else { @@ -652,7 +655,8 @@ thumbnail_observation_->Observe(nullptr); slide_animation_delegate_->StopAnimation(); last_visible_timestamp_ = base::TimeTicks::Now(); - if (disable_animations_for_testing_) { + if (disable_animations_for_testing_ || + !gfx::Animation::ShouldRenderRichAnimation()) { GetWidget()->Hide(); } else { fade_animation_delegate_->FadeOut();
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc index 4c6972f4..b3d6561 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.cc
@@ -11,12 +11,15 @@ #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/ui/webui/flags/flags_ui.h" #include "chrome/grit/generated_resources.h" +#include "chrome/grit/google_chrome_strings.h" #include "components/flags_ui/pref_service_flags_storage.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/gfx/color_palette.h" #include "ui/views/background.h" #include "ui/views/controls/button/md_text_button.h" #include "ui/views/controls/label.h" #include "ui/views/layout/flex_layout.h" +#include "ui/views/layout/flex_layout_types.h" #include "ui/views/layout/layout_provider.h" namespace { @@ -70,24 +73,31 @@ public: ChromeLabsFooter() { SetLayoutManager(std::make_unique<views::FlexLayout>()) - ->SetOrientation(views::LayoutOrientation::kVertical); + ->SetOrientation(views::LayoutOrientation::kVertical) + .SetCrossAxisAlignment(views::LayoutAlignment::kStart); AddChildView( views::Builder<views::Label>() .CopyAddressTo(&restart_label_) - .SetText(base::ASCIIToUTF16( - "Your changes will take effect the next time you " - "relaunch Google Chrome.")) + .SetText(l10n_util::GetStringUTF16( + IDS_CHROMEBETA_RELAUNCH_FOOTER_MESSAGE)) .SetMultiLine(true) .SetHorizontalAlignment(gfx::ALIGN_LEFT) .SetProperty(views::kFlexBehaviorKey, views::FlexSpecification( views::MinimumFlexSizeRule::kPreferred, views::MaximumFlexSizeRule::kPreferred, true)) + .SetBorder(views::CreateEmptyBorder( + gfx::Insets(0, 0, + views::LayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_VERTICAL), + 0))) .Build()); AddChildView(views::Builder<views::MdTextButton>() .CopyAddressTo(&restart_button_) .SetCallback(base::BindRepeating(&chrome::AttemptRestart)) - .SetText(base::ASCIIToUTF16("Relaunch")) + .SetText(l10n_util::GetStringUTF16( + IDS_CHROMEBETA_RELAUNCH_BUTTON_LABEL)) + .SetProminent(true) .Build()); SetBackground(views::CreateThemedSolidBackground( this, ui::NativeTheme::kColorId_BubbleFooterBackground)); @@ -153,15 +163,16 @@ flags_state_ = about_flags::GetCurrentFlagsState(); menu_item_container_ = AddChildView( - views::Builder<views::View>() + views::Builder<views::FlexLayoutView>() + .SetOrientation(views::LayoutOrientation::kVertical) .SetProperty(views::kFlexBehaviorKey, views::FlexSpecification( views::MinimumFlexSizeRule::kScaleToZero, views::MaximumFlexSizeRule::kPreferred, true)) + .SetBorder(views::CreateEmptyBorder( + views::LayoutProvider::Get()->GetInsetsMetric( + views::INSETS_DIALOG))) .Build()); - menu_item_container_->SetLayoutManager(std::make_unique<views::FlexLayout>()) - ->SetOrientation(views::LayoutOrientation::kVertical) - .SetDefault(views::kMarginsKey, gfx::Insets(10)); // Create each lab item. const std::vector<LabInfo>& all_labs = model_->GetLabInfo();
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.h b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.h index 85412cb..eb37d5b 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.h +++ b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view.h
@@ -11,11 +11,9 @@ #include "components/flags_ui/flags_state.h" #include "components/flags_ui/flags_storage.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/layout/flex_layout_view.h" // TODO(elainechien): Use composition instead of inheritance. -// TODO(elainechien): Add screenshots and strings for translation when UI is -// finished. -// TODO(elainechien): Formatting for items in child views. class ChromeLabsBubbleView : public views::BubbleDialogDelegateView { public: static void Show(views::View* anchor_view, @@ -54,7 +52,7 @@ flags_ui::FlagsState* flags_state_; // This view will hold all the child lab items. - views::View* menu_item_container_; + views::FlexLayoutView* menu_item_container_; std::unique_ptr<ChromeLabsBubbleViewModel> model_;
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc b/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc index 0e35b72b..c524327e 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_item_view.cc
@@ -3,11 +3,14 @@ // found in the LICENSE file. #include "chrome/browser/ui/views/toolbar/chrome_labs_item_view.h" +#include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.h" #include "ui/base/models/combobox_model.h" #include "ui/views/controls/label.h" #include "ui/views/layout/flex_layout.h" #include "ui/views/layout/flex_layout_types.h" +#include "ui/views/layout/layout_provider.h" class LabsComboboxModel : public ui::ComboboxModel { public: @@ -39,21 +42,35 @@ : feature_entry_(feature_entry) { SetLayoutManager(std::make_unique<views::FlexLayout>()) ->SetOrientation(views::LayoutOrientation::kVertical) - .SetDefault(views::kMarginsKey, gfx::Insets(10)); + .SetCrossAxisAlignment(views::LayoutAlignment::kStart); + SetBorder(views::CreateEmptyBorder( + gfx::Insets(ChromeLayoutProvider::Get()->GetDistanceMetric( + DISTANCE_CONTROL_LIST_VERTICAL), + 0))); + AddChildView(views::Builder<views::Label>() + .SetTextContext(views::style::CONTEXT_DIALOG_BODY_TEXT) .SetText(lab.visible_name) .SetHorizontalAlignment(gfx::ALIGN_LEFT) .Build()); AddChildView( views::Builder<views::Label>() .SetText(lab.visible_description) + .SetTextContext(ChromeTextContext::CONTEXT_DIALOG_BODY_TEXT_SMALL) + .SetTextStyle(views::style::STYLE_SECONDARY) .SetMultiLine(true) .SetHorizontalAlignment(gfx::ALIGN_LEFT) .SetProperty(views::kFlexBehaviorKey, views::FlexSpecification( views::MinimumFlexSizeRule::kPreferred, views::MaximumFlexSizeRule::kPreferred, true)) + .SetBorder(views::CreateEmptyBorder( + gfx::Insets(0, 0, + views::LayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_CONTROL_VERTICAL), + 0))) .Build()); + AddChildView(views::Builder<views::Combobox>() .CopyAddressTo(&lab_state_combobox_) .SetOwnedModel(std::make_unique<LabsComboboxModel>(
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc index e0a6e95..d0f93bd7 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -38,21 +38,35 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/network/public/cpp/network_switches.h" #include "testing/gmock/include/gmock/gmock.h" +#include "third_party/re2/src/re2/re2.h" namespace { -std::string test_case_file = "web_app_integration_browsertest_cases.csv"; -std::string platform_name = +const std::string kTestCaseFilename = + "web_app_integration_browsertest_cases.csv"; +const std::string kExpectationsFilename = "TestExpectations"; +const std::string kPlatformName = #if BUILDFLAG(IS_CHROMEOS_ASH) - "cros"; + "ChromeOS"; #elif defined(OS_LINUX) - "linux"; + "Linux"; #elif defined(OS_MAC) - "macos"; + "Mac"; #elif defined(OS_WIN) - "win"; + "Win"; #endif // BUILDFLAG(IS_CHROMEOS_ASH) +std::string StripAllWhitespace(std::string line) { + std::string output; + output.reserve(line.size()); + for (const char& c : line) { + if (!isspace(c)) { + output += c; + } + } + return output; +} + // Returns the path of the requested file in the test data directory. base::FilePath GetTestFilePath(const std::string& file_name) { base::FilePath file_path; @@ -64,29 +78,85 @@ return file_path.AppendASCII(file_name); } -std::vector<std::string> ReadTestInputFile(std::string& file_name) { +std::vector<std::string> ReadTestInputFile(const std::string& file_name) { base::FilePath file = GetTestFilePath(file_name); std::string contents; std::vector<std::string> test_cases; if (!base::ReadFileToString(file, &contents)) { - LOG(ERROR) << "File not found: " << file.value(); return test_cases; } std::vector<std::string> file_lines = base::SplitString( contents, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); for (const auto& line : file_lines) { + if (line[0] == '#') { + continue; + } + + if (line.find('|') == std::string::npos) { + test_cases.push_back(StripAllWhitespace(line)); + continue; + } + std::vector<std::string> platforms_and_test = base::SplitString( line, "|", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - if (platforms_and_test[0] == "all" || - platforms_and_test[0].find(platform_name) != std::string::npos) { - test_cases.push_back(platforms_and_test[1]); + if (platforms_and_test[0].find(kPlatformName) != std::string::npos) { + test_cases.push_back(StripAllWhitespace(platforms_and_test[1])); } } return test_cases; } +std::vector<std::string> GetPlatformIgnoredTests(const std::string& file_name) { + base::FilePath file = GetTestFilePath(file_name); + std::string contents; + std::vector<std::string> platform_expectations; + if (!base::ReadFileToString(file, &contents)) { + return platform_expectations; + } + + std::vector<std::string> file_lines = base::SplitString( + contents, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); + for (const auto& line : file_lines) { + if (line[0] == '#') { + continue; + } + + std::string platform; + std::string expectation; + std::string test_case; + RE2::FullMatch( + line, "crbug.com/\\d* \\[ (\\w*) \\] \\[ (\\w*) \\] ([\\w*,\\s*]*)", + &platform, &expectation, &test_case); + if (platform == kPlatformName) { + if (expectation == "Skip") { + platform_expectations.push_back(StripAllWhitespace(test_case)); + } else { + NOTREACHED() << "Unsupported expectation " << expectation; + } + } + } + return platform_expectations; +} + +std::vector<std::string> BuildAllPlatformTestCaseSet() { + std::vector<std::string> test_cases_all = + ReadTestInputFile(kTestCaseFilename); + std::sort(test_cases_all.begin(), test_cases_all.end()); + + std::vector<std::string> ignored_cases = + GetPlatformIgnoredTests(kExpectationsFilename); + std::sort(ignored_cases.begin(), ignored_cases.end()); + + std::vector<std::string> final_tests(test_cases_all.size()); + auto iter = std::set_difference(test_cases_all.begin(), test_cases_all.end(), + ignored_cases.begin(), ignored_cases.end(), + final_tests.begin()); + final_tests.resize(iter - final_tests.begin()); + return final_tests; +} + } // anonymous namespace namespace web_app { @@ -401,6 +471,6 @@ INSTANTIATE_TEST_SUITE_P(All, WebAppIntegrationBrowserTest, - testing::ValuesIn(ReadTestInputFile(test_case_file))); + testing::ValuesIn(BuildAllPlatformTestCaseSet())); } // namespace web_app
diff --git a/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc b/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc index 6cb4b41..54a4949 100644 --- a/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc +++ b/chrome/browser/ui/webui/chrome_url_data_manager_browsertest.cc
@@ -2,12 +2,15 @@ // 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/macros.h" #include "base/strings/string_piece.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/webui/welcome/helpers.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" @@ -143,7 +146,14 @@ : public InProcessBrowserTest, public testing::WithParamInterface<const char*> { public: - ChromeURLDataManagerWebUITrustedTypesTest() = default; + ChromeURLDataManagerWebUITrustedTypesTest() { + std::vector<base::Feature> enabled_features; +#if !BUILDFLAG(IS_CHROMEOS_ASH) + if (GetParam() == std::string("chrome://welcome")) + enabled_features.push_back(welcome::kForceEnabled); +#endif + feature_list_.InitWithFeatures(enabled_features, {}); + } void CheckTrustedTypesViolation(base::StringPiece url) { std::string message_filter1 = "*This document requires*assignment*"; @@ -156,16 +166,26 @@ ASSERT_TRUE(embedded_test_server()->Start()); ui_test_utils::NavigateToURL(browser(), GURL(url)); - // We don't ASSERT_TRUE here because some WebUI pages are by design not - // PAGE_TYPE_NORMAL (e.g. chrome://interstitials/ssl). - content::WaitForLoadStop(content); + + if (url == "chrome://network-error" || url == "chrome://dino") { + // We don't ASSERT_TRUE here because some WebUI pages are + // PAGE_TYPE_ERROR by design. + content::WaitForLoadStop(content); + } else { + ASSERT_TRUE(content::WaitForLoadStop(content)); + } + EXPECT_TRUE(console_observer.messages().empty()); } + + private: + base::test::ScopedFeatureList feature_list_; }; // Verify that there's no Trusted Types violation in chrome://chrome-urls IN_PROC_BROWSER_TEST_P(ChromeURLDataManagerWebUITrustedTypesTest, NoTrustedTypesViolation) { + LOG(INFO) << "Navigating to " << GetParam(); CheckTrustedTypesViolation(GetParam()); } @@ -176,23 +196,18 @@ // TODO(crbug.com/1114074): DCHECK failure when opening // chrome://appcache-internals. // "chrome://appcache-internals", - "chrome://apps", "chrome://autofill-internals", "chrome://blob-internals", "chrome://bluetooth-internals", "chrome://bookmarks", - "chrome://browser-switch", "chrome://chrome-urls", "chrome://components", - "chrome://conflicts", "chrome://connection-help", "chrome://connection-monitoring-detected", "chrome://conversion-internals", "chrome://crashes", "chrome://credits", "chrome://device-log", - // TODO(crbug.com/1114062): Crash when closing chrome://devices. - // "chrome://devices", "chrome://dino", // TODO(crbug.com/1113446): Test failure due to excessive output. // "chrome://discards", @@ -215,21 +230,18 @@ "chrome://invalidations", "chrome://local-state", "chrome://management", - "chrome://md-user-manager", "chrome://media-engagement", "chrome://media-feeds", "chrome://media-history", "chrome://media-internals", "chrome://media-router-internals", "chrome://memory-internals", - "chrome://nacl", "chrome://net-export", "chrome://net-internals", "chrome://network-error", "chrome://network-errors", "chrome://new-tab-page", "chrome://newtab", - "chrome://notifications-internals", "chrome://ntp-tiles-internals", "chrome://omnibox", "chrome://password-manager-internals", @@ -241,16 +253,13 @@ "chrome://quota-internals", "chrome://reset-password", "chrome://safe-browsing", - "chrome://sandbox", "chrome://serviceworker-internals", "chrome://settings", // TODO(crbug.com/1115600): DCHECK failure when opening // chrome://signin-dice-web-intercept. // "chrome://signin-dice-web-intercept", - "chrome://signin-email-confirmation", "chrome://signin-internals", "chrome://site-engagement", - "chrome://snippets-internals", "chrome://suggestions", // TODO(crbug.com/1099564): Navigating to chrome://sync-confirmation and // quickly navigating away cause DCHECK failure. @@ -270,12 +279,12 @@ "chrome://version", "chrome://webrtc-internals", "chrome://webrtc-logs", - "chrome://welcome", #if defined(OS_ANDROID) "chrome://explore-sites-internals", "chrome://internals/notifications", "chrome://internals/query-tiles", "chrome://offline-internals", + "chrome://snippets-internals", "chrome://webapks", #endif #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -295,7 +304,6 @@ "chrome://crostini-installer", "chrome://cryptohome", "chrome://drive-internals", - "chrome://first-run", "chrome://help-app", "chrome://internet-config-dialog", "chrome://internet-detail-dialog", @@ -314,11 +322,22 @@ "chrome://smb-share-dialog", "chrome://supervised-user-internals", "chrome://sys-internals", - // TODO(crbug.com/1115643): DCHECK failure when opening - // chrome-untrusted://crosh. - // "chrome-untrusted://crosh", "chrome-untrusted://terminal", #endif +#if !BUILDFLAG(IS_CHROMEOS_ASH) + "chrome://apps", + "chrome://browser-switch", + "chrome://md-user-manager", + "chrome://signin-email-confirmation", + "chrome://welcome", +#endif +#if !defined(OS_MAC) + "chrome://sandbox", + "chrome://nacl", +#endif +#if defined(OS_WIN) + "chrome://conflicts", +#endif }; INSTANTIATE_TEST_SUITE_P(,
diff --git a/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc b/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc index 88650430..14ed057ab 100644 --- a/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/chromeos/cellular_setup/cellular_setup_localized_strings_provider.cc
@@ -69,7 +69,11 @@ {"eidPopupTitle", IDS_CELLULAR_SETUP_EID_POPUP_TITLE}, {"eidPopupDescription", IDS_CELLULAR_SETUP_EID_POPUP_DESCRIPTION}, {"closeEidPopupButtonLabel", - IDS_CELLULAR_SETUP_CLOSE_EID_POPUP_BUTTON_LABEL}}; + IDS_CELLULAR_SETUP_CLOSE_EID_POPUP_BUTTON_LABEL}, + {"confirmationCodeMessage", + IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_MESSAGE}, + {"confirmationCodeInput", + IDS_CELLULAR_SETUP_ESIM_PAGE_CONFIRMATION_CODE_INPUT}}; // namespace struct NamedBoolean { const char* name;
diff --git a/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc b/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc index 0be1575..96fce77 100644 --- a/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc +++ b/chrome/browser/ui/webui/chromeos/login/online_login_helper.cc
@@ -74,6 +74,8 @@ std::unique_ptr<net::CanonicalCookie> cc(net::CanonicalCookie::Create( gaia_url, gaps_cookie_value, base::Time::Now(), base::nullopt /* server_time */)); + if (!cc) + return; const net::CookieOptions options = net::CookieOptions::MakeAllInclusive(); partition->GetCookieManagerForBrowserProcess()->SetCanonicalCookie( @@ -244,4 +246,4 @@ std::move(complete_login_callback_).Run(user_context); } -} // namespace chromeos \ No newline at end of file +} // namespace chromeos
diff --git a/chrome/browser/ui/webui/domain_reliability_internals_ui.cc b/chrome/browser/ui/webui/domain_reliability_internals_ui.cc index 6aa875b3..8424e4b 100644 --- a/chrome/browser/ui/webui/domain_reliability_internals_ui.cc +++ b/chrome/browser/ui/webui/domain_reliability_internals_ui.cc
@@ -32,29 +32,43 @@ html_source->AddResourcePath("domain_reliability_internals.js", IDR_DOMAIN_RELIABILITY_INTERNALS_JS); html_source->SetDefaultResource(IDR_DOMAIN_RELIABILITY_INTERNALS_HTML); - - web_ui->RegisterMessageCallback( - "updateData", - base::BindRepeating(&DomainReliabilityInternalsUI::UpdateData, - base::Unretained(this))); - Profile* profile = Profile::FromWebUI(web_ui); content::WebUIDataSource::Add(profile, html_source); + + web_ui->AddMessageHandler( + std::make_unique<DomainReliabilityInternalsHandler>()); } -DomainReliabilityInternalsUI::~DomainReliabilityInternalsUI() {} +DomainReliabilityInternalsUI::~DomainReliabilityInternalsUI() = default; -void DomainReliabilityInternalsUI::UpdateData(const base::ListValue* args) { +DomainReliabilityInternalsHandler::DomainReliabilityInternalsHandler() = + default; +DomainReliabilityInternalsHandler::~DomainReliabilityInternalsHandler() = + default; + +void DomainReliabilityInternalsHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "updateData", + base::BindRepeating(&DomainReliabilityInternalsHandler::HandleUpdateData, + base::Unretained(this))); +} + +void DomainReliabilityInternalsHandler::HandleUpdateData( + const base::ListValue* args) { + DCHECK_EQ(1u, args->GetSize()); + AllowJavascript(); + callback_id_ = args->GetList()[0].GetString(); + Profile* profile = Profile::FromWebUI(web_ui()); network::mojom::NetworkContext* network_context = content::BrowserContext::GetDefaultStoragePartition(profile) ->GetNetworkContext(); network_context->GetDomainReliabilityJSON( - base::BindOnce(&DomainReliabilityInternalsUI::OnDataUpdated, + base::BindOnce(&DomainReliabilityInternalsHandler::OnDataUpdated, weak_factory_.GetWeakPtr())); } -void DomainReliabilityInternalsUI::OnDataUpdated(base::Value data) const { - web_ui()->CallJavascriptFunctionUnsafe( - "DomainReliabilityInternals.onDataUpdated", data); +void DomainReliabilityInternalsHandler::OnDataUpdated(base::Value data) { + ResolveJavascriptCallback(base::Value(std::move(callback_id_)), data); + callback_id_.clear(); }
diff --git a/chrome/browser/ui/webui/domain_reliability_internals_ui.h b/chrome/browser/ui/webui/domain_reliability_internals_ui.h index 384474ea..1c08e86 100644 --- a/chrome/browser/ui/webui/domain_reliability_internals_ui.h +++ b/chrome/browser/ui/webui/domain_reliability_internals_ui.h
@@ -6,10 +6,12 @@ #define CHROME_BROWSER_UI_WEBUI_DOMAIN_RELIABILITY_INTERNALS_UI_H_ #include <memory> +#include <string> #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/web_ui_controller.h" +#include "content/public/browser/web_ui_message_handler.h" namespace base { class ListValue; @@ -22,13 +24,25 @@ explicit DomainReliabilityInternalsUI(content::WebUI* web_ui); ~DomainReliabilityInternalsUI() override; - private: - void UpdateData(const base::ListValue* args); - void OnDataUpdated(base::Value data) const; - - base::WeakPtrFactory<DomainReliabilityInternalsUI> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(DomainReliabilityInternalsUI); }; +class DomainReliabilityInternalsHandler : public content::WebUIMessageHandler { + public: + DomainReliabilityInternalsHandler(); + ~DomainReliabilityInternalsHandler() override; + + // content::WebUIMessageHandler: + void RegisterMessages() override; + + private: + void HandleUpdateData(const base::ListValue* args); + void OnDataUpdated(base::Value data); + + std::string callback_id_; + base::WeakPtrFactory<DomainReliabilityInternalsHandler> weak_factory_{this}; + + DISALLOW_COPY_AND_ASSIGN(DomainReliabilityInternalsHandler); +}; + #endif // CHROME_BROWSER_UI_WEBUI_DOMAIN_RELIABILITY_INTERNALS_UI_H_
diff --git a/chrome/browser/ui/webui/media/webrtc_logs_ui.cc b/chrome/browser/ui/webui/media/webrtc_logs_ui.cc index 0e3f9cb..a69083d 100644 --- a/chrome/browser/ui/webui/media/webrtc_logs_ui.cc +++ b/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
@@ -27,6 +27,7 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/webrtc_logs_resources.h" +#include "chrome/grit/webrtc_logs_resources_map.h" #include "components/prefs/pref_service.h" #include "components/upload_list/upload_list.h" #include "components/version_info/version_info.h" @@ -78,8 +79,9 @@ AddLocalizedStringsBulk(source, kStrings); source->UseStringsJs(); - source->AddResourcePath("webrtc_logs.js", IDR_WEBRTC_LOGS_JS); - source->SetDefaultResource(IDR_WEBRTC_LOGS_HTML); + webui::AddResourcePathsBulk( + source, base::make_span(kWebrtcLogsResources, kWebrtcLogsResourcesSize)); + source->SetDefaultResource(IDR_WEBRTC_LOGS_WEBRTC_LOGS_HTML); return source; }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index acc872f..a464292 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -1081,10 +1081,7 @@ return extension_printer_handler_.get(); } #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) - if (printer_type == PrinterType::kPrivet && - (base::FeatureList::IsEnabled(features::kForceEnablePrivetPrinting) || - GetPrefs()->GetBoolean( - prefs::kCloudPrintDeprecationWarningsSuppressed))) { + if (printer_type == PrinterType::kPrivet) { if (!privet_printer_handler_) { privet_printer_handler_ = PrinterHandler::CreateForPrivetPrinters(Profile::FromWebUI(web_ui())); @@ -1156,8 +1153,7 @@ DCHECK(!identity_manager_); cloud_print_enabled_ = !base::Contains(printer_type_deny_list_, PrinterType::kCloud) && - GetPrefs()->GetBoolean(prefs::kCloudPrintSubmitEnabled) && - GetPrefs()->GetBoolean(prefs::kCloudPrintDeprecationWarningsSuppressed); + GetPrefs()->GetBoolean(prefs::kCloudPrintSubmitEnabled); if (!cloud_print_enabled_) return;
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 ac1ba79..ac1fc3f 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -48,8 +48,8 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/browser_resources.h" #include "chrome/grit/chromium_strings.h" -#include "chrome/grit/component_extension_resources.h" #include "chrome/grit/generated_resources.h" +#include "chrome/grit/pdf_resources.h" #include "chrome/grit/print_preview_resources.h" #include "chrome/grit/print_preview_resources_map.h" #include "chromeos/constants/chromeos_features.h" @@ -381,9 +381,7 @@ source->AddBoolean("isEnterpriseManaged", webui::IsEnterpriseManaged()); - bool cloud_print_deprecation_warnings_suppressed = - profile->GetPrefs()->GetBoolean( - prefs::kCloudPrintDeprecationWarningsSuppressed); + bool cloud_print_deprecation_warnings_suppressed = true; source->AddBoolean("cloudPrintDeprecationWarningsSuppressed", cloud_print_deprecation_warnings_suppressed); @@ -415,11 +413,14 @@ {"pdf/browser_api.js", IDR_PDF_BROWSER_API_JS}, {"pdf/constants.js", IDR_PDF_CONSTANTS_JS}, {"pdf/controller.js", IDR_PDF_CONTROLLER_JS}, - {"pdf/elements/icons.js", IDR_PDF_ICONS_JS}, - {"pdf/elements/shared-vars.js", IDR_PDF_SHARED_VARS_JS}, - {"pdf/elements/viewer-error-screen.js", IDR_PDF_VIEWER_ERROR_SCREEN_JS}, - {"pdf/elements/viewer-zoom-button.js", IDR_PDF_VIEWER_ZOOM_BUTTON_JS}, - {"pdf/elements/viewer-zoom-toolbar.js", IDR_PDF_VIEWER_ZOOM_SELECTOR_JS}, + {"pdf/elements/icons.js", IDR_PDF_ELEMENTS_ICONS_JS}, + {"pdf/elements/shared-vars.js", IDR_PDF_ELEMENTS_SHARED_VARS_JS}, + {"pdf/elements/viewer-error-screen.js", + IDR_PDF_ELEMENTS_VIEWER_ERROR_SCREEN_JS}, + {"pdf/elements/viewer-zoom-button.js", + IDR_PDF_ELEMENTS_VIEWER_ZOOM_BUTTON_JS}, + {"pdf/elements/viewer-zoom-toolbar.js", + IDR_PDF_ELEMENTS_VIEWER_ZOOM_TOOLBAR_JS}, {"pdf/gesture_detector.js", IDR_PDF_GESTURE_DETECTOR_JS}, {"pdf/index.css", IDR_PDF_INDEX_CSS}, {"pdf/main.js", IDR_PDF_MAIN_JS},
diff --git a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc index 5ea3b9f8..5d861f94 100644 --- a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
@@ -509,6 +509,14 @@ {"assignSelectSwitchLabel", IDS_SETTINGS_ASSIGN_SELECT_SWITCH_LABEL}, {"assignNextSwitchLabel", IDS_SETTINGS_ASSIGN_NEXT_SWITCH_LABEL}, {"assignPreviousSwitchLabel", IDS_SETTINGS_ASSIGN_PREVIOUS_SWITCH_LABEL}, + {"switchAccessInternalDeviceTypeLabel", + IDS_SETTINGS_SWITCH_ACCESS_INTERNAL_DEVICE_TYPE_LABEL}, + {"switchAccessUsbDeviceTypeLabel", + IDS_SETTINGS_SWITCH_ACCESS_USB_DEVICE_TYPE_LABEL}, + {"switchAccessBluetoothDeviceTypeLabel", + IDS_SETTINGS_SWITCH_ACCESS_BLUETOOTH_DEVICE_TYPE_LABEL}, + {"switchAccessUnknownDeviceTypeLabel", + IDS_SETTINGS_SWITCH_ACCESS_UNKNOWN_DEVICE_TYPE_LABEL}, {"switchAccessActionAssignmentDialogAssignedIconLabel", IDS_SETTINGS_SWITCH_ACCESS_ACTION_ASSIGNMENT_DIALOG_ASSIGNED_ICON_LABEL}, {"switchAccessActionAssignmentDialogAddAssignmentIconLabel", @@ -535,6 +543,7 @@ IDS_SETTINGS_SWITCH_ACCESS_ACTION_ASSIGNMENT_DIALOG_WAIT_FOR_CONFIRMATION_REMOVAL_PROMPT}, {"switchAccessActionAssignmentDialogWarnCannotRemoveLastSelectSwitch", IDS_SETTINGS_SWITCH_ACCESS_ACTION_ASSIGNMENT_DIALOG_WARN_CANNOT_REMOVE_LAST_SELECT_SWITCH}, + {"switchAndDeviceType", IDS_SETTINGS_SWITCH_AND_DEVICE_TYPE}, {"noSwitchesAssigned", IDS_SETTINGS_NO_SWITCHES_ASSIGNED}, {"switchAccessActionAssignmentDialogExit", IDS_SETTINGS_SWITCH_ACCESS_ACTION_ASSIGNMENT_DIALOG_EXIT},
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc index 756ee38d..a7d96dc 100644 --- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
@@ -36,6 +36,8 @@ namespace settings { namespace { +using FeatureState = multidevice_setup::mojom::FeatureState; + const std::vector<SearchConcept>& GetMultiDeviceOptedInSearchConcepts() { static const base::NoDestructor<std::vector<SearchConcept>> tags( {{IDS_OS_SETTINGS_TAG_MULTIDEVICE_FORGET, @@ -551,14 +553,11 @@ host_status_with_device) { SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); updater.RemoveSearchTags(GetMultiDeviceOptedOutSearchConcepts()); - updater.RemoveSearchTags(GetMultiDeviceOptedInPhoneHubSearchConcepts()); updater.RemoveSearchTags(GetMultiDeviceOptedInWifiSyncSearchConcepts()); updater.RemoveSearchTags(GetMultiDeviceOptedInSearchConcepts()); if (IsOptedIn(host_status_with_device.first)) { updater.AddSearchTags(GetMultiDeviceOptedInSearchConcepts()); - if (features::IsPhoneHubEnabled()) - updater.AddSearchTags(GetMultiDeviceOptedInPhoneHubSearchConcepts()); if (features::IsWifiSyncAndroidEnabled()) updater.AddSearchTags(GetMultiDeviceOptedInWifiSyncSearchConcepts()); } else { @@ -571,11 +570,14 @@ feature_states_map) { SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); updater.RemoveSearchTags(GetSmartLockOptionsSearchConcepts()); + updater.RemoveSearchTags(GetMultiDeviceOptedInPhoneHubSearchConcepts()); if (feature_states_map.at(multidevice_setup::mojom::Feature::kSmartLock) == multidevice_setup::mojom::FeatureState::kEnabledByUser) { updater.AddSearchTags(GetSmartLockOptionsSearchConcepts()); } + if (IsPhoneHubSupported()) + updater.AddSearchTags(GetMultiDeviceOptedInPhoneHubSearchConcepts()); } void MultiDeviceSection::OnNearbySharingEnabledChanged() { @@ -590,5 +592,12 @@ } } +bool MultiDeviceSection::IsPhoneHubSupported() { + const FeatureState feature_state = multidevice_setup_client_->GetFeatureState( + multidevice_setup::mojom::Feature::kPhoneHub); + return feature_state != FeatureState::kNotSupportedByPhone && + feature_state != FeatureState::kNotSupportedByChromebook; +} + } // namespace settings } // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h index f420b8a9..36632194 100644 --- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h +++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.h
@@ -68,6 +68,8 @@ // Nearby Share enabled pref change observer. void OnNearbySharingEnabledChanged(); + bool IsPhoneHubSupported(); + multidevice_setup::MultiDeviceSetupClient* multidevice_setup_client_; phonehub::PhoneHubManager* phone_hub_manager_; android_sms::AndroidSmsService* android_sms_service_;
diff --git a/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc b/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc index 05b573b0..b6c8ffe9 100644 --- a/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc
@@ -137,15 +137,17 @@ base::DictionaryValue response; response.SetIntPath("keyCode", static_cast<int>(event->key_code())); response.SetStringPath("key", GetStringForKeyboardCode(event->key_code())); + ui::InputDeviceType deviceType = ui::INPUT_DEVICE_UNKNOWN; int source_device_id = event->source_device_id(); for (const auto& keyboard : ui::DeviceDataManager::GetInstance()->GetKeyboardDevices()) { if (source_device_id == keyboard.id) { - response.SetStringPath("device", GetSwitchAccessDevice(keyboard.type)); + deviceType = keyboard.type; break; } } + response.SetStringPath("device", GetSwitchAccessDevice(deviceType)); FireWebUIListener("switch-access-got-key-press-for-assignment", response); } @@ -186,17 +188,18 @@ auto* keycodes = prefs_->GetDictionary(info.pref_name); base::ListValue keys; for (const auto& item : keycodes->DictItems()) { - base::DictionaryValue key; int key_code; if (!base::StringToInt(item.first, &key_code)) { NOTREACHED(); return; } - key.SetStringPath("key", GetStringForKeyboardCode( - static_cast<ui::KeyboardCode>(key_code))); - key.SetPath("devices", item.second.Clone()); - - keys.Append(std::move(key)); + for (const base::Value& device_type : item.second.GetList()) { + base::DictionaryValue key; + key.SetStringPath("key", GetStringForKeyboardCode( + static_cast<ui::KeyboardCode>(key_code))); + key.SetStringPath("device", device_type.GetString()); + keys.Append(std::move(key)); + } } response.SetPath(info.action_name_for_js, std::move(keys)); }
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index 707c936..d4aa5a07 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -817,22 +817,26 @@ web_contents->GetDelegate()->ActivateContents(web_contents); } -void PeopleHandler::OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) { - // After a primary account was set, the Sync setup will start soon. Grab a - // SetupInProgressHandle right now to avoid a temporary "missing Sync - // confirmation" error in the avatar menu. See crbug.com/928696. - syncer::SyncService* service = GetSyncService(); - if (service && !sync_blocker_) - sync_blocker_ = service->GetSetupInProgressHandle(); - - UpdateSyncStatus(); -} - -void PeopleHandler::OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) { - sync_blocker_.reset(); - UpdateSyncStatus(); +void PeopleHandler::OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) { + switch (event.GetEventTypeFor(signin::ConsentLevel::kSync)) { + case signin::PrimaryAccountChangeEvent::Type::kSet: { + // After a primary account was set, the Sync setup will start soon. Grab a + // SetupInProgressHandle right now to avoid a temporary "missing Sync + // confirmation" error in the avatar menu. See crbug.com/928696. + syncer::SyncService* service = GetSyncService(); + if (service && !sync_blocker_) + sync_blocker_ = service->GetSetupInProgressHandle(); + UpdateSyncStatus(); + return; + } + case signin::PrimaryAccountChangeEvent::Type::kCleared: + sync_blocker_.reset(); + UpdateSyncStatus(); + return; + case signin::PrimaryAccountChangeEvent::Type::kNone: + return; + } } void PeopleHandler::OnStateChanged(syncer::SyncService* sync) {
diff --git a/chrome/browser/ui/webui/settings/people_handler.h b/chrome/browser/ui/webui/settings/people_handler.h index fdc26132..e189aec8 100644 --- a/chrome/browser/ui/webui/settings/people_handler.h +++ b/chrome/browser/ui/webui/settings/people_handler.h
@@ -126,10 +126,8 @@ void FocusUI() override; // IdentityManager::Observer implementation. - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override; - void OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) override; + void OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) override; void OnExtendedAccountInfoUpdated(const AccountInfo& info) override; void OnExtendedAccountInfoRemoved(const AccountInfo& info) override;
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc index 18421be..66553cd 100644 --- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc +++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
@@ -181,6 +181,8 @@ l10n_util::GetStringUTF8(confirmButtonStringID)); parameters.SetStringKey("cancelButtonLabel", l10n_util::GetStringUTF8(cancelButtonStringID)); + parameters.SetBoolKey("showGuestOption", + bubble_parameters_.show_guest_option); parameters.SetKey("interceptedAccount", GetAccountInfoValue(intercepted_account())); parameters.SetStringKey("headerBackgroundColor",
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc index f8e2153..09d0d158 100644 --- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc +++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.cc
@@ -33,7 +33,6 @@ source->AddResourcePath("signin_vars_css.js", IDR_SIGNIN_VARS_CSS_JS); source->AddLocalizedString("guestLink", IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_GUEST_LINK); - source->AddBoolean("shouldShowGuest", ShouldShowGuestOption()); source->UseStringsJs(); // Resources for testing. @@ -49,12 +48,6 @@ DiceWebSigninInterceptUI::~DiceWebSigninInterceptUI() = default; -// static -bool DiceWebSigninInterceptUI::ShouldShowGuestOption() { - return Profile::IsEphemeralGuestProfileEnabled() && - !ProfileManager::GuestProfileExists(); -} - void DiceWebSigninInterceptUI::Initialize( const DiceWebSigninInterceptor::Delegate::BubbleParameters& bubble_parameters,
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.h b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.h index c2aafa7d..f937ed0 100644 --- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.h +++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_ui.h
@@ -28,8 +28,6 @@ bubble_parameters, base::OnceCallback<void(SigninInterceptionUserChoice)> callback); - static bool ShouldShowGuestOption(); - private: WEB_UI_CONTROLLER_TYPE_DECL(); };
diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc index c0099ea..d82d5a5 100644 --- a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc +++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
@@ -83,9 +83,14 @@ FAIL() << "Sign in observer timed out!"; } - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override { - DVLOG(1) << "Google signin succeeded."; + void OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) override { + if (event.GetEventTypeFor(signin::ConsentLevel::kSync) != + signin::PrimaryAccountChangeEvent::Type::kSet) { + return; + } + + DVLOG(1) << "Sign in finished: Sync primary account was set."; signed_in_ = true; QuitLoopRunner(); }
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java index e0dfcd3e..b8dc909 100644 --- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java +++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java
@@ -84,7 +84,8 @@ ImageFetcher.VIDEO_TUTORIALS_IPH_UMA_CLIENT_NAME, widthPx, heightPx); if (useAnimatedGifUrl) { mImageFetcher.fetchGif(params, gifImage -> { - BaseGifDrawable baseGifDrawable = new BaseGifDrawable(gifImage, Config.ARGB_8888); + BaseGifDrawable baseGifDrawable = + gifImage == null ? null : new BaseGifDrawable(gifImage, Config.ARGB_8888); consumer.onResult(baseGifDrawable); }); } else {
diff --git a/chrome/browser/web_applications/components/app_shortcut_manager.cc b/chrome/browser/web_applications/components/app_shortcut_manager.cc index 4c0c077c..5b8ebd3c 100644 --- a/chrome/browser/web_applications/components/app_shortcut_manager.cc +++ b/chrome/browser/web_applications/components/app_shortcut_manager.cc
@@ -27,6 +27,10 @@ constexpr const char* kCreationResultMetric = "WebApp.Shortcuts.Creation.Result"; +// UMA metric name for shortcuts deletion result. +constexpr const char* kDeletionResultMetric = + "WebApp.Shortcuts.Deletion.Success"; + // Result of shortcuts creation process. // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. @@ -96,6 +100,21 @@ std::move(callback)))); } +void AppShortcutManager::DeleteShortcuts( + const AppId& app_id, + const base::FilePath& shortcuts_data_dir, + std::unique_ptr<ShortcutInfo> shortcut_info, + DeleteShortcutsCallback callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(CanCreateShortcuts()); + + internals::ScheduleDeletePlatformShortcuts( + shortcuts_data_dir, std::move(shortcut_info), + base::BindOnce(&AppShortcutManager::OnShortcutsDeleted, + weak_ptr_factory_.GetWeakPtr(), app_id, + std::move(callback))); +} + void AppShortcutManager::ReadAllShortcutsMenuIconsAndRegisterShortcutsMenu( const AppId& app_id, RegisterShortcutsMenuCallback callback) { @@ -155,6 +174,15 @@ std::move(callback).Run(success); } +void AppShortcutManager::OnShortcutsDeleted(const AppId& app_id, + DeleteShortcutsCallback callback, + bool success) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + UMA_HISTOGRAM_BOOLEAN(kDeletionResultMetric, success); + + std::move(callback).Run(success); +} + void AppShortcutManager::OnShortcutInfoRetrievedCreateShortcuts( bool add_to_desktop, CreateShortcutsCallback callback,
diff --git a/chrome/browser/web_applications/components/app_shortcut_manager.h b/chrome/browser/web_applications/components/app_shortcut_manager.h index 1f5fff54..74bfb46 100644 --- a/chrome/browser/web_applications/components/app_shortcut_manager.h +++ b/chrome/browser/web_applications/components/app_shortcut_manager.h
@@ -52,6 +52,10 @@ CreateShortcutsCallback callback); void UpdateShortcuts(const web_app::AppId& app_id, base::StringPiece old_name); + void DeleteShortcuts(const AppId& app_id, + const base::FilePath& shortcuts_data_dir, + std::unique_ptr<ShortcutInfo> shortcut_info, + DeleteShortcutsCallback callback); // TODO(crbug.com/1098471): Move this into web_app_shortcuts_menu_win.cc when // a callback is integrated into the Shortcuts Menu registration flow. @@ -97,6 +101,9 @@ void OnShortcutsCreated(const AppId& app_id, CreateShortcutsCallback callback, bool success); + void OnShortcutsDeleted(const AppId& app_id, + DeleteShortcutsCallback callback, + bool success); AppRegistrar* registrar() { return registrar_; } Profile* profile() { return profile_; }
diff --git a/chrome/browser/web_applications/components/os_integration_manager.cc b/chrome/browser/web_applications/components/os_integration_manager.cc index 9b8e4b1..e6c99e59 100644 --- a/chrome/browser/web_applications/components/os_integration_manager.cc +++ b/chrome/browser/web_applications/components/os_integration_manager.cc
@@ -433,11 +433,17 @@ const base::FilePath& shortcuts_data_dir, std::unique_ptr<ShortcutInfo> shortcut_info, DeleteShortcutsCallback callback) { - internals::ScheduleDeletePlatformShortcuts( - shortcuts_data_dir, std::move(shortcut_info), - base::BindOnce(&OsIntegrationManager::OnShortcutsDeleted, - weak_ptr_factory_.GetWeakPtr(), app_id, - std::move(callback))); + if (shortcut_manager_->CanCreateShortcuts()) { + auto shortcuts_callback = base::BindOnce( + &OsIntegrationManager::OnShortcutsDeleted, + weak_ptr_factory_.GetWeakPtr(), app_id, std::move(callback)); + + shortcut_manager_->DeleteShortcuts(app_id, shortcuts_data_dir, + std::move(shortcut_info), + std::move(shortcuts_callback)); + } else { + std::move(callback).Run(false); + } } void OsIntegrationManager::UnregisterFileHandlers(const AppId& app_id) {
diff --git a/chrome/browser/web_applications/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_app_manager.cc index a9778f2..6c624eef 100644 --- a/chrome/browser/web_applications/system_web_app_manager.cc +++ b/chrome/browser/web_applications/system_web_app_manager.cc
@@ -132,10 +132,8 @@ extension_misc::kCameraAppId}; } // We need "FileHandling" to use File Handling API to set launch directory. - // And we need "NativeFileSystem2" to use Native File System API. infos.at(SystemAppType::CAMERA).enabled_origin_trials = - OriginTrialsMap({{GetOrigin("chrome://camera-app"), - {"FileHandling", "NativeFileSystem2"}}}); + OriginTrialsMap({{GetOrigin("chrome://camera-app"), {"FileHandling"}}}); infos.at(SystemAppType::CAMERA).capture_navigations = true; // TODO(b/172343409): Remove this log when the camera app is fully migrated @@ -192,8 +190,7 @@ infos.at(SystemAppType::MEDIA).show_in_launcher = false; infos.at(SystemAppType::MEDIA).show_in_search = false; infos.at(SystemAppType::MEDIA).enabled_origin_trials = - OriginTrialsMap({{GetOrigin("chrome://media-app"), - {"FileHandling", "NativeFileSystem2"}}}); + OriginTrialsMap({{GetOrigin("chrome://media-app"), {"FileHandling"}}}); } if (SystemWebAppManager::IsAppEnabled(SystemAppType::PRINT_MANAGEMENT)) {
diff --git a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc index b4c4d3b..0e78a57 100644 --- a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
@@ -915,7 +915,7 @@ maybe_installation_ = TestSystemWebAppInstallation::SetUpAppWithEnabledOriginTrials( OriginTrialsMap({{GetOrigin(GURL("chrome://test-system-app/")), - {"NativeFileSystem2", "FileHandling"}}}), + {"FileHandling"}}}), install_from_web_app_info()); } @@ -1073,7 +1073,7 @@ TestSystemWebAppInstallation::SetUpAppWithEnabledOriginTrials( OriginTrialsMap( {{url::Origin::Create(GURL("chrome://test-system-app/")), - {"NativeFileSystem2", "FileHandling"}}}), + {"FileHandling"}}}), install_from_web_app_info()); } else { maybe_installation_ = TestSystemWebAppInstallation::SetUpWithoutApps();
diff --git a/chrome/browser/webapps/chrome_webapps_client.cc b/chrome/browser/webapps/chrome_webapps_client.cc index 9c0b640b..038dc5fb 100644 --- a/chrome/browser/webapps/chrome_webapps_client.cc +++ b/chrome/browser/webapps/chrome_webapps_client.cc
@@ -13,6 +13,9 @@ #include "chrome/browser/android/tab_android.h" #include "chrome/browser/android/tab_web_contents_delegate_android.h" #include "chrome/browser/android/webapk/webapk_install_service.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/tracker.h" #endif namespace webapps { @@ -84,6 +87,15 @@ tab->web_contents()->GetDelegate()) ->CanShowAppBanners(); } + +void ChromeWebappsClient::OnWebApkInstallInitiatedFromAppMenu( + content::WebContents* web_contents) { + DVLOG(2) << "Sending event: IPH used for Installing PWA"; + feature_engagement::Tracker* tracker = + feature_engagement::TrackerFactory::GetForBrowserContext( + web_contents->GetBrowserContext()); + tracker->NotifyEvent(feature_engagement::events::kPwaInstallMenuSelected); +} #endif } // namespace webapps
diff --git a/chrome/browser/webapps/chrome_webapps_client.h b/chrome/browser/webapps/chrome_webapps_client.h index 0227c9b..b12377f 100644 --- a/chrome/browser/webapps/chrome_webapps_client.h +++ b/chrome/browser/webapps/chrome_webapps_client.h
@@ -29,6 +29,8 @@ bool IsInstallationInProgress(content::WebContents* web_contents, const GURL& manifest_url) override; bool CanShowAppBanners(content::WebContents* web_contents) override; + void OnWebApkInstallInitiatedFromAppMenu( + content::WebContents* web_contents) override; #endif private:
diff --git a/chrome/browser/webshare/BUILD.gn b/chrome/browser/webshare/BUILD.gn index 72725dd9..c36e2002 100644 --- a/chrome/browser/webshare/BUILD.gn +++ b/chrome/browser/webshare/BUILD.gn
@@ -4,8 +4,8 @@ import("//build/config/chromeos/ui_mode.gni") -static_library("storage") { - if (is_chromeos || is_mac) { +if (is_chromeos || is_mac) { + static_library("storage") { sources = [ "prepare_directory_task.cc", "prepare_directory_task.h",
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 3f5ab7e..2fa423c 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1610063718-75764fb6f7cc7a2d4d8119e0952784a5ac3fa72a.profdata +chrome-linux-master-1610215000-b69940577779e97f408887c78f00b942182f0cb0.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 215ab39..7babfb21 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-master-1610063718-47f197c900d6e73c3c9b6aad05d4a947c6371a56.profdata +chrome-win32-master-1610193586-4fd7091c1af4571ccc29c3417201df96284922c2.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 9d2ddde..95d79a9 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1610063718-6db51055255b71b3272f9db93116d992601c9633.profdata +chrome-win64-master-1610215000-f68b7f659ca688b20c93b8d50be0555b11c1b418.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 58f9c54..6ad9c87 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -268,6 +268,10 @@ "//extensions:extensions_resources", ] } + if (enable_plugins) { + sources += [ "$root_gen_dir/chrome/pdf_resources.pak" ] + deps += [ "//chrome/browser/resources/pdf:pdf_resources" ] + } if (enable_print_preview) { sources += [ "$root_gen_dir/chrome/print_preview_resources.pak" ] deps +=
diff --git a/chrome/common/channel_info.h b/chrome/common/channel_info.h index 5958587..b9e0d89 100644 --- a/chrome/common/channel_info.h +++ b/chrome/common/channel_info.h
@@ -42,6 +42,12 @@ version_info::Channel GetChannel(); #if defined(OS_MAC) +// Because the channel information on the Mac is baked into the Info.plist file, +// and that file may change during an update, this function must be called +// early in startup to cache the channel info so that the correct channel info +// can be returned later. +void CacheChannelInfo(); + // Maps the name of the channel to version_info::Channel, always returning // Channel::UNKNOWN for unbranded builds. For branded builds defaults to // Channel::STABLE, if channel is empty, else matches the name and returns
diff --git a/chrome/common/channel_info_mac.mm b/chrome/common/channel_info_mac.mm index 848ef7e..e9e7931 100644 --- a/chrome/common/channel_info_mac.mm +++ b/chrome/common/channel_info_mac.mm
@@ -7,53 +7,101 @@ #import <Foundation/Foundation.h> #include "base/mac/bundle_locations.h" +#include "base/macros.h" +#include "base/no_destructor.h" #include "base/strings/sys_string_conversions.h" #include "build/branding_buildflags.h" #include "components/version_info/version_info.h" namespace chrome { -std::string GetChannelName() { +namespace { + +std::string ChannelName() { #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - // Use the main Chrome application bundle and not the framework bundle. - // Keystone keys don't live in the framework. - NSBundle* bundle = base::mac::OuterBundle(); - NSString* channel = [bundle objectForInfoDictionaryKey:@"KSChannelID"]; + static const base::NoDestructor<std::string> channel([] { + // Use the main Chrome application bundle and not the framework bundle. + // Keystone keys don't live in the framework. + NSBundle* bundle = base::mac::OuterBundle(); + NSString* channel = [bundle objectForInfoDictionaryKey:@"KSChannelID"]; - // Only ever return "", "unknown", "beta", "dev", or "canary" in a branded - // build. - // KSProductID is not set (for stable) or "beta", "dev" or "canary" for - // the intel-only build. - // KSProductID is "arm64" (for stable) or "arm64-beta", "arm64-dev" or - // "arm64-canary" for the arm-only build. - // KSProductID is "universal" (for stable) or "universal-beta", - // "universal-dev" or "universal-canary" for the arm+intel universal binary. - if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) { - // This build is not Keystone-enabled, it can't have a channel. - channel = @"unknown"; - } else if (!channel || [channel isEqual:@"arm64"] || - [channel isEqual:@"universal"]) { - // For the intel stable channel, KSChannelID is not set. - channel = @""; - } else { - if ([channel hasPrefix:@"arm64-"]) - channel = [channel substringFromIndex:[@"arm64-" length]]; - else if ([channel hasPrefix:@"universal-"]) - channel = [channel substringFromIndex:[@"universal-" length]]; - if ([channel isEqual:@"beta"] || [channel isEqual:@"dev"] || - [channel isEqual:@"canary"]) { - // do nothing. - } else { + // Only ever return "", "unknown", "beta", "dev", or "canary" in a branded + // build. + // KSProductID is not set (for stable) or "beta", "dev" or "canary" for + // the intel-only build. + // KSProductID is "arm64" (for stable) or "arm64-beta", "arm64-dev" or + // "arm64-canary" for the arm-only build. + // KSProductID is "universal" (for stable) or "universal-beta", + // "universal-dev" or "universal-canary" for the arm+intel universal binary. + if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) { + // This build is not Keystone-enabled, it can't have a channel. channel = @"unknown"; + } else if (!channel || [channel isEqual:@"arm64"] || + [channel isEqual:@"universal"]) { + // For the intel stable channel, KSChannelID is not set. + channel = @""; + } else { + if ([channel hasPrefix:@"arm64-"]) + channel = [channel substringFromIndex:[@"arm64-" length]]; + else if ([channel hasPrefix:@"universal-"]) + channel = [channel substringFromIndex:[@"universal-" length]]; + if ([channel isEqual:@"beta"] || [channel isEqual:@"dev"] || + [channel isEqual:@"canary"]) { + // Do nothing. + } else { + channel = @"unknown"; + } } - } - return base::SysNSStringToUTF8(channel); + return base::SysNSStringToUTF8(channel); + }()); + return *channel; #else return std::string(); #endif } +bool SideBySideCapable() { +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + static const base::NoDestructor<bool> capable([] { + // Use the main Chrome application bundle and not the framework bundle. + // Keystone keys don't live in the framework. + NSBundle* bundle = base::mac::OuterBundle(); + if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) { + // This build is not Keystone-enabled, and without a channel assume it is + // side-by-side capable. + return true; + } + + if (GetChannelName().empty()) { + // For the stable channel, GetChannelName() returns the empty string. + // Stable Chromes are what side-by-side capable Chromes are running + // side-by-side *to* and by definition are side-by-side capable. + return true; + } + + // If there is a CrProductDirName key, then the user data dir of this + // beta/dev/canary Chrome is separate, and it can run side-by-side to the + // stable Chrome. + return [bundle objectForInfoDictionaryKey:@"CrProductDirName"]; + }()); + return *capable; +#else + return true; +#endif +} + +} // namespace + +void CacheChannelInfo() { + ignore_result(ChannelName()); + ignore_result(SideBySideCapable()); +} + +std::string GetChannelName() { + return ChannelName(); +} + version_info::Channel GetChannelByName(const std::string& channel) { #if BUILDFLAG(GOOGLE_CHROME_BRANDING) if (channel.empty()) @@ -69,34 +117,11 @@ } bool IsSideBySideCapable() { -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - // Use the main Chrome application bundle and not the framework bundle. - // Keystone keys don't live in the framework. - NSBundle* bundle = base::mac::OuterBundle(); - if (![bundle objectForInfoDictionaryKey:@"KSProductID"]) { - // This build is not Keystone-enabled, and without a channel assume it is - // side-by-side capable. - return true; - } - - if (GetChannelName().empty()) { - // For the stable channel, GetChannelName() returns the empty string. - // Stable Chromes are what side-by-side capable Chromes are running - // side-by-side *to* and by definition are side-by-side capable. - return true; - } - - // If there is a CrProductDirName key, then the user data dir of this - // beta/dev/canary Chrome is separate, and it can run side-by-side to the - // stable Chrome. - return [bundle objectForInfoDictionaryKey:@"CrProductDirName"]; -#else - return true; -#endif + return SideBySideCapable(); } version_info::Channel GetChannel() { - return GetChannelByName(GetChannelName()); + return GetChannelByName(ChannelName()); } } // namespace chrome
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 5660057..982cd07 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -735,7 +735,13 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kRemoveStatusBarInWebApps{ - "RemoveStatusBarInWebApps", base::FEATURE_DISABLED_BY_DEFAULT}; + "RemoveStatusBarInWebApps", +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + base::FEATURE_ENABLED_BY_DEFAULT +#else + base::FEATURE_DISABLED_BY_DEFAULT +#endif +}; #if BUILDFLAG(IS_CHROMEOS_ASH) // Enables permanent removal of Legacy Supervised Users on startup.
diff --git a/chrome/common/extensions/api/scripting.idl b/chrome/common/extensions/api/scripting.idl index 4da3b22..d8fe32a 100644 --- a/chrome/common/extensions/api/scripting.idl +++ b/chrome/common/extensions/api/scripting.idl
@@ -8,7 +8,7 @@ callback InjectedFunction = void(); // The origin for a style change. - // See <href="https://developer.mozilla.org/en-US/docs/Glossary/Style_origin">style origins</href> + // See <a href="https://developer.mozilla.org/en-US/docs/Glossary/Style_origin">style origins</a> // for more info. enum StyleOrigin { AUTHOR, @@ -19,7 +19,7 @@ // The ID of the tab into which to inject. long tabId; - // The <a href="https://developer.chrome.com/extensions/webNavigation#frame_ids">IDs</href> + // The <a href="https://developer.chrome.com/extensions/webNavigation#frame_ids">IDs</a> // of specific frames to inject into. long[]? frameIds;
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn index a75484da..5f5cb1c 100644 --- a/chrome/installer/mini_installer/BUILD.gn +++ b/chrome/installer/mini_installer/BUILD.gn
@@ -111,206 +111,176 @@ data_deps = [ "//chrome/installer/setup" ] } -# Generates a mini installer. -# -# out_dir (required) -# The output directory out_dir where the mini_installer image should be -# written. -# -# chrome_dll_file (required) -# The path to the version of chrome.dll that should be included in the -# installer archive. -# -# chrome_dll_target (required) -# The target that generated chrome_dll_file. -# -# deps (required) -# Normal meaning. -template("generate_mini_installer") { - chrome_dll_file = invoker.chrome_dll_file - chrome_dll_target = invoker.chrome_dll_target - output_dir = invoker.out_dir +packed_files_rc_file = "$target_gen_dir/mini_installer/packed_files.rc" - packed_files_rc_file = "$target_gen_dir/$target_name/packed_files.rc" - archive_name = target_name + "_archive" - staging_dir = "$target_gen_dir/$target_name" +# TODO(crbug.com/1112471): Get this to run cleanly under Python 3. +python2_action("mini_installer_archive") { + script = "//chrome/tools/build/win/create_installer_archive.py" - # TODO(crbug.com/1112471): Get this to run cleanly under Python 3. - python2_action(archive_name) { - script = "//chrome/tools/build/win/create_installer_archive.py" + release_file = "chrome.release" - release_file = "chrome.release" + inputs = [ + "$root_out_dir/chrome.dll", + "$root_out_dir/chrome.exe", + "$root_out_dir/locales/en-US.pak", + "$root_out_dir/setup.exe", + "//chrome/tools/build/win/makecab.py", + release_file, + ] - inputs = [ - "$chrome_dll_file", - "$root_out_dir/chrome.exe", - "$root_out_dir/locales/en-US.pak", - "$root_out_dir/setup.exe", - "//chrome/tools/build/win/makecab.py", - release_file, - ] + outputs = [ + # See also chrome.packed.7z conditionally added below. + "$root_out_dir/chrome.7z", + "$root_out_dir/setup.ex_", + packed_files_rc_file, + ] + args = [ + "--build_dir", + rebase_path(root_out_dir, root_build_dir), + "--staging_dir", + rebase_path("$target_gen_dir/mini_installer", root_build_dir), + "--input_file", + rebase_path(release_file, root_build_dir), + "--resource_file_path", + rebase_path(packed_files_rc_file, root_build_dir), + "--target_arch=$current_cpu", + "--distribution=_${branding_path_component}", + "--output_dir", + rebase_path(root_out_dir, root_build_dir), + "--chrome_runtime_deps", + rebase_path(chrome_runtime_deps, root_build_dir), + "--setup_runtime_deps", + rebase_path(setup_runtime_deps, root_build_dir), - outputs = [ - # See also chrome.packed.7z conditionally added below. - "$output_dir/chrome.7z", - "$output_dir/setup.ex_", - packed_files_rc_file, - ] - args = [ - "--build_dir", - rebase_path(root_out_dir, root_build_dir), - "--staging_dir", - rebase_path(staging_dir, root_build_dir), - "--input_file", - rebase_path(release_file, root_build_dir), - "--resource_file_path", - rebase_path(packed_files_rc_file, root_build_dir), - "--target_arch=$current_cpu", - "--distribution=_${branding_path_component}", - "--output_dir", - rebase_path(output_dir, root_build_dir), - "--chrome_runtime_deps", - rebase_path(chrome_runtime_deps, root_build_dir), - "--setup_runtime_deps", - rebase_path(setup_runtime_deps, root_build_dir), + # Optional arguments to generate diff installer. + #'--last_chrome_installer=C:/Temp/base', + #'--setup_exe_format=DIFF', + #'--diff_algorithm=COURGETTE', - # Optional arguments to generate diff installer. - #'--last_chrome_installer=C:/Temp/base', - #'--setup_exe_format=DIFF', - #'--diff_algorithm=COURGETTE', + # Optional argument for verbose archiving output. + #"--verbose", + ] - # Optional argument for verbose archiving output. - #"--verbose", - ] + deps = [ + ":chrome_runtime_deps", + ":setup_runtime_deps", + "//chrome", + "//chrome:chrome_dll", + "//chrome/browser/extensions/default_extensions", + "//chrome/common/win:eventlog_provider", + "//chrome/installer/setup", + "//mojo/core:shared_library", + "//third_party/icu:icudata", + ] - deps = [ - ":chrome_runtime_deps", - ":setup_runtime_deps", - "//chrome", - "//chrome/browser/extensions/default_extensions", - "//chrome/common/win:eventlog_provider", - "//chrome/installer/setup", - "//mojo/core:shared_library", - "//third_party/icu:icudata", - chrome_dll_target, - ] - - if (enable_hidpi) { - args += [ "--enable_hidpi=1" ] - } - if (is_component_build) { - args += [ "--component_build=1" ] - } - - if (is_component_ffmpeg) { - args += [ "--component_ffmpeg_build=1" ] - } - - if (skip_archive_compression) { - args += [ "--skip_archive_compression" ] - } else { - outputs += [ "$output_dir/chrome.packed.7z" ] - } - - if (enable_nacl) { - inputs += [ "$root_out_dir/nacl_irt_x86_64.nexe" ] - deps += [ "//ppapi/native_client:irt" ] - if (current_cpu == "x86") { - inputs += [ - "$root_out_dir/nacl64.exe", - "$root_out_dir/nacl_irt_x86_32.nexe", - ] - deps += [ "//components/nacl/broker:nacl64" ] - } - } - - if (icu_use_data_file) { - inputs += [ "$root_out_dir/icudtl.dat" ] - } else { - inputs += [ "$root_out_dir/icudt.dll" ] - } - - if (v8_use_external_startup_data) { - deps += [ "//v8" ] - if (use_v8_context_snapshot) { - inputs += [ "$root_out_dir/$v8_context_snapshot_filename" ] - deps += [ "//tools/v8_context_snapshot" ] - } else { - inputs += [ "$root_out_dir/snapshot_blob.bin" ] - args += [ "--include_snapshotblob=1" ] - } - } - - depfile = "$target_gen_dir/archive.d" - args += [ - "--depfile", - rebase_path(depfile, root_build_dir), - ] + if (enable_hidpi) { + args += [ "--enable_hidpi=1" ] + } + if (is_component_build) { + args += [ "--component_build=1" ] } - executable(target_name) { - output_name = "mini_installer" - sources = [ - "mini_installer_exe_main.cc", - packed_files_rc_file, - ] + if (is_component_ffmpeg) { + args += [ "--component_ffmpeg_build=1" ] + } - # This target is special so we manually override most linker flags and - # specify our own to keep the size down. - configs -= [ - # Initialization may insert unexpected memset calls. - "//build/config/compiler:default_init_stack_vars", - "//build/config:executable_config", - "//build/config/win:console", - ] - configs += [ - ":mini_installer_compiler_flags", - "//build/config/sanitizers:link_executable", - "//build/config/win:sdk_link", - "//build/config/win:windowed", - ] + if (skip_archive_compression) { + args += [ "--skip_archive_compression" ] + } else { + outputs += [ "$root_out_dir/chrome.packed.7z" ] + } - ldflags = [ - "/FIXED:NO", - "/ignore:4199", - "/NXCOMPAT", - ] - - libs = [ "setupapi.lib" ] - - deps = [ - ":$archive_name", - ":lib", - ":version", - "//base:clang_profiling_buildflags", - "//build/win:default_exe_manifest", - ] - - # In general, mini_installer tries to avoid depending on the C++ standard - # library for size reasons. This is achieved by: - # 1. setting a custom entry point which avoids pulling in the standard - # library via a link dependency. - # 2. setting no_default_deps=true to avoid including the implicit - # dependency on //buildtools/third_party/libc++ in builds that set - # use_custom_libcxx=true. - # - # The net result is similar to linking with /NODEFAULTLIB, but more precise - # as it just excludes the CRT. - # - # But in asan and clang profiling builds we need to link against a runtime - # library, which in turn depends on the standard library and relies on it - # to run initializers. - if (!is_asan && !use_clang_profiling) { - no_default_deps = true - ldflags += [ "/ENTRY:MainEntryPoint" ] + if (enable_nacl) { + inputs += [ "$root_out_dir/nacl_irt_x86_64.nexe" ] + deps += [ "//ppapi/native_client:irt" ] + if (current_cpu == "x86") { + inputs += [ + "$root_out_dir/nacl64.exe", + "$root_out_dir/nacl_irt_x86_32.nexe", + ] + deps += [ "//components/nacl/broker:nacl64" ] } } + + if (icu_use_data_file) { + inputs += [ "$root_out_dir/icudtl.dat" ] + } else { + inputs += [ "$root_out_dir/icudt.dll" ] + } + + if (v8_use_external_startup_data) { + deps += [ "//v8" ] + if (use_v8_context_snapshot) { + inputs += [ "$root_out_dir/$v8_context_snapshot_filename" ] + deps += [ "//tools/v8_context_snapshot" ] + } else { + inputs += [ "$root_out_dir/snapshot_blob.bin" ] + args += [ "--include_snapshotblob=1" ] + } + } + + depfile = "$target_gen_dir/archive.d" + args += [ + "--depfile", + rebase_path(depfile, root_build_dir), + ] } -generate_mini_installer("mini_installer") { - out_dir = root_out_dir - chrome_dll_file = "$root_out_dir/chrome.dll" - chrome_dll_target = "//chrome:chrome_dll" +executable("mini_installer") { + sources = [ + "mini_installer_exe_main.cc", + packed_files_rc_file, + ] + + # This target is special so we manually override most linker flags and + # specify our own to keep the size down. + configs -= [ + # Initialization may insert unexpected memset calls. + "//build/config/compiler:default_init_stack_vars", + "//build/config:executable_config", + "//build/config/win:console", + ] + configs += [ + ":mini_installer_compiler_flags", + "//build/config/sanitizers:link_executable", + "//build/config/win:sdk_link", + "//build/config/win:windowed", + ] + + ldflags = [ + "/FIXED:NO", + "/ignore:4199", + "/NXCOMPAT", + ] + + libs = [ "setupapi.lib" ] + + deps = [ + ":lib", + ":mini_installer_archive", + ":version", + "//base:clang_profiling_buildflags", + "//build/win:default_exe_manifest", + ] + + # In general, mini_installer tries to avoid depending on the C++ standard + # library for size reasons. This is achieved by: + # 1. setting a custom entry point which avoids pulling in the standard + # library via a link dependency. + # 2. setting no_default_deps=true to avoid including the implicit + # dependency on //buildtools/third_party/libc++ in builds that set + # use_custom_libcxx=true. + # + # The net result is similar to linking with /NODEFAULTLIB, but more precise + # as it just excludes the CRT. + # + # But in asan and clang profiling builds we need to link against a runtime + # library, which in turn depends on the standard library and relies on it + # to run initializers. + if (!is_asan && !use_clang_profiling) { + no_default_deps = true + ldflags += [ "/ENTRY:MainEntryPoint" ] + } } # previous_version_mini_installer.exe can't be generated in an x86 Debug
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 4d91fff3..ae76ebe 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2409,8 +2409,6 @@ "../browser/chromeos/accessibility/magnification_controller_browsertest.cc", "../browser/chromeos/accessibility/magnification_manager_browsertest.cc", "../browser/chromeos/accessibility/select_to_speak_browsertest.cc", - "../browser/chromeos/accessibility/speech_monitor.cc", - "../browser/chromeos/accessibility/speech_monitor.h", "../browser/chromeos/accessibility/spoken_feedback_app_list_browsertest.cc", "../browser/chromeos/accessibility/spoken_feedback_browsertest.cc", "../browser/chromeos/accessibility/spoken_feedback_browsertest.h", @@ -5761,7 +5759,7 @@ "//components/safe_browsing/content/triggers:ad_redirect_trigger", "//components/safe_browsing/core:ping_manager_unittest", "//components/safe_browsing/core/browser:safe_browsing_url_checker_unittest", - "//components/safe_browsing/core/browser:token_fetcher_unittest", + "//components/safe_browsing/core/browser/sync:unittests", "//components/safe_browsing/core/db:v4_test_util", ] } else if (safe_browsing_mode == 2 && is_android) {
diff --git a/chrome/test/data/pdf/document_info.in b/chrome/test/data/pdf/document_info.in new file mode 100644 index 0000000..061890a8 --- /dev/null +++ b/chrome/test/data/pdf/document_info.in
@@ -0,0 +1,37 @@ +{{header}} +{{object 1 0}} << + /Type /Catalog + /Pages 2 0 R +>> +endobj +{{object 2 0}} << + /Type /Pages + /MediaBox [ 0 0 200 200 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +{{object 3 0}} << + /Type /Page + /Parent 2 0 R +>> +endobj +{{object 4 0}} << + /Author (Chromium Authors) + /CreationDate (D:20200205153912+00'00' ) + /Creator (Your Preferred Text Editor) + /Keywords (testing,chromium,pdfium,document,info) + /ModDate (D:20200206094234+00'00') + /Producer (fixup_pdf_template.py) + /Subject (Testing) + /Title ( Sample PDF Document Info ) +>> +endobj +{{xref}} +trailer << + /Info 4 0 R + /Root 1 0 R + {{trailersize}} +>> +{{startxref}} +%%EOF
diff --git a/chrome/test/data/pdf/document_info.pdf b/chrome/test/data/pdf/document_info.pdf new file mode 100644 index 0000000..48e0c98 --- /dev/null +++ b/chrome/test/data/pdf/document_info.pdf
@@ -0,0 +1,45 @@ +%PDF-1.7 +% ò¤ô +1 0 obj << + /Type /Catalog + /Pages 2 0 R +>> +endobj +2 0 obj << + /Type /Pages + /MediaBox [ 0 0 200 200 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +3 0 obj << + /Type /Page + /Parent 2 0 R +>> +endobj +4 0 obj << + /Author (Chromium Authors) + /CreationDate (D:20200205153912+00'00' ) + /Creator (Your Preferred Text Editor) + /Keywords (testing,chromium,pdfium,document,info) + /ModDate (D:20200206094234+00'00') + /Producer (fixup_pdf_template.py) + /Subject (Testing) + /Title ( Sample PDF Document Info ) +>> +endobj +xref +0 5 +0000000000 65535 f +0000000015 00000 n +0000000068 00000 n +0000000161 00000 n +0000000212 00000 n +trailer << + /Info 4 0 R + /Root 1 0 R + /Size 5 +>> +startxref +533 +%%EOF
diff --git a/chrome/test/data/pdf/viewer_properties_dialog_test.js b/chrome/test/data/pdf/viewer_properties_dialog_test.js index 7553839..4cd2adc 100644 --- a/chrome/test/data/pdf/viewer_properties_dialog_test.js +++ b/chrome/test/data/pdf/viewer_properties_dialog_test.js
@@ -33,10 +33,41 @@ viewer.shadowRoot.querySelector('#properties-dialog')); } +/** + * @param {string} field + * @param {string} expectedValue + */ +function assertField(field, expectedValue) { + const actualValue = getPropertiesDialog() + .shadowRoot.querySelector(`#${field}`) + .textContent.trim(); + chrome.test.assertEq(expectedValue, actualValue); +} + const tests = [ async function testPropertiesDialog() { await ensurePropertiesDialogOpen(); + + // TODO(crbug.com/93169): None of the following expected values should be + // '-' when support for every property is implemented. + [['file-name', '-'], + ['file-size', '-'], + ['title', 'Sample PDF Document Info'], + ['author', 'Chromium Authors'], + ['subject', 'Testing'], + ['keywords', '-'], + ['created', '-'], + ['modified', '-'], + ['application', 'Your Preferred Text Editor'], + ['pdf-producer', 'fixup_pdf_template.py'], + ['pdf-version', '-'], + ['page-count', '-'], + ['page-size', '-'], + ['fast-web-view', '-'], + ].forEach(([field, expectedValue]) => assertField(field, expectedValue)); + await ensurePropertiesDialogClose(); + chrome.test.succeed(); }, ];
diff --git a/chrome/test/data/web_apps/TestExpectations b/chrome/test/data/web_apps/TestExpectations new file mode 100644 index 0000000..27ef6c3d --- /dev/null +++ b/chrome/test/data/web_apps/TestExpectations
@@ -0,0 +1,8 @@ +# Format: +# crbug.com/bug_id [Platform] [Expectation] test_case +# +# Supported Platforms: ChromeOS, Linux, Mac, Win +# Supported Expectations: Skip + +# Add support for |uninstall_from_menu| on CrOS +crbug.com/1159651 [ ChromeOS ] [ Skip ] navigate_installable, install_omnibox_or_menu, launch_internal, uninstall_from_menu, navigate_browser_in_scope, assert_install_icon_shown,assert_launch_icon_not_shown,
diff --git a/chrome/test/data/web_apps/web_app_integration_browsertest_cases.csv b/chrome/test/data/web_apps/web_app_integration_browsertest_cases.csv index 22ec970..7893e73 100644 --- a/chrome/test/data/web_apps/web_app_integration_browsertest_cases.csv +++ b/chrome/test/data/web_apps/web_app_integration_browsertest_cases.csv
@@ -1,7 +1,7 @@ -all | navigate_installable,assert_install_icon_shown, assert_launch_icon_not_shown, -all | navigate_not_installable,assert_install_icon_not_shown, -all | navigate_installable,assert_installable,install_omnibox_or_menu, navigate_browser_in_scope,assert_launch_icon_shown, assert_install_icon_not_shown, -all | navigate_installable, install_create_shortcut_tabbed, set_open_in_window_internal, launch_internal, assert_window_created, -all | navigate_installable_site_a, assert_install_icon_shown, install_omnibox_or_menu, assert_window_created, launch_internal_site_a, close_pwa, assert_no_crash, -windows, macos, linux | navigate_installable,install_omnibox_or_menu,launch_internal, uninstall_from_menu,navigate_browser_in_scope, assert_install_icon_shown,assert_launch_icon_not_shown, -cros | navigate_installable,install_omnibox_or_menu,launch_internal, uninstall_internal,navigate_browser_in_scope, assert_install_icon_shown,assert_launch_icon_not_shown, +navigate_installable,assert_install_icon_shown, assert_launch_icon_not_shown, +navigate_not_installable,assert_install_icon_not_shown, +navigate_installable,assert_installable,install_omnibox_or_menu, navigate_browser_in_scope,assert_launch_icon_shown, assert_install_icon_not_shown, +navigate_installable, install_create_shortcut_tabbed, set_open_in_window_internal, launch_internal, assert_window_created, +navigate_installable_site_a, assert_install_icon_shown, install_omnibox_or_menu, assert_window_created, launch_internal_site_a, close_pwa, assert_no_crash, +navigate_installable,install_omnibox_or_menu,launch_internal, uninstall_from_menu,navigate_browser_in_scope, assert_install_icon_shown,assert_launch_icon_not_shown, +ChromeOS | navigate_installable,install_omnibox_or_menu,launch_internal, uninstall_internal,navigate_browser_in_scope, assert_install_icon_shown,assert_launch_icon_not_shown,
diff --git a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js index e8b367d..fd815a6 100644 --- a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js
@@ -10,7 +10,7 @@ // #import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js'; // #import {ButtonState} from 'chrome://resources/cr_components/chromeos/cellular_setup/cellular_types.m.js'; // #import {ESimPageName} from 'chrome://resources/cr_components/chromeos/cellular_setup/esim_flow_ui.m.js'; -// #import {assertTrue} from '../../../chai_assert.js'; +// #import {assertEquals, assertTrue} from '../../../chai_assert.js'; // #import {FakeESimManagerRemote} from './fake_esim_manager_remote.m.js'; // #import {FakeCellularSetupDelegate} from './fake_cellular_setup_delegate.m.js'; // clang-format on @@ -18,6 +18,12 @@ suite('CrComponentsEsimFlowUiTest', function() { let eSimPage; let eSimManagerRemote; + let ironPages; + let profileLoadingPage; + let profileDiscoveryPage; + let activationCodePage; + let confirmationCodePage; + let finalPage; async function flushAsync() { Polymer.dom.flush(); @@ -34,11 +40,24 @@ eSimPage.initSubflow(); document.body.appendChild(eSimPage); Polymer.dom.flush(); + + ironPages = eSimPage.$$('iron-pages'); + profileLoadingPage = eSimPage.$$('#profileLoadingPage'); + profileDiscoveryPage = eSimPage.$$('#profileDiscoveryPage'); + activationCodePage = eSimPage.$$('#activationCodePage'); + confirmationCodePage = eSimPage.$$('#confirmationCodePage'); + finalPage = eSimPage.$$('#finalPage'); + + assertTrue(!!profileLoadingPage); + assertTrue(!!profileDiscoveryPage); + assertTrue(!!activationCodePage); + assertTrue(!!confirmationCodePage); + assertTrue(!!finalPage); }); function assertSelectedPage(pageName, page) { - assertTrue(eSimPage.selectedESimPageName_ === pageName); - assertTrue(eSimPage.selectedESimPageName_ === page.id); + assertEquals(ironPages.selected, pageName); + assertEquals(ironPages.selected, page.id); } test('No eSIM profile flow invalid activation code', async function() { @@ -48,14 +67,6 @@ chromeos.cellularSetup.mojom.ProfileInstallResult .kErrorInvalidActivationCode); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const activationCodePage = eSimPage.$$('#activationCodePage'); - const finalPage = eSimPage.$$('#finalPage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!activationCodePage); - assertTrue(!!finalPage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); @@ -87,14 +98,6 @@ test('No eSIM profile flow valid activation code', async function() { eSimManagerRemote.addEuiccForTest(0); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const activationCodePage = eSimPage.$$('#activationCodePage'); - const finalPage = eSimPage.$$('#finalPage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!activationCodePage); - assertTrue(!!finalPage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); @@ -120,15 +123,62 @@ assertSelectedPage(cellular_setup.ESimPageName.FINAL, finalPage); }); + test( + 'No eSIM profile flow valid activation code confirmation code required successful install', + async function() { + eSimManagerRemote.addEuiccForTest(0); + const availableEuiccs = await eSimManagerRemote.getAvailableEuiccs(); + availableEuiccs.euiccs[0].setProfileInstallResultForTest( + chromeos.cellularSetup.mojom.ProfileInstallResult + .kErrorNeedsConfirmationCode); + + // Loading page should be showing. + assertSelectedPage( + cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); + + await flushAsync(); + + // Should now be at the activation code page. + assertSelectedPage( + cellular_setup.ESimPageName.ACTIVATION_CODE, activationCodePage); + // Insert an activation code. + activationCodePage.$$('#activationCode').value = 'ACTIVATION_CODE'; + + // Next button should now be enabled. + assertTrue( + eSimPage.buttonState.next === + cellularSetup.ButtonState.SHOWN_AND_ENABLED); + + eSimPage.navigateForward(); + + await flushAsync(); + + // Confirmation code page should be showing. + assertSelectedPage( + cellular_setup.ESimPageName.CONFIRMATION_CODE, + confirmationCodePage); + + availableEuiccs.euiccs[0].setProfileInstallResultForTest( + chromeos.cellularSetup.mojom.ProfileInstallResult.kSuccess); + confirmationCodePage.$$('#confirmationCode').value = + 'CONFIRMATION_CODE'; + + // Next button should now be enabled. + assertTrue( + eSimPage.buttonState.next === + cellularSetup.ButtonState.SHOWN_AND_ENABLED); + + eSimPage.navigateForward(); + + await flushAsync(); + + // Should go to final page. + assertSelectedPage(cellular_setup.ESimPageName.FINAL, finalPage); + }); + test('Single eSIM profile flow successful install', async function() { eSimManagerRemote.addEuiccForTest(1); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const finalPage = eSimPage.$$('#finalPage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!finalPage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); @@ -147,12 +197,6 @@ profileList.profiles[0].setProfileInstallResultForTest( chromeos.cellularSetup.mojom.ProfileInstallResult.kFailure); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const finalPage = eSimPage.$$('#finalPage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!finalPage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); @@ -164,44 +208,48 @@ assertTrue(!!finalPage.$$('.error')); }); - test('Single eSIM profile flow confirmation code required', async function() { - eSimManagerRemote.addEuiccForTest(1); - const availableEuiccs = await eSimManagerRemote.getAvailableEuiccs(); - const profileList = await availableEuiccs.euiccs[0].getProfileList(); - profileList.profiles[0].setProfileInstallResultForTest( - chromeos.cellularSetup.mojom.ProfileInstallResult - .kErrorNeedsConfirmationCode); + test( + 'Single eSIM profile flow confirmation code required successful install', + async function() { + eSimManagerRemote.addEuiccForTest(1); + const availableEuiccs = await eSimManagerRemote.getAvailableEuiccs(); + const profileList = await availableEuiccs.euiccs[0].getProfileList(); + profileList.profiles[0].setProfileInstallResultForTest( + chromeos.cellularSetup.mojom.ProfileInstallResult + .kErrorNeedsConfirmationCode); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const confirmationCodePage = eSimPage.$$('#confirmationCodePage'); + // Loading page should be showing. + assertSelectedPage( + cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); - assertTrue(!!profileLoadingPage); - assertTrue(!!confirmationCodePage); + await flushAsync(); - // Loading page should be showing. - assertSelectedPage( - cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); + // Confirmation code page should be showing. + assertSelectedPage( + cellular_setup.ESimPageName.CONFIRMATION_CODE, + confirmationCodePage); - await flushAsync(); + profileList.profiles[0].setProfileInstallResultForTest( + chromeos.cellularSetup.mojom.ProfileInstallResult.kSuccess); + confirmationCodePage.$$('#confirmationCode').value = + 'CONFIRMATION_CODE'; - // Confirmation code page should be showing. - assertSelectedPage( - cellular_setup.ESimPageName.CONFIRMATION_CODE, confirmationCodePage); - }); + // Next button should now be enabled. + assertTrue( + eSimPage.buttonState.next === + cellularSetup.ButtonState.SHOWN_AND_ENABLED); + + eSimPage.navigateForward(); + + await flushAsync(); + + // Should go to final page. + assertSelectedPage(cellular_setup.ESimPageName.FINAL, finalPage); + }); test('Multiple eSIM profiles skip discovery flow', async function() { eSimManagerRemote.addEuiccForTest(2); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const profileDiscoveryPage = eSimPage.$$('#profileDiscoveryPage'); - const activationCodePage = eSimPage.$$('#activationCodePage'); - const finalPage = eSimPage.$$('#finalPage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!profileDiscoveryPage); - assertTrue(!!activationCodePage); - assertTrue(!!finalPage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); @@ -240,16 +288,6 @@ test('Multiple eSIM profiles select flow', async function() { eSimManagerRemote.addEuiccForTest(2); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const profileDiscoveryPage = eSimPage.$$('#profileDiscoveryPage'); - const activationCodePage = eSimPage.$$('#activationCodePage'); - const finalPage = eSimPage.$$('#finalPage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!profileDiscoveryPage); - assertTrue(!!activationCodePage); - assertTrue(!!finalPage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage); @@ -292,14 +330,6 @@ chromeos.cellularSetup.mojom.ProfileInstallResult .kErrorNeedsConfirmationCode); - const profileLoadingPage = eSimPage.$$('#profileLoadingPage'); - const profileDiscoveryPage = eSimPage.$$('#profileDiscoveryPage'); - const confirmationCodePage = eSimPage.$$('#confirmationCodePage'); - - assertTrue(!!profileLoadingPage); - assertTrue(!!profileDiscoveryPage); - assertTrue(!!confirmationCodePage); - // Loading page should be showing. assertSelectedPage( cellular_setup.ESimPageName.PROFILE_LOADING, profileLoadingPage);
diff --git a/chrome/test/data/webui/print_preview/BUILD.gn b/chrome/test/data/webui/print_preview/BUILD.gn index 4200eb3b..fcb4fc9d 100644 --- a/chrome/test/data/webui/print_preview/BUILD.gn +++ b/chrome/test/data/webui/print_preview/BUILD.gn
@@ -55,10 +55,9 @@ ":link_container_test", ":margins_settings_test", ":media_size_settings_test", - - #":model_settings_availability_test", - #":model_settings_policy_test", - #":model_test", + ":model_settings_availability_test", + ":model_settings_policy_test", + ":model_test", ":native_layer_stub", #":number_settings_section_interactive_test", @@ -526,6 +525,42 @@ externs_list = [ "$externs_path/mocha-2.5.js" ] } +js_library("model_settings_availability_test") { + deps = [ + ":print_preview_test_utils", + "..:chai_assert", + "//chrome/browser/resources/print_preview:print_preview", + "//ui/webui/resources/js:assert.m", + "//ui/webui/resources/js:cr.m", + "//ui/webui/resources/js:load_time_data.m", + ] + externs_list = [ "$externs_path/mocha-2.5.js" ] +} + +js_library("model_settings_policy_test") { + deps = [ + ":print_preview_test_utils", + "..:chai_assert", + "//chrome/browser/resources/print_preview:print_preview", + "//ui/webui/resources/js:assert.m", + "//ui/webui/resources/js:load_time_data.m", + ] + externs_list = [ "$externs_path/mocha-2.5.js" ] +} + +js_library("model_test") { + deps = [ + ":print_preview_test_utils", + "..:chai_assert", + "..:test_util.m", + "//chrome/browser/resources/print_preview:print_preview", + "//ui/webui/resources/js:assert.m", + "//ui/webui/resources/js:cr.m", + "//ui/webui/resources/js:load_time_data.m", + ] + externs_list = [ "$externs_path/mocha-2.5.js" ] +} + if (is_chromeos_ash) { js_library("print_server_store_test") { deps = [
diff --git a/chrome/test/data/webui/print_preview/model_settings_availability_test.js b/chrome/test/data/webui/print_preview/model_settings_availability_test.js index 5010a2c7..469982c 100644 --- a/chrome/test/data/webui/print_preview/model_settings_availability_test.js +++ b/chrome/test/data/webui/print_preview/model_settings_availability_test.js
@@ -5,15 +5,21 @@ import {Destination, DestinationConnectionStatus, DestinationOrigin, DestinationType, DuplexType, Margins, MarginsType, Size} from 'chrome://print/print_preview.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {isChromeOS, isMac, isWindows} from 'chrome://resources/js/cr.m.js'; -import {getCddTemplate, getGoogleDriveDestination, getSaveAsPdfDestination} from 'chrome://test/print_preview/print_preview_test_utils.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; + +import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js'; + +import {getCddTemplate, getGoogleDriveDestination, getSaveAsPdfDestination} from './print_preview_test_utils.js'; suite('ModelSettingsAvailabilityTest', function() { - let model = null; + /** @type {!PrintPreviewModelElement} */ + let model; /** @override */ setup(function() { - PolymerTest.clearBody(); - model = document.createElement('print-preview-model'); + document.body.innerHTML = ''; + model = /** @type {!PrintPreviewModelElement} */ ( + document.createElement('print-preview-model')); document.body.appendChild(model); model.documentSettings = { @@ -180,7 +186,7 @@ assertFalse(model.settings.color.available); assertEquals( capabilityAndValue.expectedValue, - model.settings.color.unavailableValue); + /** @type {boolean} */ (model.settings.color.unavailableValue)); }); // Each of these settings should make the setting available, with the @@ -227,7 +233,7 @@ delete capabilities.printer.color; model.set('destination.capabilities', capabilities); assertFalse(model.settings.color.available); - assertTrue(model.settings.color.unavailableValue); + assertTrue(/** @type {boolean} */ (model.settings.color.unavailableValue)); assertFalse(model.settings.color.setFromUi); });
diff --git a/chrome/test/data/webui/print_preview/model_settings_policy_test.js b/chrome/test/data/webui/print_preview/model_settings_policy_test.js index b3c0961..e20ac0b 100644 --- a/chrome/test/data/webui/print_preview/model_settings_policy_test.js +++ b/chrome/test/data/webui/print_preview/model_settings_policy_test.js
@@ -4,15 +4,21 @@ import {ColorModeRestriction, Destination, DestinationConnectionStatus, DestinationOrigin, DestinationType, DuplexModeRestriction, Margins, MarginsType, PinModeRestriction, Size} from 'chrome://print/print_preview.js'; import {assert} from 'chrome://resources/js/assert.m.js'; -import {getCddTemplate} from 'chrome://test/print_preview/print_preview_test_utils.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; + +import {assertEquals} from '../chai_assert.js'; + +import {getCddTemplate} from './print_preview_test_utils.js'; suite('ModelSettingsPolicyTest', function() { - let model = null; + /** @type {!PrintPreviewModelElement} */ + let model; /** @override */ setup(function() { - PolymerTest.clearBody(); - model = document.createElement('print-preview-model'); + document.body.innerHTML = ''; + model = /** @type {!PrintPreviewModelElement} */ ( + document.createElement('print-preview-model')); document.body.appendChild(model); model.documentSettings = { @@ -22,6 +28,8 @@ isScalingDisabled: false, fitToPageScaling: 100, pageCount: 3, + isPdf: false, + isFromArc: false, title: 'title', };
diff --git a/chrome/test/data/webui/print_preview/model_test.js b/chrome/test/data/webui/print_preview/model_test.js index af81b39..367f0e9 100644 --- a/chrome/test/data/webui/print_preview/model_test.js +++ b/chrome/test/data/webui/print_preview/model_test.js
@@ -2,14 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {Destination, DestinationConnectionStatus, DestinationOrigin, DestinationType, DuplexMode, MarginsType, PrinterType, ScalingType, Size} from 'chrome://print/print_preview.js'; +import {Cdd, Destination, DestinationConnectionStatus, DestinationOrigin, DestinationType, DuplexMode, MarginsType, PrinterType, ScalingType, Size} from 'chrome://print/print_preview.js'; import {assert} from 'chrome://resources/js/assert.m.js'; import {isChromeOS} from 'chrome://resources/js/cr.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getCddTemplateWithAdvancedSettings} from 'chrome://test/print_preview/print_preview_test_utils.js'; -import {eventToPromise} from 'chrome://test/test_util.m.js'; + +import {assertDeepEquals, assertEquals, assertFalse, assertNotEquals, assertTrue} from '../chai_assert.js'; +import {eventToPromise} from '../test_util.m.js'; + +import {getCddTemplateWithAdvancedSettings} from './print_preview_test_utils.js'; window.model_test = {}; +const model_test = window.model_test; + model_test.suiteName = 'ModelTest'; /** @enum {string} */ model_test.TestNames = { @@ -22,12 +28,14 @@ }; suite(model_test.suiteName, function() { - let model = null; + /** @type {!PrintPreviewModelElement} */ + let model; /** @override */ setup(function() { - PolymerTest.clearBody(); - model = document.createElement('print-preview-model'); + document.body.innerHTML = ''; + model = /** @type {!PrintPreviewModelElement} */ ( + document.createElement('print-preview-model')); document.body.appendChild(model); }); @@ -158,7 +166,7 @@ */ test(assert(model_test.TestNames.SetPolicySettings), function() { model.setSetting('headerFooter', false); - assertFalse(model.settings.headerFooter.value); + assertFalse(/** @type {boolean} */ (model.settings.headerFooter.value)); // Sets to true, but doesn't mark as controlled by a policy. model.setPolicySettings({headerFooter: {defaultMode: true}}); @@ -167,18 +175,18 @@ headerFooter: false, })); model.applyStickySettings(); - assertTrue(model.settings.headerFooter.value); + assertTrue(/** @type {boolean} */ (model.settings.headerFooter.value)); model.setSetting('headerFooter', false); - assertFalse(model.settings.headerFooter.value); + assertFalse(/** @type {boolean} */ (model.settings.headerFooter.value)); model.setPolicySettings({headerFooter: {allowedMode: true}}); model.applyStickySettings(); - assertTrue(model.settings.headerFooter.value); + assertTrue(/** @type {boolean} */ (model.settings.headerFooter.value)); model.setSetting('headerFooter', false); // The value didn't change after setSetting(), because the policy takes // priority. - assertTrue(model.settings.headerFooter.value); + assertTrue(/** @type {boolean} */ (model.settings.headerFooter.value)); }); /** @param {!Destination} testDestination */ @@ -236,6 +244,7 @@ isScalingDisabled: false, fitToPageScaling: 100, pageCount: 3, + isFromArc: false, title: 'title', }; model.pageSize = new Size(612, 792); @@ -263,7 +272,7 @@ 'FooDevice', DestinationType.LOCAL, origin, 'FooName', DestinationConnectionStatus.ONLINE); testDestination.capabilities = - getCddTemplateWithAdvancedSettings(2).capabilities; + getCddTemplateWithAdvancedSettings(2, 'FooDevice').capabilities; if (isChromeOS) { // Make device managed. It's used for testing pin setting behavior. @@ -307,7 +316,7 @@ paperType: 0, }; } - expectEquals(JSON.stringify(expectedDefaultTicketObject), defaultTicket); + assertEquals(JSON.stringify(expectedDefaultTicketObject), defaultTicket); // Toggle all the values and create a new print ticket. toggleSettings(testDestination); @@ -353,7 +362,7 @@ }; } - expectEquals(JSON.stringify(expectedNewTicketObject), newTicket); + assertEquals(JSON.stringify(expectedNewTicketObject), newTicket); }); /** @@ -368,7 +377,7 @@ 'FooCloudDevice', DestinationType.GOOGLE, DestinationOrigin.COOKIES, 'FooCloudName', DestinationConnectionStatus.ONLINE); testDestination.capabilities = - getCddTemplateWithAdvancedSettings(2).capabilities; + getCddTemplateWithAdvancedSettings(2, 'FooDevice').capabilities; model.destination = testDestination; const defaultTicket = model.createCloudJobTicket(testDestination); @@ -396,7 +405,7 @@ ], }, }); - expectEquals(expectedDefaultTicket, defaultTicket); + assertEquals(expectedDefaultTicket, defaultTicket); // Toggle all the values and create a new cloud job ticket. toggleSettings(testDestination); @@ -425,7 +434,7 @@ ], }, }); - expectEquals(expectedNewTicket, newTicket); + assertEquals(expectedNewTicket, newTicket); }); test(assert(model_test.TestNames.ChangeDestination), function() { @@ -433,7 +442,7 @@ 'FooDevice', DestinationType.LOCAL, DestinationOrigin.LOCAL, 'FooName', DestinationConnectionStatus.ONLINE); testDestination.capabilities = - getCddTemplateWithAdvancedSettings(2).capabilities; + getCddTemplateWithAdvancedSettings(2, 'FooDevice').capabilities; // Make black and white printing the default. testDestination.capabilities.printer.color = { option: [ @@ -446,7 +455,7 @@ 'BarDevice', DestinationType.LOCAL, DestinationOrigin.LOCAL, 'BarName', DestinationConnectionStatus.ONLINE); testDestination2.capabilities = - Object.assign({}, testDestination.capabilities); + /** @type {!Cdd} */ (Object.assign({}, testDestination.capabilities)); // Initialize initializeModel(); @@ -486,7 +495,7 @@ 'Device1', DestinationType.LOCAL, DestinationOrigin.LOCAL, 'One', DestinationConnectionStatus.ONLINE); testDestination3.capabilities = - Object.assign({}, testDestination.capabilities); + /** @type {!Cdd} */ (Object.assign({}, testDestination.capabilities)); testDestination3.capabilities.printer.media_size = { option: [ {
diff --git a/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js b/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js index 459fbd3..18d3f76 100644 --- a/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js +++ b/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js
@@ -166,7 +166,8 @@ let eSimNetworkList = cellularNetworkList.$$('#esimNetworkList'); assertTrue(!!eSimNetworkList); - assertEquals(1, cellularNetworkList.eSimPendingProfileItems_.length); + + Polymer.dom.flush(); const listItem = eSimNetworkList.$$('network-list-item'); assertTrue(!!listItem);
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js index 038583b2..8fd944262 100644 --- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -1547,7 +1547,6 @@ settings.DevicePageBrowserProxyImpl.getInstance() .updatePowerStatusCalled_); - acIdleSelect = assert(powerPage.$$('#acIdleSelect')); lidClosedToggle = assert(powerPage.$$('#lidClosedToggle')); assertEquals( @@ -1587,9 +1586,13 @@ // Power source row is hidden since there's no battery. assertTrue(powerSourceRow.hidden); - // Idle settings while on battery should not be visible if the - // battery is not present. + // Idle settings while on battery and while charging should not be + // visible if the battery is not present. assertEquals(null, powerPage.$$('#batteryIdleSettingBox')); + assertEquals(null, powerPage.$$('#acIdleSettingBox')); + + // Expect the "When idle" dropdown options to appear instead. + assert(powerPage.$$('#noBatteryAcIdleSelect')); }); test('power sources', function() { @@ -1666,6 +1669,19 @@ }); test('set AC idle behavior', function() { + const batteryStatus = { + present: true, + charging: false, + calculating: false, + percent: 50, + statusText: '5 hours left', + }; + cr.webUIListenerCallback( + 'battery-status-changed', Object.assign({}, batteryStatus)); + setPowerSources([], '', false); + Polymer.dom.flush(); + + acIdleSelect = assert(powerPage.$$('#acIdleSelect')); selectValue(acIdleSelect, settings.IdleBehavior.DISPLAY_ON); expectEquals( settings.IdleBehavior.DISPLAY_ON, @@ -1885,6 +1901,7 @@ }); }) .then(function() { + acIdleSelect = assert(powerPage.$$('#acIdleSelect')); const batteryIdleSelect = assert(powerPage.$$('#batteryIdleSelect')); expectEquals( @@ -1971,6 +1988,7 @@ powerPage.async(resolve); }) .then(function() { + acIdleSelect = assert(powerPage.$$('#acIdleSelect')); const batteryIdleSelect = assert(powerPage.$$('#batteryIdleSelect')); expectEquals(
diff --git a/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js index fb1fa04..07f53e10 100644 --- a/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js +++ b/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js
@@ -101,7 +101,7 @@ */ function getSublabelForSelectUpdates(keys) { cr.webUIListenerCallback('switch-access-assignments-changed', { - select: keys.map(key => ({key, devices: ['internal']})), + select: keys.map(key => ({key, device: 'usb'})), next: [], previous: [] }); @@ -120,10 +120,10 @@ // Simulate a pref change for the select action. cr.webUIListenerCallback( 'switch-access-assignments-changed', - {select: [{key: 'a', devices: ['internal']}], next: [], previous: []}); + {select: [{key: 'a', device: 'usb'}], next: [], previous: []}); assertEquals(1, page.selectAssignments_.length); - assertEquals('a', page.selectAssignments_[0]); + assertDeepEquals({key: 'a', device: 'usb'}, page.selectAssignments_[0]); assertEquals(0, page.nextAssignments_.length); assertEquals(0, page.previousAssignments_.length); }); @@ -132,24 +132,29 @@ initPage(); assertEquals('0 switches assigned', getSublabelForSelectUpdates([])); - assertEquals('Backspace', getSublabelForSelectUpdates(['Backspace'])); + assertEquals('Backspace (USB)', getSublabelForSelectUpdates(['Backspace'])); assertEquals( - 'Backspace, Tab', getSublabelForSelectUpdates(['Backspace', 'Tab'])); + 'Backspace (USB), Tab (USB)', + getSublabelForSelectUpdates(['Backspace', 'Tab'])); assertEquals( - 'Backspace, Tab, Enter', + 'Backspace (USB), Tab (USB), Enter (USB)', getSublabelForSelectUpdates(['Backspace', 'Tab', 'Enter'])); assertEquals( - 'Backspace, Tab, Enter, and 1 more switch', + 'Backspace (USB), Tab (USB), Enter (USB), ' + + 'and 1 more switch', getSublabelForSelectUpdates(['Backspace', 'Tab', 'Enter', 'a'])); assertEquals( - 'Backspace, Tab, Enter, and 2 more switches', + 'Backspace (USB), Tab (USB), Enter (USB), ' + + 'and 2 more switches', getSublabelForSelectUpdates(['Backspace', 'Tab', 'Enter', 'a', 'b'])); assertEquals( - 'Backspace, Tab, Enter, and 3 more switches', + 'Backspace (USB), Tab (USB), Enter (USB), ' + + 'and 3 more switches', getSublabelForSelectUpdates( ['Backspace', 'Tab', 'Enter', 'a', 'b', 'c'])); assertEquals( - 'Backspace, Tab, Enter, and 4 more switches', + 'Backspace (USB), Tab (USB), Enter (USB), ' + + 'and 4 more switches', getSublabelForSelectUpdates( ['Backspace', 'Tab', 'Enter', 'a', 'b', 'c', 'd'])); }); @@ -171,9 +176,11 @@ // Simulate pressing 'a' twice. cr.webUIListenerCallback( - 'switch-access-got-key-press-for-assignment', {key: 'a', keyCode: 65}); + 'switch-access-got-key-press-for-assignment', + {key: 'a', keyCode: 65, device: 'usb'}); cr.webUIListenerCallback( - 'switch-access-got-key-press-for-assignment', {key: 'a', keyCode: 65}); + 'switch-access-got-key-press-for-assignment', + {key: 'a', keyCode: 65, device: 'usb'}); // This should cause the dialog to close. await browserProxy.methodCalled( @@ -191,9 +198,11 @@ // Simulate pressing 'a', and then 'b'. cr.webUIListenerCallback( - 'switch-access-got-key-press-for-assignment', {key: 'a', keyCode: 65}); + 'switch-access-got-key-press-for-assignment', + {key: 'a', keyCode: 65, device: 'usb'}); cr.webUIListenerCallback( - 'switch-access-got-key-press-for-assignment', {key: 'b', keyCode: 66}); + 'switch-access-got-key-press-for-assignment', + {key: 'b', keyCode: 66, device: 'usb'}); const element = page.$$('#switchAccessActionAssignmentDialog'); await test_util.waitAfterNextRender(element);
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js index 9a222ea..5655886 100644 --- a/chrome/test/data/webui/settings/privacy_page_test.js +++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -7,7 +7,7 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ClearBrowsingDataBrowserProxyImpl, ContentSettingsTypes, CookieControlsMode, SafeBrowsingSetting, SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js'; -import {HatsBrowserProxyImpl, MetricsBrowserProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Route, Router, routes, SecureDnsMode, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; +import {HatsBrowserProxyImpl, MetricsBrowserProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Route, Router, routes, SecureDnsMode} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js'; import {flushTasks, isChildVisible, isVisible} from '../test_util.m.js'; @@ -17,7 +17,6 @@ import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js'; import {TestPrivacyPageBrowserProxy} from './test_privacy_page_browser_proxy.js'; import {TestSiteSettingsPrefsBrowserProxy} from './test_site_settings_prefs_browser_proxy.js'; -import {TestSyncBrowserProxy} from './test_sync_browser_proxy.m.js'; // clang-format on @@ -82,14 +81,12 @@ }); }); - setup(async function() { + setup(function() { testClearBrowsingDataBrowserProxy = new TestClearBrowsingDataBrowserProxy(); ClearBrowsingDataBrowserProxyImpl.instance_ = testClearBrowsingDataBrowserProxy; const testBrowserProxy = new TestPrivacyPageBrowserProxy(); PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy; - const testSyncBrowserProxy = new TestSyncBrowserProxy(); - SyncBrowserProxyImpl.instance_ = testSyncBrowserProxy; siteSettingsBrowserProxy = new TestSiteSettingsPrefsBrowserProxy(); SiteSettingsPrefsBrowserProxyImpl.instance_ = siteSettingsBrowserProxy; siteSettingsBrowserProxy.setCookieSettingDescription(testLabels[0]); @@ -112,7 +109,7 @@ {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}}, }; document.body.appendChild(page); - return testSyncBrowserProxy.whenCalled('getSyncStatus'); + return flushTasks(); }); teardown(function() {
diff --git a/chrome/test/data/webui/settings/security_page_test.js b/chrome/test/data/webui/settings/security_page_test.js index 696fc3b8..4325cbb 100644 --- a/chrome/test/data/webui/settings/security_page_test.js +++ b/chrome/test/data/webui/settings/security_page_test.js
@@ -7,13 +7,12 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {SafeBrowsingSetting} from 'chrome://settings/lazy_load.js'; -import {MetricsBrowserProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Router, routes, SafeBrowsingInteractions, SecureDnsMode, SyncBrowserProxyImpl} from 'chrome://settings/settings.js'; +import {MetricsBrowserProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Router, routes, SafeBrowsingInteractions, SecureDnsMode} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js'; import {flushTasks, isChildVisible} from '../test_util.m.js'; import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js'; import {TestPrivacyPageBrowserProxy} from './test_privacy_page_browser_proxy.js'; -import {TestSyncBrowserProxy} from './test_sync_browser_proxy.m.js'; // clang-format on @@ -21,9 +20,6 @@ /** @type {!TestMetricsBrowserProxy} */ let testMetricsBrowserProxy; - /** @type {!TestSyncBrowserProxy} */ - let syncBrowserProxy; - /** @type {!TestPrivacyPageBrowserProxy} */ let testPrivacyBrowserProxy; @@ -42,8 +38,6 @@ MetricsBrowserProxyImpl.instance_ = testMetricsBrowserProxy; testPrivacyBrowserProxy = new TestPrivacyPageBrowserProxy(); PrivacyPageBrowserProxyImpl.instance_ = testPrivacyBrowserProxy; - syncBrowserProxy = new TestSyncBrowserProxy(); - SyncBrowserProxyImpl.instance_ = syncBrowserProxy; document.body.innerHTML = ''; page = /** @type {!SettingsSecurityPageElement} */ ( document.createElement('settings-security-page')); @@ -57,12 +51,11 @@ type: chrome.settingsPrivate.PrefType.NUMBER, value: SafeBrowsingSetting.STANDARD, }, - password_leak_detection: {value: true, userControlDisabled: false}, + password_leak_detection: {value: false}, }, dns_over_https: {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}}, }; - page.set('syncStatus', {signedIn: false, hasError: false}); document.body.appendChild(page); page.$$('#safeBrowsingEnhanced').updateCollapsed(); page.$$('#safeBrowsingStandard').updateCollapsed(); @@ -119,13 +112,13 @@ flush(); assertEquals(activeWhenSignedInSubLabel, toggle.subLabel); - page.set('syncStatus', {signedIn: true}); + page.set('prefs.generated.password_leak_detection.value', true); flush(); assertEquals(defaultSubLabel, toggle.subLabel); - page.set('syncStatus', {signedIn: true, hasError: true}); + page.set('prefs.profile.password_manager_leak_detection.value', false); flush(); - assertEquals(activeWhenSignedInSubLabel, toggle.subLabel); + assertEquals(defaultSubLabel, toggle.subLabel); }); test('LogSafeBrowsingExtendedToggle', async function() { @@ -601,7 +594,6 @@ dns_over_https: {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}}, }; - page.set('syncStatus', {signedIn: true, hasError: false}); document.body.appendChild(page); flush(); });
diff --git a/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js b/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js index fd8a52b..fcb41999 100644 --- a/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js +++ b/chrome/test/data/webui/signin/dice_web_signin_intercept_test.js
@@ -8,7 +8,7 @@ import {AccountInfo, DiceWebSigninInterceptBrowserProxyImpl, InterceptionParameters} from 'chrome://signin-dice-web-intercept/dice_web_signin_intercept_browser_proxy.js'; import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js'; -import {isChildVisible} from '../test_util.m.js'; +import {isChildVisible, waitAfterNextRender} from '../test_util.m.js'; import {TestDiceWebSigninInterceptBrowserProxy} from './test_dice_web_signin_intercept_browser_proxy.js'; @@ -29,7 +29,7 @@ /** @type {string} */ const AVATAR_URL_2 = 'chrome://theme/IDR_PROFILE_AVATAR_2'; - setup(function() { + setup(async function() { browserProxy = new TestDiceWebSigninInterceptBrowserProxy(); browserProxy.setInterceptionParameters({ headerText: 'header_text', @@ -37,6 +37,7 @@ bodyText: 'body_text', confirmButtonLabel: 'confirm_label', cancelButtonLabel: 'cancel_label', + showGuestOption: true, headerTextColor: 'rgba(255, 255, 255, 1)', headerBackgroundColor: 'rgba(255, 0, 0, 1)', interceptedAccount: {isManaged: false, pictureUrl: AVATAR_URL_1}, @@ -47,6 +48,7 @@ app = /** @type {!DiceWebSigninInterceptAppElement} */ ( document.createElement('dice-web-signin-intercept-app')); document.body.append(app); + await waitAfterNextRender(app); return browserProxy.whenCalled('pageLoaded'); }); @@ -134,9 +136,11 @@ bodyText: 'new_body_text', confirmButtonLabel: 'new_confirm_label', cancelButtonLabel: 'new_cancel_label', + showGuestOption: true, headerTextColor: 'rgba(255, 255, 255, 1)', headerBackgroundColor: 'rgba(255, 0, 0, 1)', interceptedAccount: {isManaged: false, pictureUrl: AVATAR_URL_1}, + primaryAccount: {isManaged: false, pictureUrl: AVATAR_URL_2} }); checkTextValues( 'new_header_text', 'new_body_title', 'new_body_text', @@ -154,9 +158,11 @@ bodyText: 'body_text', confirmButtonLabel: 'confirm_label', cancelButtonLabel: 'cancel_label', + showGuestOption: true, headerTextColor: 'rgba(255, 255, 255, 1)', headerBackgroundColor: 'rgba(255, 0, 0, 1)', interceptedAccount: {isManaged: false, pictureUrl: AVATAR_URL_2}, + primaryAccount: {isManaged: false, pictureUrl: AVATAR_URL_2} }; // Update urls.
diff --git a/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js b/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js index d85ab32..bb92c87 100644 --- a/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js +++ b/chrome/test/data/webui/signin/test_dice_web_signin_intercept_browser_proxy.js
@@ -17,6 +17,7 @@ bodyText: '', cancelButtonLabel: '', confirmButtonLabel: '', + showGuestOption: false, headerTextColor: '', headerBackgroundColor: '', interceptedAccount: {isManaged: false, pictureUrl: ''},
diff --git a/chrome/tools/build/linux/FILES.cfg b/chrome/tools/build/linux/FILES.cfg index 48152bb..ef00a14b 100644 --- a/chrome/tools/build/linux/FILES.cfg +++ b/chrome/tools/build/linux/FILES.cfg
@@ -443,17 +443,17 @@ }, # MojoJS support data (WebUSB): { - 'filename': 'gen/url/mojom/url.mojom.js', + 'filename': 'gen/url/mojom/url.mojom.m.js', 'buildtype': ['dev', 'official'], 'archive': 'mojojs.zip', }, { - 'filename': 'gen/services/device/public/mojom/usb_*.mojom.js', + 'filename': 'gen/services/device/public/mojom/usb_*.mojom.m.js', 'buildtype': ['dev', 'official'], 'archive': 'mojojs.zip', }, { - 'filename': 'gen/third_party/blink/public/mojom/usb/web_usb_service.mojom.js', + 'filename': 'gen/third_party/blink/public/mojom/usb/web_usb_service.mojom.m.js', 'buildtype': ['dev', 'official'], 'archive': 'mojojs.zip', },
diff --git a/chromecast/browser/cast_display_configurator.cc b/chromecast/browser/cast_display_configurator.cc index 73bf7780..bfbaac8 100644 --- a/chromecast/browser/cast_display_configurator.cc +++ b/chromecast/browser/cast_display_configurator.cc
@@ -234,17 +234,15 @@ display::DisplaySnapshot* display, const display::DisplayMode* mode, const gfx::Point& origin, - const base::flat_map<int64_t, bool>& statuses) { + bool config_success) { DCHECK(display); DCHECK(mode); DCHECK_EQ(display, display_); - DCHECK_EQ(statuses.size(), 1UL); const gfx::Rect bounds(origin, mode->size()); - bool success = statuses.at(display_->display_id()); - DVLOG(1) << __func__ << " success=" << success + DVLOG(1) << __func__ << " success=" << config_success << " bounds=" << bounds.ToString(); - if (success) { + if (config_success) { // Need to update the display state otherwise it becomes stale. display_->set_current_mode(mode); display_->set_origin(origin);
diff --git a/chromecast/browser/cast_display_configurator.h b/chromecast/browser/cast_display_configurator.h index 9bb1708..0c45c3b 100644 --- a/chromecast/browser/cast_display_configurator.h +++ b/chromecast/browser/cast_display_configurator.h
@@ -64,7 +64,7 @@ void OnDisplayConfigured(display::DisplaySnapshot* display, const display::DisplayMode* mode, const gfx::Point& origin, - const base::flat_map<int64_t, bool>& statuses); + bool statuses); void UpdateScreen(int64_t display_id, const gfx::Rect& bounds, float device_scale_factor,
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 396258fb..fc353d4 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -13708.0.0 \ No newline at end of file +13714.0.0 \ No newline at end of file
diff --git a/chromeos/components/account_manager/account_manager_facade_ash.cc b/chromeos/components/account_manager/account_manager_facade_ash.cc index 7445979..65dd43a 100644 --- a/chromeos/components/account_manager/account_manager_facade_ash.cc +++ b/chromeos/components/account_manager/account_manager_facade_ash.cc
@@ -18,4 +18,16 @@ return account_manager_->IsInitialized(); } +void AccountManagerFacadeAsh::ShowAddAccountDialog( + const AccountAdditionSource& source, + base::OnceCallback<void(const AccountAdditionResult& result)> callback) { + // TODO(crbug.com/1140469): implement this. +} + +void AccountManagerFacadeAsh::ShowReauthAccountDialog( + const AccountAdditionSource& source, + const std::string& email) { + // TODO(crbug.com/1140469): implement this. +} + } // namespace chromeos
diff --git a/chromeos/components/account_manager/account_manager_facade_ash.h b/chromeos/components/account_manager/account_manager_facade_ash.h index 0177c75..bf1ac59 100644 --- a/chromeos/components/account_manager/account_manager_facade_ash.h +++ b/chromeos/components/account_manager/account_manager_facade_ash.h
@@ -23,6 +23,12 @@ // AccountManagerFacade overrides: bool IsInitialized() override; + void ShowAddAccountDialog( + const AccountAdditionSource& source, + base::OnceCallback<void(const AccountAdditionResult& result)> callback) + override; + void ShowReauthAccountDialog(const AccountAdditionSource& source, + const std::string& email) override; private: AccountManager* const account_manager_;
diff --git a/chromeos/components/camera_app_ui/resources/css/main.css b/chromeos/components/camera_app_ui/resources/css/main.css index e7d3b8e..9fd93a0 100644 --- a/chromeos/components/camera_app_ui/resources/css/main.css +++ b/chromeos/components/camera_app_ui/resources/css/main.css
@@ -1020,13 +1020,13 @@ width: 50%; } -#preview-grid-horizontal.animate, -#preview-grid-horizontal.animate::before { +#preview-grid-horizontal, +#preview-grid-horizontal::before { transition: height 500ms, visibility 500ms; } -#preview-grid-vertical.animate, -#preview-grid-vertical.animate::before { +#preview-grid-vertical, +#preview-grid-vertical::before { transition: width 500ms, visibility 500ms; }
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera/options.js b/chromeos/components/camera_app_ui/resources/js/views/camera/options.js index 6a181d56a..20a54996 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/camera/options.js +++ b/chromeos/components/camera_app_ui/resources/js/views/camera/options.js
@@ -95,7 +95,6 @@ this.audioTrack_ = null; [['#switch-device', () => this.switchDevice_()], - ['#toggle-grid', () => this.animatePreviewGrid_()], ['#open-settings', () => nav.open(ViewName.SETTINGS)], ] .forEach( @@ -167,15 +166,6 @@ } /** - * Animates the preview grid. - * @private - */ - animatePreviewGrid_() { - Array.from(document.querySelector('#preview-grid').children) - .forEach((grid) => util.animateOnce(grid)); - } - - /** * Maps MediaTrackSettings.facingMode to CCA facing type. * @param {string|undefined} facing The target facingMode to map. * @return {!Facing} The mapped CCA facing.
diff --git a/chromeos/components/diagnostics_ui/resources/battery_status_card.html b/chromeos/components/diagnostics_ui/resources/battery_status_card.html index 13578ab..a07b6a3f 100644 --- a/chromeos/components/diagnostics_ui/resources/battery_status_card.html +++ b/chromeos/components/diagnostics_ui/resources/battery_status_card.html
@@ -14,7 +14,8 @@ <data-point slot="body" id="batteryHealth" header="[[i18n('batteryHealthLabel')]]" value="[[getBatteryHealth_(batteryHealth_.batteryWearPercentage)]]" - tooltip-text="[[i18n('batteryHealthTooltipText')]]"> + tooltip-text="[[i18n('batteryHealthTooltipText')]]" + class="data-point-margin-start"> </data-point> <div slot="body" class="divider"></div> <data-point slot="body" id="cycleCount" header="[[i18n('cycleCount')]]" @@ -24,7 +25,8 @@ <div slot="body" class="divider"></div> <data-point slot="body" id="currentNow" header="[[i18n('currentNowLabel')]]" value="[[getCurrentNow_(batteryChargeStatus_.currentNowMilliamps)]]" - tooltip-text="[[i18n('currentNowTooltipText')]]"> + tooltip-text="[[i18n('currentNowTooltipText')]]" + class="data-point-margin-end"> </data-point> <routine-section slot="routines" routines="[[routines_]]"
diff --git a/chromeos/components/diagnostics_ui/resources/cpu_card.html b/chromeos/components/diagnostics_ui/resources/cpu_card.html index 6cf916bf..7ef34b24 100644 --- a/chromeos/components/diagnostics_ui/resources/cpu_card.html +++ b/chromeos/components/diagnostics_ui/resources/cpu_card.html
@@ -14,14 +14,16 @@ header="[[i18n('cpuUsageLabel')]]" value="[[getCurrentlyUsing_(cpuUsage_.percentUsageSystem, cpuUsage_.percentUsageUser)]]" - tooltip-text="[[getCpuUsageTooltipText_()]]"> + tooltip-text="[[getCpuUsageTooltipText_()]]" + class="data-point-margin-start"> </data-point> <div slot="body" class="divider"></div> <data-point slot="body" id="cpuTemp" header="[[i18n('cpuTempLabel')]]" value="[[getCpuTemp_(cpuUsage_.averageCpuTempCelsius)]]"> </data-point> <div slot="body" class="divider"></div> - <data-point slot="body" id="cpuSpeed" header="[[i18n('cpuSpeedLabel')]]" + <data-point slot="body" id="cpuSpeed" class="data-point-margin-end" + header="[[i18n('cpuSpeedLabel')]]" value="[[getCpuSpeed_(cpuUsage_.scalingCurrentFrequencyKhz)]]"> </data-point> <routine-section slot="routines" routines="[[routines_]]"
diff --git a/chromeos/components/diagnostics_ui/resources/data_point.html b/chromeos/components/diagnostics_ui/resources/data_point.html index 7df986b..e415ee97 100644 --- a/chromeos/components/diagnostics_ui/resources/data_point.html +++ b/chromeos/components/diagnostics_ui/resources/data_point.html
@@ -2,24 +2,27 @@ .data-point { display: flex; flex-direction: column; - height: 45px; + height: 40px; justify-content: space-between; + margin: 12px 0; } .header { @apply --diagnostics-data-point-title-font; - color: var(--diagnostics-overview-text-color); + color: var(--diagnostics-data-point-title-color); } #infoIcon { - fill: var(--google-grey-600); - height: 18px; + bottom: 1px; + fill: var(--google-grey-700); + height: 20px; left: 4px; - width: 18px; + width: 20px; } .value { @apply --diagnostics-data-point-subtitle-font; + color: var(--diagnostics-data-point-subtitle-color); } </style> <div class="data-point">
diff --git a/chromeos/components/diagnostics_ui/resources/diagnostics_card.html b/chromeos/components/diagnostics_ui/resources/diagnostics_card.html index 95e310f4..22939d5 100644 --- a/chromeos/components/diagnostics_ui/resources/diagnostics_card.html +++ b/chromeos/components/diagnostics_ui/resources/diagnostics_card.html
@@ -40,8 +40,8 @@ .data-points { border-bottom: 1px solid var(--diagnostics-border-color); display: grid; - grid-template-columns: 1.5fr 0fr 1fr 0fr 1.5fr; - padding-bottom: 8px; + grid-template-columns: 1fr 0fr 1fr 0fr 1fr; + padding-inline: var(--data-point-container-padding); } .icon {
diff --git a/chromeos/components/diagnostics_ui/resources/diagnostics_fonts_css.html b/chromeos/components/diagnostics_ui/resources/diagnostics_fonts_css.html index f1be742..739a375 100644 --- a/chromeos/components/diagnostics_ui/resources/diagnostics_fonts_css.html +++ b/chromeos/components/diagnostics_ui/resources/diagnostics_fonts_css.html
@@ -3,11 +3,12 @@ :host { --diagnostics-default-font-family: "Google Sans", Roboto, sans-serif; --diagnostics-header-font-family: Roboto, sans-serif; + --diagnostics-data-point-font-family: Roboto, sans-serif; --diagnostics-default-font-size: 14px; --diagnostics-header-font-size: 22px; - --diagnostics-data-point-title-font-size: 12px; - --diagnostics-data-point-subtitle-font-size: 15px; + --diagnostics-data-point-title-font-size: 13px; + --diagnostics-data-point-subtitle-font-size: 13px; --diagnostics-overview-font-size: 13px; --diagnostics-chart-label-font-size: 15px; --diagnostics-chart-tick-font-size: 12px; @@ -15,13 +16,16 @@ --diagnostics-default-font-weight: 500; --diagnostics-header-font-weight: 600; - --diagnostics-data-point-title-font-weight: 500; - --diagnostics-data-point-subtitle-font-weight: 550; + --diagnostics-data-point-title-font-weight: 400; + --diagnostics-data-point-subtitle-font-weight: 450; --diagnostics-overview-font-weight: 500; --diagnostics-default-text-color: var(--google-grey-900); --diagnostics-header-text-color: var(--google-grey-900); --diagnostics-overview-text-color: var(--google-grey-600); + --diagnostics-data-point-title-color: var(--google-grey-900); + --diagnostics-data-point-subtitle-color: var(--google-grey-700); + --diagnostics-default-font: { font-family: var(--diagnostics-default-font-family); font-size: var(--diagnostics-default-font-size); @@ -34,12 +38,12 @@ font-weight: var(--diagnostics-header-font-weight); } --diagnostics-data-point-title-font: { - font-family: var(--diagnostics-default-font-family); + font-family: --diagnostics-data-point-font-family font-size: var(--diagnostics-data-point-title-font-size); font-weight: var(--diagnostics-data-point-title-font-weight); }; --diagnostics-data-point-subtitle-font: { - font-family: var(--diagnostics-default-font-family); + font-family: --diagnostics-data-point-font-family font-size: var(--diagnostics-data-point-subtitle-font-size); font-weight: var(--diagnostics-data-point-subtitle-font-weight); };
diff --git a/chromeos/components/diagnostics_ui/resources/diagnostics_shared_css.html b/chromeos/components/diagnostics_ui/resources/diagnostics_shared_css.html index 5ec1273..7db368eb 100644 --- a/chromeos/components/diagnostics_ui/resources/diagnostics_shared_css.html +++ b/chromeos/components/diagnostics_ui/resources/diagnostics_shared_css.html
@@ -13,12 +13,20 @@ background-color: var(--cros-bg-color); } + .data-point-margin-end { + margin-right: 20px; + } + + .data-point-margin-start { + margin-left: 20px; + } + .divider { - border-left: 1px solid var(--diagnostics-border-color); - height: 36px; - padding-inline-start: 20px; + border-left: 1px solid var(--google-grey-200); + height: 32px; + padding-inline: 16px; position: relative; - top: 12%; + top: 24%; } @media (min-width:600px) { @@ -26,6 +34,7 @@ --container-padding: 24px; --content-container-width: 552px; --chart-width: 452px; + --data-point-container-padding: 44px; } } @@ -34,6 +43,7 @@ --container-padding: 64px; --content-container-width: 640px; --chart-width: 540px; + --data-point-container-padding: 64px; } } @@ -42,6 +52,7 @@ --container-padding: 160px; --content-container-width: 640px; --chart-width: 540px; + --data-point-container-padding: 64px; } } @@ -50,6 +61,7 @@ --container-padding: 160px; --content-container-width: 680px; --chart-width: 580px; + --data-point-container-padding: 64px; } } @@ -58,6 +70,7 @@ --container-padding: 360px; --content-container-width: 720px; --chart-width: 620px; + --data-point-container-padding: 64px; } } </style>
diff --git a/chromeos/components/multidevice/secure_message_delegate_impl.cc b/chromeos/components/multidevice/secure_message_delegate_impl.cc index 338502a..fa52391 100644 --- a/chromeos/components/multidevice/secure_message_delegate_impl.cc +++ b/chromeos/components/multidevice/secure_message_delegate_impl.cc
@@ -49,29 +49,6 @@ return std::string(); } -// Parses the serialized HeaderAndBody string returned by the DBus client, and -// calls the corresponding SecureMessageDelegate unwrap callback. -void HandleUnwrapResult( - SecureMessageDelegate::UnwrapSecureMessageCallback callback, - const std::string& unwrap_result) { - securemessage::HeaderAndBody header_and_body; - if (!header_and_body.ParseFromString(unwrap_result)) { - std::move(callback).Run(false, std::string(), securemessage::Header()); - } else { - std::move(callback).Run(true, header_and_body.body(), - header_and_body.header()); - } -} - -// The SecureMessageDelegate expects the keys in the reverse order returned by -// the DBus client. -void HandleKeyPairResult( - SecureMessageDelegate::GenerateKeyPairCallback callback, - const std::string& private_key, - const std::string& public_key) { - std::move(callback).Run(public_key, private_key); -} - } // namespace // static @@ -103,14 +80,17 @@ void SecureMessageDelegateImpl::GenerateKeyPair( GenerateKeyPairCallback callback) { dbus_client_->GenerateEcP256KeyPair( - base::BindOnce(HandleKeyPairResult, std::move(callback))); + base::BindOnce(&SecureMessageDelegateImpl::OnGenerateKeyPairResult, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void SecureMessageDelegateImpl::DeriveKey(const std::string& private_key, const std::string& public_key, DeriveKeyCallback callback) { - dbus_client_->PerformECDHKeyAgreement(private_key, public_key, - std::move(callback)); + dbus_client_->PerformECDHKeyAgreement( + private_key, public_key, + base::BindOnce(&SecureMessageDelegateImpl::OnDeriveKeyResult, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void SecureMessageDelegateImpl::CreateSecureMessage( @@ -143,7 +123,10 @@ options.encryption_type = EncSchemeToString(create_options.encryption_scheme); options.signature_type = SigSchemeToString(create_options.signature_scheme); - dbus_client_->CreateSecureMessage(payload, options, std::move(callback)); + dbus_client_->CreateSecureMessage( + payload, options, + base::BindOnce(&SecureMessageDelegateImpl::OnCreateSecureMessageResult, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } void SecureMessageDelegateImpl::UnwrapSecureMessage( @@ -169,7 +152,41 @@ dbus_client_->UnwrapSecureMessage( serialized_message, options, - base::BindOnce(&HandleUnwrapResult, std::move(callback))); + base::BindOnce(&SecureMessageDelegateImpl::OnUnwrapSecureMessageResult, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void SecureMessageDelegateImpl::OnGenerateKeyPairResult( + GenerateKeyPairCallback callback, + const std::string& private_key, + const std::string& public_key) { + // The SecureMessageDelegate expects the keys in the reverse order returned by + // the DBus client. + std::move(callback).Run(public_key, private_key); +} + +void SecureMessageDelegateImpl::OnDeriveKeyResult( + DeriveKeyCallback callback, + const std::string& derived_key) { + std::move(callback).Run(derived_key); +} + +void SecureMessageDelegateImpl::OnCreateSecureMessageResult( + CreateSecureMessageCallback callback, + const std::string& secure_message) { + std::move(callback).Run(secure_message); +} + +void SecureMessageDelegateImpl::OnUnwrapSecureMessageResult( + UnwrapSecureMessageCallback callback, + const std::string& unwrap_result) { + securemessage::HeaderAndBody header_and_body; + if (!header_and_body.ParseFromString(unwrap_result)) { + std::move(callback).Run(false, std::string(), securemessage::Header()); + } else { + std::move(callback).Run(true, header_and_body.body(), + header_and_body.header()); + } } } // namespace multidevice
diff --git a/chromeos/components/multidevice/secure_message_delegate_impl.h b/chromeos/components/multidevice/secure_message_delegate_impl.h index 73de08a..f2fff819 100644 --- a/chromeos/components/multidevice/secure_message_delegate_impl.h +++ b/chromeos/components/multidevice/secure_message_delegate_impl.h
@@ -6,6 +6,7 @@ #define CHROMEOS_COMPONENTS_MULTIDEVICE_SECURE_MESSAGE_DELEGATE_IMPL_H_ #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "chromeos/components/multidevice/secure_message_delegate.h" namespace chromeos { @@ -15,6 +16,8 @@ namespace multidevice { // Concrete SecureMessageDelegate implementation. +// Note: Callbacks are guaranteed to *not* be invoked after +// SecureMessageDelegateImpl is destroyed. class SecureMessageDelegateImpl : public SecureMessageDelegate { public: class Factory { @@ -49,9 +52,26 @@ private: SecureMessageDelegateImpl(); + // Processes results returned from the dbus client, if necessary, and invokes + // the SecureMessageDelegate callbacks with the processed results. Note: When + // invoking dbus client methods, we bind these functions to a weak pointer to + // ensure that these functions are not called after the + // SecureMessageDelegateImpl object is destroyed. + void OnGenerateKeyPairResult(GenerateKeyPairCallback callback, + const std::string& private_key, + const std::string& public_key); + void OnDeriveKeyResult(DeriveKeyCallback callback, + const std::string& derived_key); + void OnCreateSecureMessageResult(CreateSecureMessageCallback callback, + const std::string& secure_message); + void OnUnwrapSecureMessageResult(UnwrapSecureMessageCallback callback, + const std::string& unwrap_result); + // Not owned by this instance. chromeos::EasyUnlockClient* dbus_client_; + base::WeakPtrFactory<SecureMessageDelegateImpl> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(SecureMessageDelegateImpl); };
diff --git a/chromeos/components/quick_answers/understanding/intent_generator.cc b/chromeos/components/quick_answers/understanding/intent_generator.cc index 1ab8d255..8dbd72f9 100644 --- a/chromeos/components/quick_answers/understanding/intent_generator.cc +++ b/chromeos/components/quick_answers/understanding/intent_generator.cc
@@ -15,6 +15,7 @@ #include "chromeos/constants/chromeos_features.h" #include "chromeos/services/machine_learning/public/cpp/service_connection.h" #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h" +#include "ui/base/l10n/l10n_util.h" namespace chromeos { namespace quick_answers { @@ -109,12 +110,17 @@ return false; } -bool IsPreferredLanguage(const std::string& detected_locale, +bool IsPreferredLanguage(const std::string& detected_language, const std::string& preferred_languages_string) { auto preferred_languages = base::SplitString(preferred_languages_string, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - return base::Contains(preferred_languages, detected_locale); + + for (const std::string& locale : preferred_languages) { + if (l10n_util::GetLanguage(locale) == detected_language) + return true; + } + return false; } } // namespace @@ -191,17 +197,17 @@ void IntentGenerator::LanguageDetectorCallback( const QuickAnswersRequest& request, - base::Optional<std::string> detected_locale) { + base::Optional<std::string> detected_language) { language_detector_.reset(); // Generate translation intent if the detected language is different to the // system language and is not one of the preferred languages. - if (detected_locale.has_value() && - detected_locale.value() != request.context.device_properties.language && + if (detected_language.has_value() && + detected_language.value() != request.context.device_properties.language && !IsPreferredLanguage( - detected_locale.value(), + detected_language.value(), request.context.device_properties.preferred_languages)) { - MaybeGenerateTranslationIntent(request, detected_locale.value()); + MaybeGenerateTranslationIntent(request, detected_language.value()); return; } @@ -224,7 +230,7 @@ void IntentGenerator::MaybeGenerateTranslationIntent( const QuickAnswersRequest& request, - const std::string& detected_locale) { + const std::string& detected_language) { DCHECK(complete_callback_); if (!features::IsQuickAnswersTranslationEnabled()) { @@ -245,7 +251,7 @@ std::move(complete_callback_) .Run(IntentInfo(request.selected_text, IntentType::kTranslation, - detected_locale, + detected_language, request.context.device_properties.language)); }
diff --git a/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc b/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc index 7ff0dd0..a7a27481 100644 --- a/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc +++ b/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc
@@ -121,7 +121,7 @@ EXPECT_EQ("quick answers", intent_info_.intent_text); } -TEST_F(IntentGeneratorTest, TranslationIntentPreferredLanguage) { +TEST_F(IntentGeneratorTest, TranslationIntentPreferredLocale) { std::vector<TextLanguagePtr> languages; languages.push_back(DefaultLanguage()); UseFakeServiceConnection({}, languages); @@ -140,6 +140,25 @@ EXPECT_EQ("quick answers", intent_info_.intent_text); } +TEST_F(IntentGeneratorTest, TranslationIntentPreferredLanguage) { + std::vector<TextLanguagePtr> languages; + languages.push_back(DefaultLanguage()); + UseFakeServiceConnection({}, languages); + + QuickAnswersRequest request; + request.selected_text = "quick answers"; + request.context.device_properties.language = "es"; + request.context.device_properties.preferred_languages = "es-MX,en-US,zh-CN"; + intent_generator_->GenerateIntent(request); + + task_environment_.RunUntilIdle(); + + // Should not generate translation intent since the detected language is in + // the preferred languages list. + EXPECT_EQ(IntentType::kUnknown, intent_info_.intent_type); + EXPECT_EQ("quick answers", intent_info_.intent_text); +} + TEST_F(IntentGeneratorTest, TranslationIntentTextLengthAboveThreshold) { std::vector<TextLanguagePtr> languages; languages.push_back(DefaultLanguage());
diff --git a/chromeos/components/quick_answers/utils/language_detector.cc b/chromeos/components/quick_answers/utils/language_detector.cc index f3998de..f0b2467 100644 --- a/chromeos/components/quick_answers/utils/language_detector.cc +++ b/chromeos/components/quick_answers/utils/language_detector.cc
@@ -7,6 +7,7 @@ #include "base/callback.h" #include "base/metrics/field_trial_params.h" #include "chromeos/constants/chromeos_features.h" +#include "ui/base/l10n/l10n_util.h" namespace chromeos { namespace quick_answers { @@ -27,7 +28,7 @@ // highest to the lowest (according to the mojom method documentation). if (!languages.empty() && languages.front()->confidence > confidence_threshold) { - return languages.front()->locale; + return l10n_util::GetLanguage(languages.front()->locale); } return base::nullopt; }
diff --git a/chromeos/components/scanning/resources/scan_preview.html b/chromeos/components/scanning/resources/scan_preview.html index dbad0f5..23ccf2f 100644 --- a/chromeos/components/scanning/resources/scan_preview.html +++ b/chromeos/components/scanning/resources/scan_preview.html
@@ -58,6 +58,10 @@ width: calc(100% - 2px); } + .scanned-image { + display: block; + } + /* Add top margin to all but the first scanned image. */ .scanned-image:nth-of-type(n+2) { margin-top: 8px;
diff --git a/chromeos/components/scanning/scanning_uma.h b/chromeos/components/scanning/scanning_uma.h index 546feed..36881c893 100644 --- a/chromeos/components/scanning/scanning_uma.h +++ b/chromeos/components/scanning/scanning_uma.h
@@ -8,16 +8,24 @@ namespace chromeos { namespace scanning { -// These are used in histograms, do not remove/renumber entries. If you're -// adding to this enum with the intention that it will be logged, update the -// ScanAppEntryPoint enum listing in +// The enums below are used in histograms, do not remove/renumber entries. If +// you're adding to any of these enums, update the corresponding enum listing in // tools/metrics/histograms/enums.xml. + enum class ScanAppEntryPoint { kSettings = 0, kLauncher = 1, kMaxValue = kLauncher, }; +enum class ScanJobFailureReason { + kUnknownScannerError = 0, + kScannerNotFound = 1, + kUnsupportedScanToPath = 2, + kSaveToDiskFailed = 3, + kMaxValue = kSaveToDiskFailed, +}; + // Records ScanAppEntryPoint histogram value. void RecordScanAppEntryPoint(ScanAppEntryPoint entry_point);
diff --git a/chromeos/components/sync_wifi/fake_local_network_collector.h b/chromeos/components/sync_wifi/fake_local_network_collector.h index f4976aa2..4e1793e 100644 --- a/chromeos/components/sync_wifi/fake_local_network_collector.h +++ b/chromeos/components/sync_wifi/fake_local_network_collector.h
@@ -27,6 +27,7 @@ // For test purposes, |guid| == serialized NetworkIdentifier. void GetSyncableNetwork(const std::string& guid, ProtoCallback callback) override; + void RecordZeroNetworksEligibleForSync() override {} // For test purposes, |guid| == serialized NetworkIdentifier. base::Optional<NetworkIdentifier> GetNetworkIdentifierFromGuid( const std::string& guid) override;
diff --git a/chromeos/components/sync_wifi/local_network_collector.h b/chromeos/components/sync_wifi/local_network_collector.h index f9e73b3..3eb97610 100644 --- a/chromeos/components/sync_wifi/local_network_collector.h +++ b/chromeos/components/sync_wifi/local_network_collector.h
@@ -50,6 +50,10 @@ virtual void GetSyncableNetwork(const std::string& guid, ProtoCallback callback) = 0; + // Record the reason(s) why zero of the local networks are eligible to be + // synced. + virtual void RecordZeroNetworksEligibleForSync() = 0; + // Retrieves the NetworkIdentifier for a given local network's |guid| // if the network no longer exists it returns nullopt. virtual base::Optional<NetworkIdentifier> GetNetworkIdentifierFromGuid(
diff --git a/chromeos/components/sync_wifi/local_network_collector_impl.cc b/chromeos/components/sync_wifi/local_network_collector_impl.cc index b9ff459..f24a7271 100644 --- a/chromeos/components/sync_wifi/local_network_collector_impl.cc +++ b/chromeos/components/sync_wifi/local_network_collector_impl.cc
@@ -40,8 +40,10 @@ } // namespace LocalNetworkCollectorImpl::LocalNetworkCollectorImpl( - network_config::mojom::CrosNetworkConfig* cros_network_config) - : cros_network_config_(cros_network_config) { + network_config::mojom::CrosNetworkConfig* cros_network_config, + SyncedNetworkMetricsLogger* metrics_recorder) + : cros_network_config_(cros_network_config), + metrics_recorder_(metrics_recorder) { cros_network_config_->AddObserver( cros_network_config_observer_receiver_.BindNewPipeAndPassRemote()); @@ -53,6 +55,13 @@ void LocalNetworkCollectorImpl::GetAllSyncableNetworks( ProtoListCallback callback) { + if (!is_mojo_networks_loaded_) { + after_networks_are_loaded_callback_queue_.push( + base::BindOnce(&LocalNetworkCollectorImpl::GetAllSyncableNetworks, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + return; + } + std::string request_guid = InitializeRequest(); request_guid_to_list_callback_[request_guid] = std::move(callback); @@ -74,6 +83,39 @@ } } +void LocalNetworkCollectorImpl::RecordZeroNetworksEligibleForSync() { + if (has_logged_zero_eligible_networks_metric_) { + return; + } + + if (!is_mojo_networks_loaded_) { + after_networks_are_loaded_callback_queue_.push(base::BindOnce( + &LocalNetworkCollectorImpl::RecordZeroNetworksEligibleForSync, + weak_ptr_factory_.GetWeakPtr())); + return; + } + + base::flat_set<NetworkEligibilityStatus> + network_eligible_for_sync_status_codes; + NetworkEligibilityStatus network_eligible_for_sync_status; + for (const network_config::mojom::NetworkStatePropertiesPtr& network : + mojo_networks_) { + if (!network || + network->type != network_config::mojom::NetworkType::kWiFi) { + continue; + } + network_eligible_for_sync_status = GetNetworkEligibilityStatus( + network->guid, network->connectable, + network->type_state->get_wifi()->security, network->source, + /*log_result=*/false); + network_eligible_for_sync_status_codes.insert( + network_eligible_for_sync_status); + } + metrics_recorder_->RecordZeroNetworksEligibleForSync( + network_eligible_for_sync_status_codes); + has_logged_zero_eligible_networks_metric_ = true; +} + void LocalNetworkCollectorImpl::GetSyncableNetwork(const std::string& guid, ProtoCallback callback) { const network_config::mojom::NetworkStateProperties* network = nullptr; @@ -273,6 +315,13 @@ } void LocalNetworkCollectorImpl::OnNetworkStateListChanged() { + if (!NetworkHandler::Get() + ->network_state_handler() + ->IsProfileNetworksLoaded()) { + is_mojo_networks_loaded_ = false; + return; + } + cros_network_config_->GetNetworkStateList( network_config::mojom::NetworkFilter::New( network_config::mojom::FilterType::kConfigured, @@ -285,6 +334,11 @@ void LocalNetworkCollectorImpl::OnGetNetworkList( std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks) { mojo_networks_ = std::move(networks); + is_mojo_networks_loaded_ = true; + while (!after_networks_are_loaded_callback_queue_.empty()) { + std::move(after_networks_are_loaded_callback_queue_.front()).Run(); + after_networks_are_loaded_callback_queue_.pop(); + } } } // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/local_network_collector_impl.h b/chromeos/components/sync_wifi/local_network_collector_impl.h index 3883367..024bc3d 100644 --- a/chromeos/components/sync_wifi/local_network_collector_impl.h +++ b/chromeos/components/sync_wifi/local_network_collector_impl.h
@@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "chromeos/components/sync_wifi/local_network_collector.h" +#include "chromeos/components/sync_wifi/synced_network_metrics_logger.h" #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -39,12 +40,16 @@ // |cros_network_config| and |network_metadata_store| must outlive this class. explicit LocalNetworkCollectorImpl( - network_config::mojom::CrosNetworkConfig* cros_network_config); + network_config::mojom::CrosNetworkConfig* cros_network_config, + SyncedNetworkMetricsLogger* metrics_recorder); ~LocalNetworkCollectorImpl() override; // Can only execute one request at a time. void GetAllSyncableNetworks(ProtoListCallback callback) override; + // Executes at most once per instance of LocalNetworkCollectorImpl. + void RecordZeroNetworksEligibleForSync() override; + // Can be called on multiple networks simultaneously. void GetSyncableNetwork(const std::string& guid, ProtoCallback callback) override; @@ -102,6 +107,7 @@ std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks); network_config::mojom::CrosNetworkConfig* cros_network_config_; + SyncedNetworkMetricsLogger* metrics_recorder_; mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver> cros_network_config_observer_receiver_{this}; std::vector<network_config::mojom::NetworkStatePropertiesPtr> mojo_networks_; @@ -113,6 +119,10 @@ request_guid_to_in_flight_networks_; base::flat_map<std::string, ProtoCallback> request_guid_to_single_callback_; base::flat_map<std::string, ProtoListCallback> request_guid_to_list_callback_; + base::queue<base::OnceCallback<void()>> + after_networks_are_loaded_callback_queue_; + bool is_mojo_networks_loaded_ = false; + bool has_logged_zero_eligible_networks_metric_ = false; base::WeakPtrFactory<LocalNetworkCollectorImpl> weak_ptr_factory_{this}; };
diff --git a/chromeos/components/sync_wifi/local_network_collector_impl_unittest.cc b/chromeos/components/sync_wifi/local_network_collector_impl_unittest.cc index ebe2ac3b8..3cfc501 100644 --- a/chromeos/components/sync_wifi/local_network_collector_impl_unittest.cc +++ b/chromeos/components/sync_wifi/local_network_collector_impl_unittest.cc
@@ -9,12 +9,14 @@ #include "base/macros.h" #include "base/optional.h" #include "base/run_loop.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "chromeos/components/sync_wifi/local_network_collector.h" #include "chromeos/components/sync_wifi/local_network_collector_impl.h" #include "chromeos/components/sync_wifi/network_identifier.h" #include "chromeos/components/sync_wifi/network_test_helper.h" #include "chromeos/components/sync_wifi/network_type_conversions.h" +#include "chromeos/components/sync_wifi/synced_network_metrics_logger.h" #include "chromeos/components/sync_wifi/test_data_generator.h" #include "chromeos/dbus/shill/fake_shill_simulated_result.h" #include "chromeos/network/network_handler.h" @@ -59,10 +61,15 @@ void SetUp() override { testing::Test::SetUp(); helper()->SetUp(); + metrics_logger_ = std::make_unique<SyncedNetworkMetricsLogger>( + /*network_state_handler=*/nullptr, + /*network_connection_handler=*/nullptr); + local_network_collector_ = std::make_unique<LocalNetworkCollectorImpl>( - remote_cros_network_config_.get()); + remote_cros_network_config_.get(), metrics_logger_.get()); local_network_collector_->SetNetworkMetadataStore( NetworkHandler::Get()->network_metadata_store()->GetWeakPtr()); + on_get_all_syncable_networks_count_ = 0; } void TearDown() override { @@ -77,6 +84,7 @@ for (int i = 0; i < (int)result.size(); i++) { EXPECT_EQ(expected[i], DecodeHexString(result[i].hex_ssid())); } + on_get_all_syncable_networks_count_++; } void OnGetSyncableNetwork( @@ -103,15 +111,21 @@ } NetworkTestHelper* helper() { return local_test_helper_.get(); } + size_t on_get_all_syncable_networks_count() { + return on_get_all_syncable_networks_count_; + } private: base::test::TaskEnvironment task_environment_; std::unique_ptr<LocalNetworkCollector> local_network_collector_; + std::unique_ptr<SyncedNetworkMetricsLogger> metrics_logger_; std::unique_ptr<NetworkTestHelper> local_test_helper_; mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig> remote_cros_network_config_; + size_t on_get_all_syncable_networks_count_; + DISALLOW_COPY_AND_ASSIGN(LocalNetworkCollectorImplTest); }; @@ -130,6 +144,41 @@ } TEST_F(LocalNetworkCollectorImplTest, + TestGetAllSyncableNetworks_MojoNetworksUnitializedThenInitialized) { + const std::string kSharedUserDirectory = + NetworkProfileHandler::GetSharedProfilePath(); + helper()->network_state_test_helper()->ClearProfiles(); + // Add back shared profile path to simulate user on the login screen. + helper()->network_state_test_helper()->profile_test()->AddProfile( + /*profile_path=*/kSharedUserDirectory, /*userhash=*/std::string()); + base::RunLoop().RunUntilIdle(); + + size_t on_get_all_syncable_networks_count_before = + on_get_all_syncable_networks_count(); + local_network_collector()->GetAllSyncableNetworks(base::DoNothing()); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(on_get_all_syncable_networks_count_before, + on_get_all_syncable_networks_count()); + + // Log users back in. + const char* kProfilePathUser = + helper()->network_state_test_helper()->ProfilePathUser(); + const char* kUserHash = helper()->network_state_test_helper()->UserHash(); + helper()->network_state_test_helper()->profile_test()->AddProfile( + /*profile_path=*/kProfilePathUser, /*userhash=*/kUserHash); + helper()->network_state_test_helper()->profile_test()->AddProfile( + /*profile_path=*/kUserHash, /*userhash=*/std::string()); + + std::vector<std::string> expected; + local_network_collector()->GetAllSyncableNetworks( + base::BindOnce(&LocalNetworkCollectorImplTest::OnGetAllSyncableNetworks, + base::Unretained(this), expected)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(on_get_all_syncable_networks_count_before + 1, + on_get_all_syncable_networks_count()); +} + +TEST_F(LocalNetworkCollectorImplTest, TestGetAllSyncableNetworks_WithFiltering) { helper()->ConfigureWiFiNetwork(kFredSsid, /*is_secured=*/true, /*in_profile=*/true, /*has_connected=*/true); @@ -164,6 +213,33 @@ base::RunLoop().RunUntilIdle(); } +TEST_F(LocalNetworkCollectorImplTest, TestRecordZeroNetworksEligibleForSync) { + base::HistogramTester histogram_tester; + helper()->ConfigureWiFiNetwork(kMangoSsid, /*is_secured=*/true, + /*in_profile=*/false, /*has_connected=*/true, + /*owned_by_user=*/false); + helper()->ConfigureWiFiNetwork(kAnnieSsid, /*is_secured=*/false, + /*in_profile=*/true, /*has_connected=*/true); + helper()->ConfigureWiFiNetwork(kWalterSsid, /*is_secured=*/true, + /*in_profile=*/false, /*has_connected=*/true, + /*owned_by_user=*/true, + /*configured_by_sync=*/false, + /*is_from_policy=*/true); + + local_network_collector()->RecordZeroNetworksEligibleForSync(); + base::RunLoop().RunUntilIdle(); + histogram_tester.ExpectTotalCount(kZeroNetworksSyncedReasonHistogram, 3); + histogram_tester.ExpectBucketCount( + kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kUnsupportedSecurityType, 1); + histogram_tester.ExpectBucketCount( + kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNotConfiguredByUser, 1); + histogram_tester.ExpectBucketCount( + kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kProhibitedByPolicy, 1); +} + TEST_F(LocalNetworkCollectorImplTest, TestGetSyncableNetwork) { std::string guid = helper()->ConfigureWiFiNetwork( kFredSsid, /*is_secured=*/true,
diff --git a/chromeos/components/sync_wifi/network_eligibility_checker.cc b/chromeos/components/sync_wifi/network_eligibility_checker.cc index d33b0da..96ba50d1 100644 --- a/chromeos/components/sync_wifi/network_eligibility_checker.cc +++ b/chromeos/components/sync_wifi/network_eligibility_checker.cc
@@ -14,17 +14,18 @@ namespace sync_wifi { -bool IsEligibleForSync(const std::string& guid, - bool is_connectable, - const network_config::mojom::SecurityType& security_type, - const network_config::mojom::OncSource& source, - bool log_result) { +NetworkEligibilityStatus GetNetworkEligibilityStatus( + const std::string& guid, + bool is_connectable, + const network_config::mojom::SecurityType& security_type, + const network_config::mojom::OncSource& source, + bool log_result) { NetworkMetadataStore* network_metadata_store = NetworkHandler::IsInitialized() ? NetworkHandler::Get()->network_metadata_store() : nullptr; if (!network_metadata_store) - return false; + return NetworkEligibilityStatus::kNoMetadata; if (source == network_config::mojom::OncSource::kDevicePolicy || source == network_config::mojom::OncSource::kUserPolicy) { @@ -32,7 +33,7 @@ NET_LOG(EVENT) << NetworkGuidId(guid) << " is not eligible, configured by policy."; } - return false; + return NetworkEligibilityStatus::kProhibitedByPolicy; } if (network_metadata_store->GetHasBadPassword(guid) && @@ -42,7 +43,7 @@ << NetworkGuidId(guid) << " is not eligible, it has a bad password and has never connected."; } - return false; + return NetworkEligibilityStatus::kInvalidPassword; } if (!is_connectable) { @@ -50,7 +51,7 @@ NET_LOG(EVENT) << NetworkGuidId(guid) << " is not eligible, it is not connectable."; } - return false; + return NetworkEligibilityStatus::kNotConnectable; } if (!network_metadata_store->GetIsCreatedByUser(guid)) { @@ -58,7 +59,7 @@ NET_LOG(EVENT) << NetworkGuidId(guid) << " is not eligible, was not configured by user."; } - return false; + return NetworkEligibilityStatus::kNotConfiguredByUser; } if (security_type != network_config::mojom::SecurityType::kWepPsk && @@ -68,13 +69,23 @@ << " is not eligible, security type not supported: " << security_type; } - return false; + return NetworkEligibilityStatus::kUnsupportedSecurityType; } if (log_result) { NET_LOG(EVENT) << NetworkGuidId(guid) << " is eligible for sync."; } - return true; + return NetworkEligibilityStatus::kNetworkIsEligible; +} + +bool IsEligibleForSync(const std::string& guid, + bool is_connectable, + const network_config::mojom::SecurityType& security_type, + const network_config::mojom::OncSource& source, + bool log_result) { + return GetNetworkEligibilityStatus(guid, is_connectable, security_type, + source, log_result) == + NetworkEligibilityStatus::kNetworkIsEligible; } } // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/network_eligibility_checker.h b/chromeos/components/sync_wifi/network_eligibility_checker.h index 09e9867..5706be6 100644 --- a/chromeos/components/sync_wifi/network_eligibility_checker.h +++ b/chromeos/components/sync_wifi/network_eligibility_checker.h
@@ -14,6 +14,27 @@ namespace sync_wifi { +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class NetworkEligibilityStatus { + kNetworkIsEligible = 0, + kNoMetadata = 1, + kProhibitedByPolicy = 2, + kInvalidPassword = 3, + kNotConnectable = 4, + kNotConfiguredByUser = 5, + kUnsupportedSecurityType = 6, + kNoWifiNetworksAvailable = 7, + kMaxValue = kNoWifiNetworksAvailable +}; + +NetworkEligibilityStatus GetNetworkEligibilityStatus( + const std::string& guid, + bool is_connectable, + const network_config::mojom::SecurityType& security_type, + const network_config::mojom::OncSource& source, + bool log_result); + bool IsEligibleForSync(const std::string& guid, bool is_connectable, const network_config::mojom::SecurityType& security_type,
diff --git a/chromeos/components/sync_wifi/network_test_helper.cc b/chromeos/components/sync_wifi/network_test_helper.cc index f952deb..f813e7af 100644 --- a/chromeos/components/sync_wifi/network_test_helper.cc +++ b/chromeos/components/sync_wifi/network_test_helper.cc
@@ -76,7 +76,8 @@ NetworkHandler::Get()->InitializePrefServices(&user_prefs_, &local_state_); network_state_helper_->ResetDevicesAndServices(); network_state_helper_->profile_test()->AddProfile( - network_state_helper_->UserHash(), std::string()); + /*profile_path=*/network_state_helper_->UserHash(), + /*userhash=*/std::string()); base::RunLoop().RunUntilIdle(); }
diff --git a/chromeos/components/sync_wifi/synced_network_metrics_logger.cc b/chromeos/components/sync_wifi/synced_network_metrics_logger.cc index 9fffb3b..0e20455 100644 --- a/chromeos/components/sync_wifi/synced_network_metrics_logger.cc +++ b/chromeos/components/sync_wifi/synced_network_metrics_logger.cc
@@ -6,8 +6,10 @@ #include "base/bind.h" #include "base/metrics/histogram_functions.h" +#include "chromeos/components/sync_wifi/network_eligibility_checker.h" #include "chromeos/network/network_configuration_handler.h" #include "chromeos/network/network_connection_handler.h" +#include "chromeos/network/network_event_log.h" #include "chromeos/network/network_metadata_store.h" #include "chromeos/network/network_state_handler.h" #include "third_party/cros_system_api/dbus/service_constants.h" @@ -236,6 +238,28 @@ base::UmaHistogramCounts1000(kTotalCountHistogram, count); } +void SyncedNetworkMetricsLogger::RecordZeroNetworksEligibleForSync( + base::flat_set<NetworkEligibilityStatus> network_eligibility_status_codes) { + // There is an eligible network that was not synced for some reason. + if (network_eligibility_status_codes.find( + NetworkEligibilityStatus::kNetworkIsEligible) != + network_eligibility_status_codes.end()) { + base::UmaHistogramEnumeration(kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNetworkIsEligible); + return; + } + + if (network_eligibility_status_codes.size() == 0) { + network_eligibility_status_codes.insert( + NetworkEligibilityStatus::kNoWifiNetworksAvailable); + } + for (const NetworkEligibilityStatus network_eligibility_status_code : + network_eligibility_status_codes) { + base::UmaHistogramEnumeration(kZeroNetworksSyncedReasonHistogram, + network_eligibility_status_code); + } +} + } // namespace sync_wifi } // namespace chromeos
diff --git a/chromeos/components/sync_wifi/synced_network_metrics_logger.h b/chromeos/components/sync_wifi/synced_network_metrics_logger.h index 2e0c374e..9517ae9 100644 --- a/chromeos/components/sync_wifi/synced_network_metrics_logger.h +++ b/chromeos/components/sync_wifi/synced_network_metrics_logger.h
@@ -10,8 +10,10 @@ #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "base/values.h" +#include "chromeos/components/sync_wifi/network_eligibility_checker.h" #include "chromeos/network/network_connection_observer.h" #include "chromeos/network/network_state_handler_observer.h" +#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" namespace chromeos { @@ -35,6 +37,8 @@ "Network.Wifi.Synced.UpdateOperation.FailureReason"; const char kApplyResultHistogram[] = "Network.Wifi.Synced.UpdateOperation.Result"; +const char kZeroNetworksSyncedReasonHistogram[] = + "Network.Wifi.Synced.ZeroNetworksEligibleForSync.EligibilityStatus"; const char kTotalCountHistogram[] = "Network.Wifi.Synced.TotalCount"; @@ -112,6 +116,9 @@ const std::string& error_string); void RecordApplyNetworkSuccess(); void RecordTotalCount(int count); + void RecordZeroNetworksEligibleForSync( + base::flat_set<NetworkEligibilityStatus> + network_eligiblility_status_codes); private: static ConnectionFailureReason ConnectionFailureReasonToEnum(
diff --git a/chromeos/components/sync_wifi/synced_network_metrics_logger_unittest.cc b/chromeos/components/sync_wifi/synced_network_metrics_logger_unittest.cc index 033992fcf..c294d23 100644 --- a/chromeos/components/sync_wifi/synced_network_metrics_logger_unittest.cc +++ b/chromeos/components/sync_wifi/synced_network_metrics_logger_unittest.cc
@@ -14,6 +14,7 @@ #include "chromeos/network/network_metadata_store.h" #include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_state_test_helper.h" +#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/service_constants.h" @@ -247,6 +248,45 @@ testing::ContainerEq(base::HistogramTester::CountsMap())); } +TEST_F(SyncedNetworkMetricsLoggerTest, RecordZeroNetworksEligibleForSync) { + base::HistogramTester histogram_tester; + + base::flat_set<NetworkEligibilityStatus> + network_eligible_for_sync_status_codes; + network_eligible_for_sync_status_codes.insert( + NetworkEligibilityStatus::kNoWifiNetworksAvailable); + synced_network_metrics_logger()->RecordZeroNetworksEligibleForSync( + network_eligible_for_sync_status_codes); + histogram_tester.ExpectBucketCount( + kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNoWifiNetworksAvailable, 1); + histogram_tester.ExpectTotalCount(kZeroNetworksSyncedReasonHistogram, 1); + + network_eligible_for_sync_status_codes.insert( + NetworkEligibilityStatus::kNotConnectable); + synced_network_metrics_logger()->RecordZeroNetworksEligibleForSync( + network_eligible_for_sync_status_codes); + histogram_tester.ExpectBucketCount(kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNotConnectable, + 1); + histogram_tester.ExpectTotalCount(kZeroNetworksSyncedReasonHistogram, 3); + + network_eligible_for_sync_status_codes.insert( + NetworkEligibilityStatus::kNetworkIsEligible); + synced_network_metrics_logger()->RecordZeroNetworksEligibleForSync( + network_eligible_for_sync_status_codes); + histogram_tester.ExpectBucketCount( + kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNetworkIsEligible, 1); + histogram_tester.ExpectBucketCount(kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNotConnectable, + 1); + histogram_tester.ExpectBucketCount( + kZeroNetworksSyncedReasonHistogram, + NetworkEligibilityStatus::kNoWifiNetworksAvailable, 2); + histogram_tester.ExpectTotalCount(kZeroNetworksSyncedReasonHistogram, 4); +} + } // namespace sync_wifi } // namespace chromeos
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc index e23cb456..961c77d 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc
@@ -205,6 +205,10 @@ batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); metrics_recorder_->RecordTotalCount(entries_.size()); + // If zero networks are synced log the reason. + if (entries_.size() == 0) { + local_network_collector_->RecordZeroNetworksEligibleForSync(); + } } base::Optional<syncer::ModelError> WifiConfigurationBridge::ApplySyncChanges( @@ -243,6 +247,10 @@ batch->TakeMetadataChangesFrom(std::move(metadata_change_list)); Commit(std::move(batch)); metrics_recorder_->RecordTotalCount(entries_.size()); + // If zero networks are synced log the reason. + if (entries_.size() == 0) { + local_network_collector_->RecordZeroNetworksEligibleForSync(); + } return base::nullopt; } @@ -327,6 +335,10 @@ } } metrics_recorder_->RecordTotalCount(entries_size); + // If zero networks are synced log the reason. + if (entries_size == 0) { + local_network_collector_->RecordZeroNetworksEligibleForSync(); + } } void WifiConfigurationBridge::OnReadAllMetadata( @@ -435,6 +447,10 @@ << NetworkId(NetworkStateFromNetworkIdentifier(id)) << " to sync."; metrics_recorder_->RecordTotalCount(entries_.size()); + // If zero networks are synced log the reason. + if (entries_.size() == 0) { + local_network_collector_->RecordZeroNetworksEligibleForSync(); + } } void WifiConfigurationBridge::OnNetworkCreated(const std::string& guid) {
diff --git a/chromeos/components/sync_wifi/wifi_configuration_sync_service.cc b/chromeos/components/sync_wifi/wifi_configuration_sync_service.cc index 6726beb..e8ee1ba 100644 --- a/chromeos/components/sync_wifi/wifi_configuration_sync_service.cc +++ b/chromeos/components/sync_wifi/wifi_configuration_sync_service.cc
@@ -42,7 +42,7 @@ remote_cros_network_config_.get(), timer_factory_.get(), metrics_logger_.get()); collector_ = std::make_unique<LocalNetworkCollectorImpl>( - remote_cros_network_config_.get()); + remote_cros_network_config_.get(), metrics_logger_.get()); bridge_ = std::make_unique<sync_wifi::WifiConfigurationBridge>( updater_.get(), collector_.get(), network_handler->network_configuration_handler(), metrics_logger_.get(),
diff --git a/chromeos/components/web_applications/externs/file_handling.externs.js b/chromeos/components/web_applications/externs/file_handling.externs.js index 25ee66c..35b637e9 100644 --- a/chromeos/components/web_applications/externs/file_handling.externs.js +++ b/chromeos/components/web_applications/externs/file_handling.externs.js
@@ -98,12 +98,12 @@ } /** @typedef {{keepExistingData: boolean}} */ -let FileSystemCreateWriterOptions; +let FileSystemCreateWritableOptions; /** @interface */ class FileSystemFileHandle extends FileSystemHandle { /** - * @param {FileSystemCreateWriterOptions=} options + * @param {FileSystemCreateWritableOptions=} options * @return {!Promise<!FileSystemWritableFileStream>} */ createWritable(options) {}
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.cc b/chromeos/dbus/shill/fake_shill_manager_client.cc index 93b9fc9..ebe06b7 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.cc +++ b/chromeos/dbus/shill/fake_shill_manager_client.cc
@@ -1148,6 +1148,14 @@ return new_service_list; } +void FakeShillManagerClient::ClearProfiles() { + if (GetListProperty(shill::kProfilesProperty)->empty()) { + return; + } + GetListProperty(shill::kProfilesProperty)->ClearList(); + CallNotifyObserversPropertyChanged(shill::kProfilesProperty); +} + void FakeShillManagerClient::ScanCompleted(const std::string& device_path) { VLOG(1) << "ScanCompleted: " << device_path; if (!device_path.empty()) {
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.h b/chromeos/dbus/shill/fake_shill_manager_client.h index 835448f..298c272 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.h +++ b/chromeos/dbus/shill/fake_shill_manager_client.h
@@ -98,6 +98,7 @@ void SetSimulateConfigurationResult( FakeShillSimulatedResult configuration_result) override; base::Value GetEnabledServiceList() const override; + void ClearProfiles() override; // Constants used for testing. static const char kFakeEthernetNetworkGuid[];
diff --git a/chromeos/dbus/shill/shill_manager_client.h b/chromeos/dbus/shill/shill_manager_client.h index ccc8ba7..28c1e6e 100644 --- a/chromeos/dbus/shill/shill_manager_client.h +++ b/chromeos/dbus/shill/shill_manager_client.h
@@ -121,6 +121,9 @@ virtual void SetSimulateConfigurationResult( FakeShillSimulatedResult configuration_result) = 0; + // Clears profile list. + virtual void ClearProfiles() = 0; + protected: virtual ~TestInterface() {} };
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc index 7c03ac1..4aea8c3 100644 --- a/chromeos/network/network_state_handler.cc +++ b/chromeos/network/network_state_handler.cc
@@ -200,6 +200,10 @@ return GetNetworkState(available_managed_network_path); } +bool NetworkStateHandler::IsProfileNetworksLoaded() { + return is_profile_networks_loaded_; +} + bool NetworkStateHandler::OnlyManagedWifiNetworksAllowed() const { return allow_only_policy_networks_to_connect_ || (allow_only_policy_networks_to_connect_if_available_ && @@ -1290,8 +1294,9 @@ } } -void NetworkStateHandler::ProfileListChanged() { +void NetworkStateHandler::ProfileListChanged(const base::Value& profile_list) { NET_LOG(EVENT) << "ProfileListChanged. Re-Requesting Network Properties"; + ProcessIsUserLoggedIn(profile_list); for (ManagedStateList::iterator iter = network_list_.begin(); iter != network_list_.end(); ++iter) { const NetworkState* network = (*iter)->AsNetworkState(); @@ -1568,6 +1573,10 @@ NotifyIfActiveNetworksChanged(); NotifyNetworkListChanged(); UpdateManagedWifiNetworkAvailable(); + // ManagedStateListChanged only gets executed if all pending updates have + // completed. Profile networks are loaded if a user is logged in and all + // pending updates are complete. + is_profile_networks_loaded_ = is_user_logged_in_; return; case ManagedState::MANAGED_TYPE_DEVICE: std::string devices; @@ -2110,4 +2119,14 @@ default_network_is_metered_ = metered; } +void NetworkStateHandler::ProcessIsUserLoggedIn( + const base::Value& profile_list) { + if (!profile_list.is_list()) { + return; + } + // The profile list contains the shared profile on the login screen. Once the + // user is logged in there is more than one profile in the profile list. + is_user_logged_in_ = profile_list.GetList().size() > 1; +} + } // namespace chromeos
diff --git a/chromeos/network/network_state_handler.h b/chromeos/network/network_state_handler.h index ed8a992..4dd56ba4 100644 --- a/chromeos/network/network_state_handler.h +++ b/chromeos/network/network_state_handler.h
@@ -402,6 +402,10 @@ // available. const NetworkState* GetAvailableManagedWifiNetwork() const; + // Returns true if a user is logged in and the networks for the logged in user + // have been loaded. + bool IsProfileNetworksLoaded(); + // Returns true if the AllowOnlyPolicyNetworksToConnect policy is enabled or // if the AllowOnlyPolicyNetworksToConnectIfAvailable policy is enabled and // there is a managed wifi network available. @@ -431,7 +435,7 @@ // The list of profiles changed (i.e. a user has logged in). Re-request // properties for all services since they may have changed. - void ProfileListChanged() override; + void ProfileListChanged(const base::Value& profile_list) override; // Parses the properties for the network service or device. Mostly calls // managed->PropertyChanged(key, value) for each dictionary entry. @@ -634,6 +638,9 @@ // Metered. void SetDefaultNetworkValues(const std::string& path, bool metered); + // Determines whether the user is logged in and sets |is_user_logged_in_|. + void ProcessIsUserLoggedIn(const base::Value& profile_list); + // Shill property handler instance, owned by this class. std::unique_ptr<internal::ShillPropertyHandler> shill_property_handler_; @@ -703,6 +710,12 @@ bool allow_only_policy_networks_to_connect_if_available_ = false; std::vector<std::string> blocked_hex_ssids_; + // After login the user's saved networks get updated asynchronously from + // shill. These variables indicate whether a user is logged in, and if the + // user's saved networks are done updating. + bool is_profile_networks_loaded_ = false; + bool is_user_logged_in_ = false; + SEQUENCE_CHECKER(sequence_checker_); DISALLOW_COPY_AND_ASSIGN(NetworkStateHandler);
diff --git a/chromeos/network/network_state_handler_unittest.cc b/chromeos/network/network_state_handler_unittest.cc index 636a6fd8e..14b472c 100644 --- a/chromeos/network/network_state_handler_unittest.cc +++ b/chromeos/network/network_state_handler_unittest.cc
@@ -2269,4 +2269,40 @@ EXPECT_TRUE(test_observer_->hostname().empty()); } +TEST_F(NetworkStateHandlerTest, IsProfileNetworksLoaded) { + // Ensure that the network list is the expected size. + const size_t kNumShillManagerClientStubImplServices = 4; + EXPECT_EQ(kNumShillManagerClientStubImplServices, + test_observer_->network_count()); + // Add a non-visible network to a private profile. + const std::string profile = "/profile/profile1"; + const std::string wifi_favorite_path = "/service/wifi_faviorite"; + service_test_->AddService(wifi_favorite_path, "wifi_faviorite_guid", + "wifi_faviorite", shill::kTypeWifi, + shill::kStateIdle, false /* add_to_visible */); + + NetworkStateHandler::NetworkStateList networks; + + // Get networks before user is logged in. + network_state_handler_->GetNetworkListByType( + NetworkTypePattern::Default(), false /* configured_only */, + false /* visible_only */, 0 /* no limit */, &networks); + EXPECT_EQ(4u, networks.size()); + EXPECT_FALSE(network_state_handler_->IsProfileNetworksLoaded()); + + // Simulate a user logging in. + profile_test_->AddProfile(profile, "" /* userhash */); + EXPECT_TRUE(profile_test_->AddService(profile, wifi_favorite_path)); + // Wait for login to complete and profile networks to get loaded + UpdateManagerProperties(); + // Get networks after user is logged in. + network_state_handler_->GetNetworkListByType( + NetworkTypePattern::Default(), false /* configured_only */, + false /* visible_only */, 0 /* no limit */, &networks); + base::RunLoop().RunUntilIdle(); + // User is logged in and private network has been loaded. + EXPECT_TRUE(network_state_handler_->IsProfileNetworksLoaded()); + EXPECT_EQ(5u, networks.size()); +} + } // namespace chromeos
diff --git a/chromeos/network/network_state_test_helper.cc b/chromeos/network/network_state_test_helper.cc index 1d488ae5..2e5864b 100644 --- a/chromeos/network/network_state_test_helper.cc +++ b/chromeos/network/network_state_test_helper.cc
@@ -97,6 +97,11 @@ base::RunLoop().RunUntilIdle(); } +void NetworkStateTestHelper::ClearProfiles() { + profile_test_->ClearProfiles(); + manager_test_->ClearProfiles(); +} + void NetworkStateTestHelper::AddDevice(const std::string& device_path, const std::string& type, const std::string& name) {
diff --git a/chromeos/network/network_state_test_helper.h b/chromeos/network/network_state_test_helper.h index a872ea5c..ae957036 100644 --- a/chromeos/network/network_state_test_helper.h +++ b/chromeos/network/network_state_test_helper.h
@@ -46,6 +46,9 @@ // Clears any fake services. void ClearServices(); + // Clears the profile list. + void ClearProfiles(); + // Calls ShillDeviceClient::TestInterface::AddDevice and sets update_received // on the DeviceState. void AddDevice(const std::string& device_path,
diff --git a/chromeos/network/shill_property_handler.cc b/chromeos/network/shill_property_handler.cc index 280d2f53..8a39933 100644 --- a/chromeos/network/shill_property_handler.cc +++ b/chromeos/network/shill_property_handler.cc
@@ -378,7 +378,7 @@ if (value.GetAsString(&prohibited_technologies)) UpdateProhibitedTechnologies(prohibited_technologies); } else if (key == shill::kProfilesProperty) { - listener_->ProfileListChanged(); + listener_->ProfileListChanged(value); } else if (key == shill::kCheckPortalListProperty) { std::string check_portal_list; if (value.GetAsString(&check_portal_list))
diff --git a/chromeos/network/shill_property_handler.h b/chromeos/network/shill_property_handler.h index 1a6fd316..0e9d622 100644 --- a/chromeos/network/shill_property_handler.h +++ b/chromeos/network/shill_property_handler.h
@@ -56,7 +56,7 @@ const base::Value& properties) = 0; // Called when the list of profiles changes. - virtual void ProfileListChanged() = 0; + virtual void ProfileListChanged(const base::Value& profile_list) = 0; // Called when a property for a watched network service has changed. virtual void UpdateNetworkServiceProperty(
diff --git a/chromeos/network/shill_property_handler_unittest.cc b/chromeos/network/shill_property_handler_unittest.cc index 9aaa3f7d..b326311e 100644 --- a/chromeos/network/shill_property_handler_unittest.cc +++ b/chromeos/network/shill_property_handler_unittest.cc
@@ -55,7 +55,12 @@ initial_property_updates(GetTypeString(type))[path] += 1; } - void ProfileListChanged() override {} + void ProfileListChanged(const base::Value& profile_list) override { + if (!profile_list.is_list()) { + return; + } + profile_list_size_ = profile_list.GetList().size(); + } void UpdateNetworkServiceProperty(const std::string& service_path, const std::string& key, @@ -113,6 +118,7 @@ } std::string hostname() { return hostname_; } int errors() { return errors_; } + int profile_list_size() { return profile_list_size_; } private: std::string GetTypeString(ManagedState::ManagedType type) { @@ -159,6 +165,7 @@ int technology_list_updates_; std::string hostname_; int errors_; + int profile_list_size_; }; } // namespace @@ -292,6 +299,17 @@ EXPECT_EQ(0, listener_->errors()); } +TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerProfileListChanged) { + EXPECT_EQ(1, listener_->profile_list_size()); + + const char kMountedUserDirectory[] = "/profile/chronos/shill"; + // Simulate a user logging in. When a user logs in the mounted user directory + // path is added to the list of profile paths. + profile_test_->AddProfile(kMountedUserDirectory, /*user_hash=*/""); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(2, listener_->profile_list_size()); +} + TEST_F(ShillPropertyHandlerTest, ShillPropertyHandlerHostnameChanged) { EXPECT_TRUE(listener_->hostname().empty()); const char kTestHostname[] = "Test Hostname";
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index 76d5229..a07ada52 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-89-4367.0-1609757097-benchmark-89.0.4380.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-89-4367.0-1609757097-benchmark-89.0.4381.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index af6bf85..122eb2b 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-89-4367.0-1609764762-benchmark-89.0.4380.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-89-4367.0-1609764762-benchmark-89.0.4381.0-r1-redacted.afdo.xz
diff --git a/chromeos/services/assistant/BUILD.gn b/chromeos/services/assistant/BUILD.gn index 6b9c2d5..9d0afbaa56 100644 --- a/chromeos/services/assistant/BUILD.gn +++ b/chromeos/services/assistant/BUILD.gn
@@ -82,8 +82,8 @@ "media_session/assistant_media_session.h", "platform/audio_device_owner.cc", "platform/audio_device_owner.h", - "platform/audio_input_host_impl.cc", - "platform/audio_input_host_impl.h", + "platform/audio_input_host.cc", + "platform/audio_input_host.h", "platform/audio_input_impl.cc", "platform/audio_input_impl.h", "platform/audio_input_provider_impl.cc",
diff --git a/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc b/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc index 6f6a5ec..a4a82b9 100644 --- a/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_delegate_impl.cc
@@ -9,7 +9,6 @@ #include <utility> #include "ash/public/cpp/assistant/assistant_state_base.h" -#include "chromeos/services/assistant/platform/audio_input_host_impl.h" #include "chromeos/services/assistant/platform_api_impl.h" #include "chromeos/services/assistant/service_context.h" #include "libassistant/shared/internal_api/assistant_manager_internal.h" @@ -21,26 +20,21 @@ AssistantManagerServiceDelegateImpl::AssistantManagerServiceDelegateImpl( mojo::PendingRemote<device::mojom::BatteryMonitor> battery_monitor, ServiceContext* context) - : battery_monitor_(std::move(battery_monitor)), context_(context) {} + : battery_monitor_(std::move(battery_monitor)), + context_(context) {} AssistantManagerServiceDelegateImpl::~AssistantManagerServiceDelegateImpl() = default; -std::unique_ptr<AudioInputHost> -AssistantManagerServiceDelegateImpl::CreateAudioInputHost() { - return std::make_unique<AudioInputHostImpl>( - context_->cras_audio_handler(), context_->power_manager_client(), - context_->assistant_state()->locale().value()); -} - std::unique_ptr<CrosPlatformApi> AssistantManagerServiceDelegateImpl::CreatePlatformApi( AssistantMediaSession* media_session, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) { return std::make_unique<PlatformApiImpl>( media_session, context_->power_manager_client(), - std::move(battery_monitor_), context_->main_task_runner(), - background_thread_task_runner); + context_->cras_audio_handler(), std::move(battery_monitor_), + context_->main_task_runner(), background_thread_task_runner, + context_->assistant_state()->locale().value()); } std::unique_ptr<assistant_client::AssistantManager>
diff --git a/chromeos/services/assistant/assistant_manager_service_delegate_impl.h b/chromeos/services/assistant/assistant_manager_service_delegate_impl.h index 82836437..1d0eb8586 100644 --- a/chromeos/services/assistant/assistant_manager_service_delegate_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_delegate_impl.h
@@ -25,15 +25,15 @@ ServiceContext* context); ~AssistantManagerServiceDelegateImpl() override; - // AssistantManagerServiceDelegate implementation: - std::unique_ptr<AudioInputHost> CreateAudioInputHost() override; std::unique_ptr<CrosPlatformApi> CreatePlatformApi( AssistantMediaSession* media_session, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner) override; + std::unique_ptr<assistant_client::AssistantManager> CreateAssistantManager( assistant_client::PlatformApi* platform_api, const std::string& lib_assistant_config) override; + assistant_client::AssistantManagerInternal* UnwrapAssistantManagerInternal( assistant_client::AssistantManager* assistant_manager) override;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index d4df871..f231204 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -40,7 +40,6 @@ #include "chromeos/services/assistant/public/cpp/device_actions.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h" -#include "chromeos/services/assistant/public/cpp/migration/audio_input_host.h" #include "chromeos/services/assistant/public/cpp/migration/libassistant_v1_api.h" #include "chromeos/services/assistant/public/shared/utils.h" #include "chromeos/services/assistant/service_context.h" @@ -149,9 +148,6 @@ return kEntryPointProactiveSuggestions; case AssistantEntryPoint::kLauncherChip: return kEntryPointLauncherChip; - case AssistantEntryPoint::kBloom: - return kEntryPointUnspecified; // TODO(jeroendh): Use Bloom specific - // entrypoint } } @@ -199,10 +195,6 @@ // To solve this chicken-and-egg problem, we need a separe Initialize() call. assistant_proxy_->Initialize(libassistant_service_host_.get()); - audio_input_host_ = delegate_->CreateAudioInputHost(); - - platform_api_->InitializeAudioInputHost(*audio_input_host_); - settings_delegate_ = std::make_unique<AssistantDeviceSettingsDelegate>(context); @@ -366,7 +358,7 @@ } void AssistantManagerServiceImpl::EnableHotword(bool enable) { - audio_input_host_->OnHotwordEnabled(enable); + platform_api_->OnHotwordEnabled(enable); } void AssistantManagerServiceImpl::SetArcPlayStoreEnabled(bool enable) { @@ -454,14 +446,14 @@ DCHECK(assistant_manager()); DVLOG(1) << __func__; - audio_input_host_->SetMicState(true); + platform_api_->SetMicState(true); assistant_manager()->StartAssistantInteraction(); } void AssistantManagerServiceImpl::StopActiveInteraction( bool cancel_conversation) { DVLOG(1) << __func__; - audio_input_host_->SetMicState(false); + platform_api_->SetMicState(false); if (!assistant_manager_internal()) { VLOG(1) << "Stopping interaction without assistant manager."; @@ -583,7 +575,7 @@ &AssistantManagerServiceImpl::OnConversationTurnStartedInternal, metadata); - audio_input_host_->OnConversationTurnStarted(); + platform_api_->OnConversationTurnStarted(); // Retrieve the cached interaction metadata associated with this conversation // turn or construct a new instance if there's no match in the cache. @@ -612,10 +604,10 @@ if (resolution != Resolution::NORMAL_WITH_FOLLOW_ON && resolution != Resolution::CANCELLED && resolution != Resolution::BARGE_IN) { - audio_input_host_->SetMicState(false); + platform_api_->SetMicState(false); } - audio_input_host_->OnConversationTurnFinished(); + platform_api_->OnConversationTurnFinished(); switch (resolution) { // Interaction ended normally. @@ -1401,11 +1393,6 @@ return api ? api->assistant_manager_internal() : nullptr; } -void AssistantManagerServiceImpl::SetMicState(bool mic_open) { - DCHECK(audio_input_host_); - audio_input_host_->SetMicState(mic_open); -} - ServiceControllerProxy& AssistantManagerServiceImpl::service_controller() { return assistant_proxy_->service_controller(); }
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index cff59765..26a3d96 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -63,7 +63,6 @@ class AssistantDeviceSettingsDelegate; class AssistantManagerServiceDelegate; class AssistantProxy; -class AudioInputHost; class CrosPlatformApi; class ServiceContext; class ServiceControllerProxy; @@ -221,7 +220,7 @@ assistant_client::AssistantManager* assistant_manager(); assistant_client::AssistantManagerInternal* assistant_manager_internal(); - void SetMicState(bool mic_open); + CrosPlatformApi* platform_api() { return platform_api_.get(); } // assistant_client::MediaManager::Listener overrides: void OnPlaybackStateChange( @@ -314,7 +313,6 @@ std::unique_ptr<AssistantSettingsImpl> assistant_settings_; std::unique_ptr<AssistantProxy> assistant_proxy_; - std::unique_ptr<AudioInputHost> audio_input_host_; base::ObserverList<AssistantInteractionSubscriber> interaction_subscribers_; mojo::Remote<media_session::mojom::MediaController> media_controller_;
diff --git a/chromeos/services/assistant/assistant_settings_impl.cc b/chromeos/services/assistant/assistant_settings_impl.cc index f064b87..e68eb8f1 100644 --- a/chromeos/services/assistant/assistant_settings_impl.cc +++ b/chromeos/services/assistant/assistant_settings_impl.cc
@@ -13,6 +13,7 @@ #include "chromeos/dbus/util/version_loader.h" #include "chromeos/services/assistant/assistant_manager_service_impl.h" #include "chromeos/services/assistant/public/cpp/features.h" +#include "chromeos/services/assistant/public/cpp/migration/cros_platform_api.h" #include "chromeos/services/assistant/public/proto/assistant_device_settings_ui.pb.h" #include "chromeos/services/assistant/public/proto/settings_ui.pb.h" #include "chromeos/services/assistant/service_context.h" @@ -123,7 +124,7 @@ DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); DCHECK(!speaker_id_enrollment_client_); - assistant_manager_service_->SetMicState(true); + assistant_manager_service_->platform_api()->SetMicState(true); if (!assistant_manager_service_->assistant_manager_internal()) return; @@ -152,7 +153,7 @@ DCHECK(HasStarted(assistant_manager_service_)); DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); - assistant_manager_service_->SetMicState(false); + assistant_manager_service_->platform_api()->SetMicState(false); if (!assistant_manager_service_->assistant_manager_internal()) return;
diff --git a/chromeos/services/assistant/platform/audio_devices.cc b/chromeos/services/assistant/platform/audio_devices.cc index 0fa34fd..485df778 100644 --- a/chromeos/services/assistant/platform/audio_devices.cc +++ b/chromeos/services/assistant/platform/audio_devices.cc
@@ -123,23 +123,27 @@ } // namespace // Observer that will report all changes to the audio devices. -// It will automatically be triggered when it's created, -// and will unsubscribe from |CrasAudioHandler| in its destructor. +// It will unsubscribe from |CrasAudioHandler| in its destructor. class AudioDevices::ScopedCrasAudioHandlerObserver : private CrasAudioHandler::AudioObserver { public: ScopedCrasAudioHandlerObserver(CrasAudioHandler* cras_audio_handler, AudioDevices* parent) - : parent_(parent), cras_audio_handler_(cras_audio_handler) { - scoped_observer_.Observe(cras_audio_handler); - FetchAudioNodes(); - } + : parent_(parent), cras_audio_handler_(cras_audio_handler) {} ScopedCrasAudioHandlerObserver(const ScopedCrasAudioHandlerObserver&) = delete; ScopedCrasAudioHandlerObserver& operator=( const ScopedCrasAudioHandlerObserver&) = delete; ~ScopedCrasAudioHandlerObserver() override = default; + // Start the observer, which means it will + // - Subscribe for changes + // - Fetch the current state. + void StartObserving() { + scoped_observer_.Observe(cras_audio_handler_); + FetchAudioNodes(); + } + private: // CrasAudioHandler::AudioObserver implementation: void OnAudioNodesChanged() override { FetchAudioNodes(); } @@ -185,6 +189,9 @@ std::string hotword_model = ToHotwordModel(locale_).value_or(kDefaultLocale); + VLOG(2) << "Changing audio hotword model of device " << hotword_device_ + << " to '" << hotword_model << "'"; + cras_audio_handler_->SetHotwordModel( hotword_device_, hotword_model, base::BindOnce(&HotwordModelUpdater::SetDspHotwordLocaleCallback, @@ -219,11 +226,16 @@ AudioDevices::AudioDevices(CrasAudioHandler* cras_audio_handler, const std::string& locale) - : scoped_cras_audio_handler_observer_( + : cras_audio_handler_(cras_audio_handler), + locale_(locale), + scoped_cras_audio_handler_observer_( std::make_unique<ScopedCrasAudioHandlerObserver>(cras_audio_handler, - this)), - cras_audio_handler_(cras_audio_handler), - locale_(locale) {} + this)) { + // Note we can only start the observer here, at the end of the constructor, + // to ensure this class is properly initialized when we receive the current + // list of audio devices. + scoped_cras_audio_handler_observer_->StartObserving(); +} AudioDevices::~AudioDevices() = default;
diff --git a/chromeos/services/assistant/platform/audio_devices.h b/chromeos/services/assistant/platform/audio_devices.h index f0d70d5..3f00cf0 100644 --- a/chromeos/services/assistant/platform/audio_devices.h +++ b/chromeos/services/assistant/platform/audio_devices.h
@@ -68,11 +68,6 @@ void UpdateDeviceId(const chromeos::AudioDeviceList& devices); void UpdateHotwordModel(); - // Observes changes to the available audio devices, and sends the list of - // devices to SetAudioDevices(). - std::unique_ptr<ScopedCrasAudioHandlerObserver> - scoped_cras_audio_handler_observer_; - // Handles the asynchronous nature of sending a new hotword model to // |cras_audio_handler_|. std::unique_ptr<HotwordModelUpdater> hotword_model_updater_; @@ -85,6 +80,11 @@ std::string locale_; base::Optional<uint64_t> hotword_device_id_; base::Optional<uint64_t> device_id_; + + // Observes changes to the available audio devices, and sends the list of + // devices to SetAudioDevices(). + std::unique_ptr<ScopedCrasAudioHandlerObserver> + scoped_cras_audio_handler_observer_; }; } // namespace assistant
diff --git a/chromeos/services/assistant/platform/audio_input_host_impl.cc b/chromeos/services/assistant/platform/audio_input_host.cc similarity index 68% rename from chromeos/services/assistant/platform/audio_input_host_impl.cc rename to chromeos/services/assistant/platform/audio_input_host.cc index 4f6dcd6e..6ace7006 100644 --- a/chromeos/services/assistant/platform/audio_input_host_impl.cc +++ b/chromeos/services/assistant/platform/audio_input_host.cc
@@ -1,8 +1,8 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// Copyright 2020 The Chromium 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/services/assistant/platform/audio_input_host_impl.h" +#include "chromeos/services/assistant/platform/audio_input_host.h" #include "base/check.h" #include "base/optional.h" @@ -30,38 +30,35 @@ } // namespace -chromeos::assistant::AudioInputHostImpl::AudioInputHostImpl( +chromeos::assistant::AudioInputHost::AudioInputHost( + AudioInputImpl* audio_input, CrasAudioHandler* cras_audio_handler, chromeos::PowerManagerClient* power_manager_client, const std::string& locale) - : power_manager_client_(power_manager_client), + : audio_input_(audio_input), + power_manager_client_(power_manager_client), power_manager_client_observer_(this), audio_devices_(cras_audio_handler, locale) { + DCHECK(audio_input_); DCHECK(power_manager_client_); -} -AudioInputHostImpl::~AudioInputHostImpl() = default; - -void AudioInputHostImpl::Initialize(AudioInputImpl* audio_input) { - DCHECK(audio_input); - audio_input_ = audio_input; audio_devices_observation_.Observe(&audio_devices_); - power_manager_client_observer_.Observe(power_manager_client_); - power_manager_client_->GetSwitchStates( - base::BindOnce(&AudioInputHostImpl::OnInitialLidStateReceived, - weak_factory_.GetWeakPtr())); + power_manager_client_observer_.Observe(power_manager_client); + power_manager_client->GetSwitchStates(base::BindOnce( + &AudioInputHost::OnInitialLidStateReceived, weak_factory_.GetWeakPtr())); } -void AudioInputHostImpl::SetMicState(bool mic_open) { +AudioInputHost::~AudioInputHost() = default; + +void AudioInputHost::SetMicState(bool mic_open) { audio_input_->SetMicState(mic_open); } -void AudioInputHostImpl::SetDeviceId( - const base::Optional<std::string>& device_id) { +void AudioInputHost::SetDeviceId(const base::Optional<std::string>& device_id) { audio_input_->SetDeviceId(device_id.value_or("")); } -void AudioInputHostImpl::OnConversationTurnStarted() { +void AudioInputHost::OnConversationTurnStarted() { audio_input_->OnConversationTurnStarted(); // Inform power manager of a wake notification when Libassistant // recognized hotword and started a conversation. We intentionally @@ -70,20 +67,20 @@ power_manager_client_->NotifyWakeNotification(); } -void AudioInputHostImpl::OnConversationTurnFinished() { +void AudioInputHost::OnConversationTurnFinished() { audio_input_->OnConversationTurnFinished(); } -void AudioInputHostImpl::OnHotwordEnabled(bool enable) { +void AudioInputHost::OnHotwordEnabled(bool enable) { audio_input_->OnHotwordEnabled(enable); } -void AudioInputHostImpl::SetHotwordDeviceId( +void AudioInputHost::SetHotwordDeviceId( const base::Optional<std::string>& device_id) { audio_input_->SetHotwordDeviceId(device_id.value_or("")); } -void AudioInputHostImpl::LidEventReceived( +void AudioInputHost::LidEventReceived( chromeos::PowerManagerClient::LidState state, base::TimeTicks timestamp) { // Lid switch event still gets fired during system suspend, which enables @@ -92,7 +89,7 @@ audio_input_->OnLidStateChanged(ConvertLidState(state)); } -void AudioInputHostImpl::OnInitialLidStateReceived( +void AudioInputHost::OnInitialLidStateReceived( base::Optional<chromeos::PowerManagerClient::SwitchStates> switch_states) { if (switch_states.has_value()) audio_input_->OnLidStateChanged(ConvertLidState(switch_states->lid_state));
diff --git a/chromeos/services/assistant/platform/audio_input_host.h b/chromeos/services/assistant/platform/audio_input_host.h new file mode 100644 index 0000000..528af7a9 --- /dev/null +++ b/chromeos/services/assistant/platform/audio_input_host.h
@@ -0,0 +1,80 @@ +// Copyright 2020 The Chromium 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 CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_INPUT_HOST_H_ +#define CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_INPUT_HOST_H_ + +#include <string> + +#include "base/component_export.h" +#include "base/memory/weak_ptr.h" +#include "base/scoped_observation.h" +#include "chromeos/dbus/power/power_manager_client.h" +#include "chromeos/services/assistant/platform/audio_devices.h" + +namespace chromeos { +namespace assistant { + +class AudioInputImpl; + +// Class that provides the bridge between the ChromeOS UI thread and the +// Libassistant audio input class. +// The goal is that |AudioInputImpl| no longer depends on any external events. +// This will allow us to move it to the Libassistant mojom service (at which +// point this class will talk to the Libassistant mojom service). +class COMPONENT_EXPORT(ASSISTANT_SERVICE) AudioInputHost + : private chromeos::PowerManagerClient::Observer, + private AudioDevices::Observer + +{ + public: + AudioInputHost(AudioInputImpl* audio_input, + CrasAudioHandler* cras_audio_handler, + chromeos::PowerManagerClient* power_manager_client, + const std::string& locale); + AudioInputHost(AudioInputHost&) = delete; + AudioInputHost& operator=(AudioInputHost&) = delete; + ~AudioInputHost() override; + + // Called when the mic state associated with the interaction is changed. + void SetMicState(bool mic_open); + + // Called when hotword enabled status changed. + void OnHotwordEnabled(bool enable); + + void OnConversationTurnStarted(); + void OnConversationTurnFinished(); + + // AudioDevices::Observer implementation: + void SetDeviceId(const base::Optional<std::string>& device_id) override; + void SetHotwordDeviceId( + const base::Optional<std::string>& device_id) override; + + private: + // chromeos::PowerManagerClient::Observer overrides: + void LidEventReceived(chromeos::PowerManagerClient::LidState state, + base::TimeTicks timestamp) override; + + void OnInitialLidStateReceived( + base::Optional<chromeos::PowerManagerClient::SwitchStates> switch_states); + + // Owned by |PlatformApiImpl| which also owns |this|. + AudioInputImpl* const audio_input_; + chromeos::PowerManagerClient* const power_manager_client_; + base::ScopedObservation<chromeos::PowerManagerClient, + chromeos::PowerManagerClient::Observer> + power_manager_client_observer_; + + // Observes available audio devices and will set device-id/hotword-device-id + // accordingly. + AudioDevices audio_devices_; + AudioDevices::ScopedObservation audio_devices_observation_{this}; + + base::WeakPtrFactory<AudioInputHost> weak_factory_{this}; +}; + +} // namespace assistant +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_INPUT_HOST_H_
diff --git a/chromeos/services/assistant/platform/audio_input_host_impl.h b/chromeos/services/assistant/platform/audio_input_host_impl.h deleted file mode 100644 index fc3583a..0000000 --- a/chromeos/services/assistant/platform/audio_input_host_impl.h +++ /dev/null
@@ -1,73 +0,0 @@ -// Copyright 2021 The Chromium 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 CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_INPUT_HOST_IMPL_H_ -#define CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_INPUT_HOST_IMPL_H_ - -#include "chromeos/services/assistant/public/cpp/migration/audio_input_host.h" - -#include <string> - -#include "base/component_export.h" -#include "base/memory/weak_ptr.h" -#include "base/optional.h" -#include "base/scoped_observation.h" -#include "base/time/time.h" -#include "chromeos/dbus/power/power_manager_client.h" -#include "chromeos/services/assistant/platform/audio_devices.h" - -namespace chromeos { -namespace assistant { - -class COMPONENT_EXPORT(ASSISTANT_SERVICE) AudioInputHostImpl - : public AudioInputHost, - private chromeos::PowerManagerClient::Observer, - private AudioDevices::Observer { - public: - AudioInputHostImpl(CrasAudioHandler* cras_audio_handler, - chromeos::PowerManagerClient* power_manager_client, - const std::string& locale); - AudioInputHostImpl(const AudioInputHostImpl&) = delete; - AudioInputHostImpl& operator=(const AudioInputHostImpl&) = delete; - ~AudioInputHostImpl() override; - - // AudioInputHost implementation: - void Initialize(AudioInputImpl* audio_input) override; - void SetMicState(bool mic_open) override; - void OnHotwordEnabled(bool enable) override; - void OnConversationTurnStarted() override; - void OnConversationTurnFinished() override; - - // AudioDevices::Observer implementation: - void SetDeviceId(const base::Optional<std::string>& device_id) override; - void SetHotwordDeviceId( - const base::Optional<std::string>& device_id) override; - - private: - // chromeos::PowerManagerClient::Observer overrides: - void LidEventReceived(chromeos::PowerManagerClient::LidState state, - base::TimeTicks timestamp) override; - - void OnInitialLidStateReceived( - base::Optional<chromeos::PowerManagerClient::SwitchStates> switch_states); - - // Owned by |PlatformApiImpl| which also owns |this|. - AudioInputImpl* audio_input_ = nullptr; - chromeos::PowerManagerClient* const power_manager_client_; - base::ScopedObservation<chromeos::PowerManagerClient, - chromeos::PowerManagerClient::Observer> - power_manager_client_observer_; - - // Observes available audio devices and will set device-id/hotword-device-id - // accordingly. - AudioDevices audio_devices_; - AudioDevices::ScopedObservation audio_devices_observation_{this}; - - base::WeakPtrFactory<AudioInputHostImpl> weak_factory_{this}; -}; - -} // namespace assistant -} // namespace chromeos - -#endif // CHROMEOS_SERVICES_ASSISTANT_PLATFORM_AUDIO_INPUT_HOST_IMPL_H_
diff --git a/chromeos/services/assistant/platform/audio_input_impl_unittest.cc b/chromeos/services/assistant/platform/audio_input_impl_unittest.cc index 28b6d5f..21811c7 100644 --- a/chromeos/services/assistant/platform/audio_input_impl_unittest.cc +++ b/chromeos/services/assistant/platform/audio_input_impl_unittest.cc
@@ -12,7 +12,7 @@ #include "base/test/task_environment.h" #include "chromeos/audio/cras_audio_handler.h" #include "chromeos/dbus/power/fake_power_manager_client.h" -#include "chromeos/services/assistant/platform/audio_input_host_impl.h" +#include "chromeos/services/assistant/platform/audio_input_host.h" #include "chromeos/services/assistant/platform/audio_stream_factory_delegate.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "chromeos/services/assistant/test_support/scoped_assistant_client.h" @@ -101,10 +101,9 @@ audio_input_impl_ = std::make_unique<AudioInputImpl>( &audio_stream_factory_delegate_, "fake-device-id"); - audio_input_host_ = std::make_unique<AudioInputHostImpl>( - cras_audio_handler_.Get(), FakePowerManagerClient::Get(), - "initial-locale"); - audio_input_host_->Initialize(audio_input_impl_.get()); + audio_input_host_ = std::make_unique<AudioInputHost>( + audio_input_impl_.get(), cras_audio_handler_.Get(), + FakePowerManagerClient::Get(), "initial-locale"); audio_input_host_->SetDeviceId("initial-device-id"); audio_input_impl_->AddObserver(this); @@ -153,7 +152,7 @@ DefaultAudioStreamFactoryDelegate audio_stream_factory_delegate_; ScopedCrasAudioHandler cras_audio_handler_; std::unique_ptr<AudioInputImpl> audio_input_impl_; - std::unique_ptr<AudioInputHostImpl> audio_input_host_; + std::unique_ptr<AudioInputHost> audio_input_host_; DISALLOW_COPY_AND_ASSIGN(AudioInputImplTest); };
diff --git a/chromeos/services/assistant/platform_api_impl.cc b/chromeos/services/assistant/platform_api_impl.cc index dc59df3..84d44577 100644 --- a/chromeos/services/assistant/platform_api_impl.cc +++ b/chromeos/services/assistant/platform_api_impl.cc
@@ -12,7 +12,6 @@ #include "chromeos/services/assistant/platform/audio_devices.h" #include "chromeos/services/assistant/platform/power_manager_provider_impl.h" #include "chromeos/services/assistant/public/cpp/features.h" -#include "chromeos/services/assistant/public/cpp/migration/audio_input_host.h" #include "chromeos/services/assistant/utils.h" #include "libassistant/shared/public/assistant_export.h" #include "libassistant/shared/public/platform_api.h" @@ -79,13 +78,19 @@ PlatformApiImpl::PlatformApiImpl( AssistantMediaSession* media_session, PowerManagerClient* power_manager_client, + CrasAudioHandler* cras_audio_handler, mojo::PendingRemote<device::mojom::BatteryMonitor> battery_monitor, scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> background_task_runner) + scoped_refptr<base::SingleThreadTaskRunner> background_task_runner, + const std::string& pref_locale) : audio_input_provider_(), audio_output_provider_(media_session, background_task_runner, - media::AudioDeviceDescription::kDefaultDeviceId) { + media::AudioDeviceDescription::kDefaultDeviceId), + audio_input_host_(&audio_input_provider_.GetAudioInput(), + cras_audio_handler, + power_manager_client, + pref_locale) { // Only enable native power features if they are supported by the UI. std::unique_ptr<PowerManagerProviderImpl> provider; if (features::IsPowerManagerEnabled()) { @@ -122,8 +127,20 @@ return *system_provider_; } -void PlatformApiImpl::InitializeAudioInputHost(AudioInputHost& host) { - host.Initialize(&audio_input_provider_.GetAudioInput()); +void PlatformApiImpl::SetMicState(bool mic_open) { + audio_input_host_.SetMicState(mic_open); +} + +void PlatformApiImpl::OnConversationTurnStarted() { + audio_input_host_.OnConversationTurnStarted(); +} + +void PlatformApiImpl::OnConversationTurnFinished() { + audio_input_host_.OnConversationTurnFinished(); +} + +void PlatformApiImpl::OnHotwordEnabled(bool enable) { + audio_input_host_.OnHotwordEnabled(enable); } } // namespace assistant
diff --git a/chromeos/services/assistant/platform_api_impl.h b/chromeos/services/assistant/platform_api_impl.h index 782ddc8..2ba1b1f 100644 --- a/chromeos/services/assistant/platform_api_impl.h +++ b/chromeos/services/assistant/platform_api_impl.h
@@ -10,6 +10,7 @@ #include <utility> #include <vector> +#include "chromeos/services/assistant/platform/audio_input_host.h" #include "chromeos/services/assistant/platform/audio_input_provider_impl.h" #include "chromeos/services/assistant/platform/audio_output_provider_impl.h" #include "chromeos/services/assistant/platform/file_provider_impl.h" @@ -22,6 +23,7 @@ #include "services/device/public/mojom/battery_monitor.mojom.h" namespace chromeos { +class CrasAudioHandler; class PowerManagerClient; namespace assistant { @@ -34,9 +36,11 @@ PlatformApiImpl( AssistantMediaSession* media_session, PowerManagerClient* power_manager_client, + CrasAudioHandler* cras_audio_handler, mojo::PendingRemote<device::mojom::BatteryMonitor> battery_monitor, scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> background_task_runner); + scoped_refptr<base::SingleThreadTaskRunner> background_task_runner, + const std::string& pref_locale); ~PlatformApiImpl() override; // assistant_client::PlatformApi overrides @@ -47,7 +51,14 @@ assistant_client::NetworkProvider& GetNetworkProvider() override; assistant_client::SystemProvider& GetSystemProvider() override; - void InitializeAudioInputHost(AudioInputHost& host) override; + // Called when the mic state associated with the interaction is changed. + void SetMicState(bool mic_open) override; + + void OnConversationTurnStarted() override; + void OnConversationTurnFinished() override; + + // Called when hotword enabled status changed. + void OnHotwordEnabled(bool enable) override; private: // ChromeOS does not use auth manager, so we don't yet need to implement a @@ -87,6 +98,7 @@ FakeAuthProvider auth_provider_; FileProviderImpl file_provider_; NetworkProviderImpl network_provider_; + AudioInputHost audio_input_host_; std::unique_ptr<SystemProviderImpl> system_provider_; DISALLOW_COPY_AND_ASSIGN(PlatformApiImpl);
diff --git a/chromeos/services/assistant/public/cpp/assistant_enums.h b/chromeos/services/assistant/public/cpp/assistant_enums.h index 01a3621..d33ba67 100644 --- a/chromeos/services/assistant/public/cpp/assistant_enums.h +++ b/chromeos/services/assistant/public/cpp/assistant_enums.h
@@ -62,8 +62,9 @@ kQuickAnswers = 11, kLauncherChip = 12, kBetterOnboarding = 13, - kBloom = 14, - kMaxValue = kBloom, + // Deprecated, please do not use. + // kBloom = 14, + kMaxValue = kBetterOnboarding, }; // Enumeration of possible Assistant interaction types. @@ -127,8 +128,9 @@ kLauncherSearchBoxIcon = 9, kProactiveSuggestions = 10, kLauncherChip = 11, - kBloom = 12, - kMaxValue = kBloom, + // Deprecated, please do not reuse + // kBloom = 12, + kMaxValue = kLauncherChip, }; // Enumeration of Assistant exit points. These values are persisted to logs.
diff --git a/chromeos/services/assistant/public/cpp/migration/BUILD.gn b/chromeos/services/assistant/public/cpp/migration/BUILD.gn index 910c427..d901cdc 100644 --- a/chromeos/services/assistant/public/cpp/migration/BUILD.gn +++ b/chromeos/services/assistant/public/cpp/migration/BUILD.gn
@@ -11,7 +11,6 @@ sources = [ "assistant_manager_service_delegate.h", - "audio_input_host.h", "cros_platform_api.h", "libassistant_v1_api.cc", "libassistant_v1_api.h",
diff --git a/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h b/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h index f92b2f2..446616a5 100644 --- a/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h +++ b/chromeos/services/assistant/public/cpp/migration/assistant_manager_service_delegate.h
@@ -20,7 +20,6 @@ namespace assistant { class AssistantMediaSession; -class AudioInputHost; class CrosPlatformApi; // Interface class that provides factory methods for assistant internal @@ -30,8 +29,6 @@ AssistantManagerServiceDelegate() = default; virtual ~AssistantManagerServiceDelegate() = default; - virtual std::unique_ptr<AudioInputHost> CreateAudioInputHost() = 0; - virtual std::unique_ptr<CrosPlatformApi> CreatePlatformApi( AssistantMediaSession* media_session, scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/chromeos/services/assistant/public/cpp/migration/audio_input_host.h b/chromeos/services/assistant/public/cpp/migration/audio_input_host.h deleted file mode 100644 index 2314831..0000000 --- a/chromeos/services/assistant/public/cpp/migration/audio_input_host.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2021 The Chromium 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 CHROMEOS_SERVICES_ASSISTANT_PUBLIC_CPP_MIGRATION_AUDIO_INPUT_HOST_H_ -#define CHROMEOS_SERVICES_ASSISTANT_PUBLIC_CPP_MIGRATION_AUDIO_INPUT_HOST_H_ - -#include <string> - -#include "base/component_export.h" - -namespace chromeos { -namespace assistant { - -class AudioInputImpl; - -// Class that provides the bridge between the ChromeOS UI thread and the -// Libassistant audio input class. -class COMPONENT_EXPORT(ASSISTANT_SERVICE) AudioInputHost { - public: - virtual ~AudioInputHost() = default; - - // Initialize this class by setting the backend that it's supposed to use. - // TODO(b/171748795): Should be gone when the Libassistant V2 migration is - // completed. - virtual void Initialize(AudioInputImpl* audio_input) = 0; - - // Called when the mic state associated with the interaction is changed. - virtual void SetMicState(bool mic_open) = 0; - - // Called when hotword enabled status changed. - virtual void OnHotwordEnabled(bool enable) = 0; - - virtual void OnConversationTurnStarted() = 0; - virtual void OnConversationTurnFinished() = 0; -}; - -} // namespace assistant -} // namespace chromeos - -#endif // CHROMEOS_SERVICES_ASSISTANT_PUBLIC_CPP_MIGRATION_AUDIO_INPUT_HOST_H_
diff --git a/chromeos/services/assistant/public/cpp/migration/cros_platform_api.h b/chromeos/services/assistant/public/cpp/migration/cros_platform_api.h index 41f4ee12..409e7a10 100644 --- a/chromeos/services/assistant/public/cpp/migration/cros_platform_api.h +++ b/chromeos/services/assistant/public/cpp/migration/cros_platform_api.h
@@ -19,8 +19,6 @@ namespace chromeos { namespace assistant { -class AudioInputHost; - // Platform API required by the voice assistant, extended with some methods used // when ChromeOS needs to make changes to the platform state. // Note that this no longer inherits from |assistant_client::PlatformApi|, @@ -31,10 +29,14 @@ CrosPlatformApi() = default; virtual ~CrosPlatformApi() = default; - // Initialize the AudioInputHost. - // TODO(b/171748795): Should be gone when the Libassistant V2 migration is - // completed. - virtual void InitializeAudioInputHost(AudioInputHost&) = 0; + // Called when the mic state associated with the interaction is changed. + virtual void SetMicState(bool mic_open) = 0; + + virtual void OnConversationTurnStarted() = 0; + virtual void OnConversationTurnFinished() = 0; + + // Called when hotword enabled status changed. + virtual void OnHotwordEnabled(bool enable) = 0; // Returns the platform's audio input provider. virtual assistant_client::AudioInputProvider& GetAudioInputProvider() = 0;
diff --git a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc index 73c9b52..4e0a16e 100644 --- a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc +++ b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.cc
@@ -9,30 +9,10 @@ #include "chromeos/assistant/internal/test_support/fake_assistant_manager.h" #include "chromeos/assistant/internal/test_support/fake_assistant_manager_internal.h" #include "chromeos/services/assistant//public/cpp/migration/fake_platform_api.h" -#include "chromeos/services/assistant/public/cpp/migration/audio_input_host.h" namespace chromeos { namespace assistant { -namespace { - -class FakeAudioInputHost : public AudioInputHost { - public: - FakeAudioInputHost() = default; - FakeAudioInputHost(const FakeAudioInputHost&) = delete; - FakeAudioInputHost& operator=(const FakeAudioInputHost&) = delete; - ~FakeAudioInputHost() override = default; - - // AudioInputHost implementation: - void Initialize(AudioInputImpl* audio_input) override {} - void SetMicState(bool mic_open) override {} - void OnHotwordEnabled(bool enable) override {} - void OnConversationTurnStarted() override {} - void OnConversationTurnFinished() override {} -}; - -} // namespace - FakeAssistantManagerServiceDelegate::FakeAssistantManagerServiceDelegate() { // We start by creating a pending assistant manager, as our unittests // might need to access the assistant manager before it is created through @@ -43,11 +23,6 @@ FakeAssistantManagerServiceDelegate::~FakeAssistantManagerServiceDelegate() = default; -std::unique_ptr<AudioInputHost> -FakeAssistantManagerServiceDelegate::CreateAudioInputHost() { - return std::make_unique<FakeAudioInputHost>(); -} - std::unique_ptr<CrosPlatformApi> FakeAssistantManagerServiceDelegate::CreatePlatformApi( AssistantMediaSession* media_session,
diff --git a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h index 1adddb28..1ba87f1e 100644 --- a/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h +++ b/chromeos/services/assistant/public/cpp/migration/fake_assistant_manager_service_delegate.h
@@ -26,7 +26,6 @@ FakeAssistantManager* assistant_manager(); // AssistantManagerServiceDelegate: - std::unique_ptr<AudioInputHost> CreateAudioInputHost() override; std::unique_ptr<CrosPlatformApi> CreatePlatformApi( AssistantMediaSession* media_session, scoped_refptr<base::SingleThreadTaskRunner> background_thread_task_runner)
diff --git a/chromeos/services/assistant/public/cpp/migration/fake_platform_api.h b/chromeos/services/assistant/public/cpp/migration/fake_platform_api.h index b730a4c..49fde32a 100644 --- a/chromeos/services/assistant/public/cpp/migration/fake_platform_api.h +++ b/chromeos/services/assistant/public/cpp/migration/fake_platform_api.h
@@ -28,7 +28,10 @@ assistant_client::FileProvider& GetFileProvider() override; assistant_client::NetworkProvider& GetNetworkProvider() override; assistant_client::SystemProvider& GetSystemProvider() override; - void InitializeAudioInputHost(AudioInputHost&) override {} + void SetMicState(bool mic_open) override {} + void OnHotwordEnabled(bool enable) override {} + void OnConversationTurnStarted() override {} + void OnConversationTurnFinished() override {} private: DISALLOW_COPY_AND_ASSIGN(FakePlatformApi);
diff --git a/chromeos/services/assistant/public/shared/constants.cc b/chromeos/services/assistant/public/shared/constants.cc index e0ae021..f8507af 100644 --- a/chromeos/services/assistant/public/shared/constants.cc +++ b/chromeos/services/assistant/public/shared/constants.cc
@@ -14,12 +14,5 @@ const char kSampleServiceIdRequest[] = ""; const char kServiceIdRequestPayload[] = ""; -const char kBloomScope[] = "https://fake/bloom/scope"; -const char kBloomServiceUrl[] = "https://fake.bloom.service.url"; -const char kBloomCreateImagePath[] = "/fake/create/image/path"; -const char kBloomOcrImagePath[] = "/fake/ocr/image/path&image_id="; -const char kBloomSearchProblemPath[] = - "/fake/search/problem/path&metadata_blob="; - } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/public/shared/constants.h b/chromeos/services/assistant/public/shared/constants.h index dd6fa126..f5a1072 100644 --- a/chromeos/services/assistant/public/shared/constants.h +++ b/chromeos/services/assistant/public/shared/constants.h
@@ -26,24 +26,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) extern const char kServiceIdRequestPayload[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomScope[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomServiceUrl[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomCreateImagePath[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomOcrImagePath[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomSearchProblemPath[]; - -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomCreateImagePath[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomOcrImagePath[]; -COMPONENT_EXPORT(ASSISTANT_SERVICE_SHARED) -extern const char kBloomSearchProblemPath[]; - } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom index 0f87f37a..bc7eaed 100644 --- a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom +++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
@@ -116,6 +116,25 @@ // Unused memory available to the process, in KiB. This will always be // |total_memory_kib| - |resident_memory_kib|. uint32 free_memory_kib; + // The sum of bytes passed to system read calls. This includes terminal + // I/O and is independent of whether the physical disk is accessed. + uint64 bytes_read; + // The sum of bytes passed to system write calls. This includes terminal + // I/O and is independent of whether the physical disk is accessed. + uint64 bytes_written; + // Attempted count of read syscalls. + uint64 read_system_calls; + // Attempted count of write syscalls. + uint64 write_system_calls; + // Attempt to count the number of bytes which this process really did cause + // to be fetched from the storage layer. + uint64 physical_bytes_read; + // Attempt to count the number of bytes which this process caused to be sent + // to the storage layer. + uint64 physical_bytes_written; + // Number of bytes which this process caused to not happen, by truncating + // pagecache. + uint64 cancelled_bytes_written; }; // Battery probe result. Can either be populated with the BatteryInfo or an
diff --git a/chromeos/services/nearby/public/mojom/nearby_connections_types.mojom b/chromeos/services/nearby/public/mojom/nearby_connections_types.mojom index c41326ed..575e544 100644 --- a/chromeos/services/nearby/public/mojom/nearby_connections_types.mojom +++ b/chromeos/services/nearby/public/mojom/nearby_connections_types.mojom
@@ -7,51 +7,53 @@ import "device/bluetooth/public/mojom/uuid.mojom"; import "mojo/public/mojom/base/file.mojom"; -// Generic result status of NearbyConnections API calls. +// Generic result status of NearbyConnections API calls. These values are +// persisted to logs. Entries should not be renumbered and numeric values should +// never be reused. enum Status { // The operation was successful. - kSuccess, + kSuccess = 0, // The operation failed, without any more information. - kError, + kError = 1, // The app called an API method out of order (i.e. another method is expected // to be called first). - kOutOfOrderApiCall, + kOutOfOrderApiCall = 2, // The app already has active operations (advertising, discovering, or // connected to other devices) with another Strategy. Stop these operations on // the current Strategy before trying to advertise or discover with a new // Strategy. - kAlreadyHaveActiveStrategy, + kAlreadyHaveActiveStrategy = 3, // The app is already advertising; call StopAdvertising() before trying to // advertise again. - kAlreadyAdvertising, + kAlreadyAdvertising = 4, // The app is already discovering; call StopDiscovery() before trying to // discover again. - kAlreadyDiscovering, + kAlreadyDiscovering = 5, // An attempt to read from/write to a connected remote endpoint failed. If // this occurs repeatedly, consider invoking DisconnectFromEndpoint(). - kEndpointIOError, + kEndpointIOError = 6, // An attempt to interact with a remote endpoint failed because it's unknown // to us -- it's either an endpoint that was never discovered, or an endpoint // that never connected to us (both of which are indicative of bad input from // the client app). - kEndpointUnknown, + kEndpointUnknown = 7, // The remote endpoint rejected the connection request. - kConnectionRejected, + kConnectionRejected = 8, // The app is already connected to the specified endpoint. Multiple // connections to a remote endpoint cannot be maintained simultaneously. - kAlreadyConnectedToEndpoint, + kAlreadyConnectedToEndpoint = 9, // The remote endpoint is not connected; messages cannot be sent to it. - kNotConnectedToEndpoint, + kNotConnectedToEndpoint = 10, // There was an error trying to use the device's Bluetooth capabilities. - kBluetoothError, + kBluetoothError = 11, // There was an error trying to use the device's Bluetooth Low Energy // capabilities. - kBleError, + kBleError = 12, // There was an error trying to use the device's WiFi capabilities. - kWifiLanError, + kWifiLanError = 13, // An attempt to interact with an in-flight Payload failed because it's // unknown to us. - kPayloadUnknown, + kPayloadUnknown = 14, }; // Information about a connection that is being initiated.
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index dc4704a..214ba258 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -274,21 +274,24 @@ return base::EmptyString(); } -mojom::DeviceStatePropertiesPtr GetVpnState() { - auto result = mojom::DeviceStateProperties::New(); - result->type = mojom::NetworkType::kVPN; - - bool vpn_disabled = false; +bool IsVpnProhibited() { + bool vpn_prohibited = false; if (NetworkHandler::IsInitialized()) { std::vector<std::string> prohibited_technologies = NetworkHandler::Get() ->prohibited_technologies_handler() ->GetCurrentlyProhibitedTechnologies(); - vpn_disabled = base::Contains(prohibited_technologies, shill::kTypeVPN); + vpn_prohibited = base::Contains(prohibited_technologies, shill::kTypeVPN); } + return vpn_prohibited; +} - result->device_state = vpn_disabled ? mojom::DeviceStateType::kProhibited - : mojom::DeviceStateType::kEnabled; +mojom::DeviceStatePropertiesPtr GetVpnState() { + auto result = mojom::DeviceStateProperties::New(); + result->type = mojom::NetworkType::kVPN; + + result->device_state = IsVpnProhibited() ? mojom::DeviceStateType::kProhibited + : mojom::DeviceStateType::kEnabled; return result; } @@ -1861,7 +1864,15 @@ // Handle VPN state separately because VPN is not considered a device by shill // and thus will not be included in the |devices| list returned by network // state handler. In the UI code, it is treated as a "device" for consistency. - result.emplace_back(GetVpnState()); + // In the UI code, knowing whether a device is prohibited or not is done by + // checking |device_state| field of the DeviceStateProperties of the + // corresponding device. A VPN device state is returned if built-in VPN + // services are prohibited by policy even if no VPN services exist in order to + // indicate that adding a VPN is prohibited in the UI. + if (network_state_handler_->FirstNetworkByType(NetworkTypePattern::VPN()) || + IsVpnProhibited()) { + result.emplace_back(GetVpnState()); + } std::move(callback).Run(std::move(result)); }
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc index 342fbc1..8d95848 100644 --- a/chromeos/services/network_config/cros_network_config_unittest.cc +++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -25,6 +25,7 @@ #include "chromeos/network/network_state_test_helper.h" #include "chromeos/network/network_type_pattern.h" #include "chromeos/network/onc/onc_utils.h" +#include "chromeos/network/prohibited_technologies_handler.h" #include "chromeos/network/proxy/ui_proxy_config_service.h" #include "chromeos/services/network_config/public/cpp/cros_network_config_test_observer.h" #include "components/onc/onc_constants.h" @@ -485,6 +486,16 @@ run_loop.Run(); } + bool ContainsVpnDeviceState( + std::vector<mojom::DeviceStatePropertiesPtr> devices) { + for (auto& device : devices) { + if (device->type == mojom::NetworkType::kVPN) { + return true; + } + } + return false; + } + NetworkStateTestHelper& helper() { return helper_; } CrosNetworkConfigTestObserver* observer() { return observer_.get(); } CrosNetworkConfig* cros_network_config() { @@ -684,6 +695,32 @@ EXPECT_EQ(mojom::DeviceStateType::kDisabled, devices[0]->device_state); } +// Tests that no VPN device state is returned by GetDeviceStateList if no VPN +// services exist and built-in VPN is not prohibited. +TEST_F(CrosNetworkConfigTest, GetDeviceStateListNoVpnServices) { + helper().ClearServices(); + + std::vector<std::string> prohibited_technologies = + NetworkHandler::Get() + ->prohibited_technologies_handler() + ->GetCurrentlyProhibitedTechnologies(); + ASSERT_FALSE(base::Contains(prohibited_technologies, shill::kTypeVPN)); + + EXPECT_FALSE(ContainsVpnDeviceState(GetDeviceStateList())); +} + +// Tests that a VPN device state is returned by GetDeviceStateList if built-in +// VPN is not prohibited even if no VPN services exist. +TEST_F(CrosNetworkConfigTest, GetDeviceStateListNoVpnServicesAndVpnProhibited) { + helper().ClearServices(); + + NetworkHandler::Get() + ->prohibited_technologies_handler() + ->AddGloballyProhibitedTechnology(shill::kTypeVPN); + + EXPECT_TRUE(ContainsVpnDeviceState(GetDeviceStateList())); +} + // Test a sampling of properties, ensuring that string property types are // translated as strings and not enum values (See ManagedProperties definition // in cros_network_config.mojom for details).
diff --git a/components/account_manager_core/BUILD.gn b/components/account_manager_core/BUILD.gn index 665ab81..b16801cc 100644 --- a/components/account_manager_core/BUILD.gn +++ b/components/account_manager_core/BUILD.gn
@@ -20,6 +20,7 @@ deps = [ "//base", "//chromeos/crosapi/mojom", + "//google_apis:google_apis", ] defines = [ "IS_ACCOUNT_MANAGER_CORE_IMPL" ]
diff --git a/components/account_manager_core/DEPS b/components/account_manager_core/DEPS index 1b72be6..1709b49 100644 --- a/components/account_manager_core/DEPS +++ b/components/account_manager_core/DEPS
@@ -1,3 +1,4 @@ include_rules = [ "+chromeos/crosapi/mojom/account_manager.mojom.h", + "+google_apis/gaia/google_service_auth_error.h", ]
diff --git a/components/account_manager_core/account_manager_facade.cc b/components/account_manager_core/account_manager_facade.cc index eb8eea7e..f154ff8 100644 --- a/components/account_manager_core/account_manager_facade.cc +++ b/components/account_manager_core/account_manager_facade.cc
@@ -6,6 +6,17 @@ namespace account_manager { +AccountManagerFacade::AccountAdditionResult::AccountAdditionResult() = default; +AccountManagerFacade::AccountAdditionResult::AccountAdditionResult( + Status status, + AccountKey account) + : status(status), account(account) {} +AccountManagerFacade::AccountAdditionResult::AccountAdditionResult( + Status status, + GoogleServiceAuthError error) + : status(status), error(error) {} +AccountManagerFacade::AccountAdditionResult::~AccountAdditionResult() = default; + AccountManagerFacade::AccountManagerFacade() = default; AccountManagerFacade::~AccountManagerFacade() = default;
diff --git a/components/account_manager_core/account_manager_facade.h b/components/account_manager_core/account_manager_facade.h index 4408ea0..ea0d886 100644 --- a/components/account_manager_core/account_manager_facade.h +++ b/components/account_manager_core/account_manager_facade.h
@@ -5,7 +5,12 @@ #ifndef COMPONENTS_ACCOUNT_MANAGER_CORE_ACCOUNT_MANAGER_FACADE_H_ #define COMPONENTS_ACCOUNT_MANAGER_CORE_ACCOUNT_MANAGER_FACADE_H_ +#include <string> + +#include "base/callback.h" #include "base/component_export.h" +#include "components/account_manager_core/account.h" +#include "google_apis/gaia/google_service_auth_error.h" namespace account_manager { @@ -42,6 +47,31 @@ kMaxValue = kOnboarding }; + // The result of account addition request. + struct AccountAdditionResult { + enum class Status : int { + // The account was added successfully. + kSuccess = 0, + // The dialog is already open. + kAlreadyInProgress = 1, + // User closed the dialog. + kCancelledByUser = 2, + // Network error. + kNetworkError = 3, + }; + + Status status; + // The account that was added. + base::Optional<AccountKey> account; + // The error is set only if `status` is set to `kNetworkError`. + base::Optional<GoogleServiceAuthError> error; + + AccountAdditionResult(); + AccountAdditionResult(Status status, AccountKey account); + AccountAdditionResult(Status status, GoogleServiceAuthError error); + ~AccountAdditionResult(); + }; + AccountManagerFacade(); AccountManagerFacade(const AccountManagerFacade&) = delete; AccountManagerFacade& operator=(const AccountManagerFacade&) = delete; @@ -52,6 +82,18 @@ // Note: For out-of-process implementations, it returns |false| if the IPC // pipe to |AccountManager| is disconnected. virtual bool IsInitialized() = 0; + + // Launches account addition dialog and calls the `callback` with the result. + // If `result` is `kSuccess`, the added account will be passed to the + // callback. Otherwise `account` will be set to `base::nullopt`. + virtual void ShowAddAccountDialog( + const AccountAdditionSource& source, + base::OnceCallback<void(const AccountAdditionResult& result)> + callback) = 0; + + // Launches account reauthentication dialog for provided `email`. + virtual void ShowReauthAccountDialog(const AccountAdditionSource& source, + const std::string& email) = 0; }; } // namespace account_manager
diff --git a/components/autofill/ios/browser/js_suggestion_manager.h b/components/autofill/ios/browser/js_suggestion_manager.h index 953742fe..425e4ae 100644 --- a/components/autofill/ios/browser/js_suggestion_manager.h +++ b/components/autofill/ios/browser/js_suggestion_manager.h
@@ -5,70 +5,90 @@ #ifndef COMPONENTS_AUTOFILL_IOS_BROWSER_JS_SUGGESTION_MANAGER_H_ #define COMPONENTS_AUTOFILL_IOS_BROWSER_JS_SUGGESTION_MANAGER_H_ -#import "ios/web/public/deprecated/crw_js_injection_receiver.h" +#include "base/callback.h" +#include "base/memory/weak_ptr.h" +#import "ios/web/public/web_state_user_data.h" + +namespace base { +class Value; +} // namespace base namespace web { -class WebFramesManager; -} // namespace +class WebFrame; +class WebState; +} // namespace web -// Loads the JavaScript file, suggestion_manager.js, which contains form parsing -// and autofill functions. -@interface JsSuggestionManager : NSObject +namespace autofill { -// Designated initializer. |receiver| should not be nil. -- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver - NS_DESIGNATED_INITIALIZER; +class JsSuggestionManager : public web::WebStateUserData<JsSuggestionManager> { + public: + ~JsSuggestionManager() override; -- (instancetype)init NS_UNAVAILABLE; + static JsSuggestionManager* GetOrCreateForWebState(web::WebState* web_state); -// Sets the WebFrames manager associated with the receiver. -- (void)setWebFramesManager:(web::WebFramesManager*)framesManager; + // Focuses the next focusable element in tab order inside the web frame with + // frame id |frame_ID|. No action if there is no such element. + void SelectNextElementInFrameWithID(const std::string& frame_ID); -// Focuses the next focusable element in tab order inside the web frame with -// frame id |frameID|. No action if there is no such element. -- (void)selectNextElementInFrameWithID:(NSString*)frameID; + // Focuses the next focusable element in tab order after the element specified + // by |form_name| and |field_name| in tab order inside the web frame with + // frame id |frame_ID|. No action if there is no such element. + void SelectNextElementInFrameWithID(const std::string& frame_ID, + const std::string& form_name, + const std::string& field_name); -// Focuses the next focusable element in tab order after the element specified -// by |formName| and |fieldName| in tab order inside the web frame with frame id -// |frameID|. No action if there is no such element. -- (void)selectNextElementInFrameWithID:(NSString*)frameID - afterForm:(NSString*)formName - field:(NSString*)fieldName; + // Focuses the previous focusable element in tab order inside the web frame + // with frame id |frame_ID|. No action if there is no such element. + void SelectPreviousElementInFrameWithID(const std::string& frame_ID); -// Focuses the previous focusable element in tab order inside the web frame with -// frame id |frameID|. No action if there is no such element. -- (void)selectPreviousElementInFrameWithID:(NSString*)frameID; + // Focuses the previous focusable element in tab order from the element + // specified by |form_name| and |field_name| in tab order inside the web frame + // with frame id |frame_ID|. No action if there is no such element. + void SelectPreviousElementInFrameWithID(const std::string& frame_ID, + const std::string& form_name, + const std::string& field_name); -// Focuses the previous focusable element in tab order from the element -// specified by |formName| and |fieldName| in tab order inside the web frame -// with frame id |frameID|. No action if there is no such element. -- (void)selectPreviousElementInFrameWithID:(NSString*)frameID - beforeForm:(NSString*)formName - field:(NSString*)fieldName; + // Checks if the frame with frame id |frame_ID| contains a next and previous + // element. |completionHandler| is called with 2 bools, the first indicating + // if a previous element was found, and the second indicating if a next + // element was found. |completionHcompletion_handlerandler| cannot be nil. + void FetchPreviousAndNextElementsPresenceInFrameWithID( + const std::string& frame_ID, + base::OnceCallback<void(bool, bool)> completion_handler); -// Checks if the frame with frame id |frameID| contains a next and previous -// element. |completionHandler| is called with 2 BOOLs, the first indicating if -// a previous element was found, and the second indicating if a next element was -// found. |completionHandler| cannot be nil. -- (void)fetchPreviousAndNextElementsPresenceInFrameWithID:(NSString*)frameID - completionHandler:(void (^)(BOOL, BOOL)) - completionHandler; + // Checks if the frame with frame id |frame_ID| contains a next and previous + // element starting from the field specified by |form_name| and |field_name|. + // |completionHandler| is called with 2 BOOLs, the first indicating if a + // previous element was found, and the second indicating if a next element was + // found. |completion_handler| cannot be nil. + void FetchPreviousAndNextElementsPresenceInFrameWithID( + const std::string& frame_ID, + const std::string& form_name, + const std::string& field_name, + base::OnceCallback<void(bool, bool)> completion_handler); -// Checks if the frame with frame id |frameID| contains a next and previous -// element starting from the field specified by |formName| and |fieldName|. -// |completionHandler| is called with 2 BOOLs, the first indicating if a -// previous element was found, and the second indicating if a next element was -// found. |completionHandler| cannot be nil. -- (void)fetchPreviousAndNextElementsPresenceInFrameWithID:(NSString*)frameID - forForm:(NSString*)formName - field:(NSString*)fieldName - completionHandler:(void (^)(BOOL, BOOL)) - completionHandler; + // Closes the keyboard and defocuses the active input element in the frame + // with frame id |frame_ID|. + void CloseKeyboardForFrameWithID(const std::string& frame_ID); -// Closes the keyboard and defocuses the active input element in the frame with -// frame id |frameID|. -- (void)closeKeyboardForFrameWithID:(NSString*)frameID; + private: + explicit JsSuggestionManager(web::WebState* web_state); -@end + void PreviousAndNextElementsPresenceResult( + base::OnceCallback<void(bool, bool)> completion_handler, + const base::Value* res); + + web::WebFrame* GetFrameWithFrameID(const std::string& frame_ID); + + web::WebState* web_state_; + + base::WeakPtrFactory<JsSuggestionManager> weak_ptr_factory_; + + friend class web::WebStateUserData<JsSuggestionManager>; + + WEB_STATE_USER_DATA_KEY_DECL(); +}; + +} // namespace autofill #endif // COMPONENTS_AUTOFILL_IOS_BROWSER_JS_SUGGESTION_MANAGER_H_
diff --git a/components/autofill/ios/browser/js_suggestion_manager.mm b/components/autofill/ios/browser/js_suggestion_manager.mm index 41edcd0..2b207468 100644 --- a/components/autofill/ios/browser/js_suggestion_manager.mm +++ b/components/autofill/ios/browser/js_suggestion_manager.mm
@@ -4,6 +4,7 @@ #import "components/autofill/ios/browser/js_suggestion_manager.h" +#import <Foundation/Foundation.h> #include <vector> #include "base/bind.h" @@ -21,115 +22,125 @@ #error "This file requires ARC support." #endif -@implementation JsSuggestionManager { - // The injection receiver used to evaluate JavaScript. - __weak CRWJSInjectionReceiver* _receiver; - web::WebFramesManager* _webFramesManager; -} +namespace autofill { -- (instancetype)initWithReceiver:(CRWJSInjectionReceiver*)receiver { - DCHECK(receiver); - self = [super init]; - if (self) { - _receiver = receiver; +JsSuggestionManager::JsSuggestionManager(web::WebState* web_state) + : web_state_(web_state), weak_ptr_factory_(this) {} + +JsSuggestionManager::~JsSuggestionManager() = default; + +// static +JsSuggestionManager* JsSuggestionManager::GetOrCreateForWebState( + web::WebState* web_state) { + JsSuggestionManager* helper = FromWebState(web_state); + if (!helper) { + CreateForWebState(web_state); + helper = FromWebState(web_state); + DCHECK(helper); } - return self; + return helper; } -- (void)setWebFramesManager:(web::WebFramesManager*)framesManager { - _webFramesManager = framesManager; +void JsSuggestionManager::SelectNextElementInFrameWithID( + const std::string& frame_ID) { + SelectNextElementInFrameWithID(frame_ID, "", ""); } -#pragma mark - -#pragma mark ProtectedMethods - -- (void)selectNextElementInFrameWithID:(NSString*)frameID { - [self selectNextElementInFrameWithID:frameID afterForm:@"" field:@""]; -} - -- (void)selectNextElementInFrameWithID:(NSString*)frameID - afterForm:(NSString*)formName - field:(NSString*)fieldName { +void JsSuggestionManager::SelectNextElementInFrameWithID( + const std::string& frame_ID, + const std::string& form_name, + const std::string& field_name) { std::vector<base::Value> parameters; - parameters.push_back(base::Value(base::SysNSStringToUTF8(formName))); - parameters.push_back(base::Value(base::SysNSStringToUTF8(fieldName))); - autofill::ExecuteJavaScriptFunction( - "suggestion.selectNextElement", parameters, - [self frameWithFrameID:frameID], autofill::JavaScriptResultCallback()); + parameters.push_back(base::Value(form_name)); + parameters.push_back(base::Value(field_name)); + autofill::ExecuteJavaScriptFunction("suggestion.selectNextElement", + parameters, GetFrameWithFrameID(frame_ID), + autofill::JavaScriptResultCallback()); } -- (void)selectPreviousElementInFrameWithID:(NSString*)frameID { - [self selectPreviousElementInFrameWithID:frameID beforeForm:@"" field:@""]; +void JsSuggestionManager::SelectPreviousElementInFrameWithID( + const std::string& frame_ID) { + SelectPreviousElementInFrameWithID(frame_ID, "", ""); } -- (void)selectPreviousElementInFrameWithID:(NSString*)frameID - beforeForm:(NSString*)formName - field:(NSString*)fieldName { +void JsSuggestionManager::SelectPreviousElementInFrameWithID( + const std::string& frame_ID, + const std::string& form_name, + const std::string& field_name) { std::vector<base::Value> parameters; - parameters.push_back(base::Value(base::SysNSStringToUTF8(formName))); - parameters.push_back(base::Value(base::SysNSStringToUTF8(fieldName))); - autofill::ExecuteJavaScriptFunction( - "suggestion.selectPreviousElement", parameters, - [self frameWithFrameID:frameID], autofill::JavaScriptResultCallback()); + parameters.push_back(base::Value(form_name)); + parameters.push_back(base::Value(field_name)); + autofill::ExecuteJavaScriptFunction("suggestion.selectPreviousElement", + parameters, GetFrameWithFrameID(frame_ID), + autofill::JavaScriptResultCallback()); } -- (void)fetchPreviousAndNextElementsPresenceInFrameWithID:(NSString*)frameID - completionHandler: - (void (^)(BOOL, - BOOL))completionHandler { - [self fetchPreviousAndNextElementsPresenceInFrameWithID:frameID - forForm:@"" - field:@"" - completionHandler:completionHandler]; +void JsSuggestionManager::FetchPreviousAndNextElementsPresenceInFrameWithID( + const std::string& frame_ID, + base::OnceCallback<void(bool, bool)> completion_handler) { + FetchPreviousAndNextElementsPresenceInFrameWithID( + frame_ID, "", "", std::move(completion_handler)); } -- (void)fetchPreviousAndNextElementsPresenceInFrameWithID:(NSString*)frameID - forForm:(NSString*)formName - field:(NSString*)fieldName - completionHandler: - (void (^)(BOOL, - BOOL))completionHandler { - DCHECK(completionHandler); +void JsSuggestionManager::FetchPreviousAndNextElementsPresenceInFrameWithID( + const std::string& frame_ID, + const std::string& form_name, + const std::string& field_name, + base::OnceCallback<void(bool, bool)> completion_handler) { + DCHECK(completion_handler); std::vector<base::Value> parameters; - parameters.push_back(base::Value(base::SysNSStringToUTF8(formName))); - parameters.push_back(base::Value(base::SysNSStringToUTF8(fieldName))); + parameters.push_back(base::Value(form_name)); + parameters.push_back(base::Value(field_name)); autofill::ExecuteJavaScriptFunction( "suggestion.hasPreviousNextElements", parameters, - [self frameWithFrameID:frameID], - autofill::CreateStringCallback(^(NSString* result) { - // The result maybe an empty string here due to 2 reasons: - // 1) When there is an exception running the JS - // 2) There is a race when the page is changing due to which - // JSSuggestionManager has not yet injected __gCrWeb.suggestion - // object Handle this case gracefully. If a page has overridden - // Array.toString, the string returned may not contain a ",", - // hence this is a defensive measure to early return. - NSArray* components = [result componentsSeparatedByString:@","]; - if (components.count != 2) { - completionHandler(NO, NO); - return; - } - - DCHECK([components[0] isEqualToString:@"true"] || - [components[0] isEqualToString:@"false"]); - BOOL hasPreviousElement = [components[0] isEqualToString:@"true"]; - DCHECK([components[1] isEqualToString:@"true"] || - [components[1] isEqualToString:@"false"]); - BOOL hasNextElement = [components[1] isEqualToString:@"true"]; - completionHandler(hasPreviousElement, hasNextElement); - })); + GetFrameWithFrameID(frame_ID), + base::BindOnce( + &JsSuggestionManager::PreviousAndNextElementsPresenceResult, + weak_ptr_factory_.GetWeakPtr(), std::move(completion_handler))); } -- (void)closeKeyboardForFrameWithID:(NSString*)frameID { +void JsSuggestionManager::PreviousAndNextElementsPresenceResult( + base::OnceCallback<void(bool, bool)> completion_handler, + const base::Value* res) { + NSString* result = nil; + if (res && res->is_string()) { + result = base::SysUTF8ToNSString(res->GetString()); + } + // The result maybe an empty string here due to 2 reasons: + // 1) When there is an exception running the JS + // 2) There is a race when the page is changing due to which + // JSSuggestionManager has not yet injected __gCrWeb.suggestion + // object Handle this case gracefully. If a page has overridden + // Array.toString, the string returned may not contain a ",", + // hence this is a defensive measure to early return. + NSArray* components = [result componentsSeparatedByString:@","]; + if (components.count != 2) { + std::move(completion_handler).Run(false, false); + return; + } + + DCHECK([components[0] isEqualToString:@"true"] || + [components[0] isEqualToString:@"false"]); + bool has_previous_element = [components[0] isEqualToString:@"true"]; + DCHECK([components[1] isEqualToString:@"true"] || + [components[1] isEqualToString:@"false"]); + bool has_next_element = [components[1] isEqualToString:@"true"]; + std::move(completion_handler).Run(has_previous_element, has_next_element); +} + +void JsSuggestionManager::CloseKeyboardForFrameWithID( + const std::string& frame_ID) { std::vector<base::Value> parameters; - autofill::ExecuteJavaScriptFunction( - "suggestion.blurActiveElement", parameters, - [self frameWithFrameID:frameID], autofill::JavaScriptResultCallback()); + autofill::ExecuteJavaScriptFunction("suggestion.blurActiveElement", + parameters, GetFrameWithFrameID(frame_ID), + autofill::JavaScriptResultCallback()); } -- (web::WebFrame*)frameWithFrameID:(NSString*)frameID { - DCHECK(_webFramesManager); - return _webFramesManager->GetFrameWithId(base::SysNSStringToUTF8(frameID)); +web::WebFrame* JsSuggestionManager::GetFrameWithFrameID( + const std::string& frame_ID) { + return web_state_->GetWebFramesManager()->GetFrameWithId(frame_ID); } -@end +WEB_STATE_USER_DATA_KEY_IMPL(JsSuggestionManager) + +} // namspace autofill
diff --git a/components/autofill_assistant/browser/client.h b/components/autofill_assistant/browser/client.h index fc3022de..0d932cd 100644 --- a/components/autofill_assistant/browser/client.h +++ b/components/autofill_assistant/browser/client.h
@@ -86,9 +86,6 @@ // Whether this client has had an UI. virtual bool HasHadUI() const = 0; - // Returns whether the user has seen a trigger script before or not. - virtual bool IsFirstTimeTriggerScriptUser() const = 0; - protected: Client() = default; };
diff --git a/components/autofill_assistant/browser/controller_unittest.cc b/components/autofill_assistant/browser/controller_unittest.cc index 96405022..9269398 100644 --- a/components/autofill_assistant/browser/controller_unittest.cc +++ b/components/autofill_assistant/browser/controller_unittest.cc
@@ -143,7 +143,10 @@ controller_->AddObserver(&mock_observer_); } - void TearDown() override { controller_->RemoveObserver(&mock_observer_); } + void TearDown() override { + controller_->RemoveObserver(&mock_observer_); + RenderViewHostTestHarness::TearDown(); + } protected: static SupportedScriptProto* AddRunnableScript(
diff --git a/components/autofill_assistant/browser/model.proto b/components/autofill_assistant/browser/model.proto index b5441d6..876ffe4 100644 --- a/components/autofill_assistant/browser/model.proto +++ b/components/autofill_assistant/browser/model.proto
@@ -271,6 +271,12 @@ // HIGHLIGHTED_ACTION. DONE_ACTION = 6; + // A "Send feedback" chip, which will show the feedback form when clicked. + // + // Note that when this is used inside a script, we will continue the script + // normally once the user has clicked the chip. + FEEDBACK_ACTION = 7; + reserved 2; }
diff --git a/components/autofill_assistant/browser/service/lite_service_util.cc b/components/autofill_assistant/browser/service/lite_service_util.cc index 3bd4846b..18aec34 100644 --- a/components/autofill_assistant/browser/service/lite_service_util.cc +++ b/components/autofill_assistant/browser/service/lite_service_util.cc
@@ -117,6 +117,7 @@ case HIGHLIGHTED_ACTION: case NORMAL_ACTION: case CANCEL_ACTION: + case FEEDBACK_ACTION: return ActionResponseType::UNKNOWN; case CLOSE_ACTION: return ActionResponseType::PROMPT_CLOSE;
diff --git a/components/autofill_assistant/browser/trigger_scripts/mock_static_trigger_conditions.h b/components/autofill_assistant/browser/trigger_scripts/mock_static_trigger_conditions.h index bd6466f..46603dc 100644 --- a/components/autofill_assistant/browser/trigger_scripts/mock_static_trigger_conditions.h +++ b/components/autofill_assistant/browser/trigger_scripts/mock_static_trigger_conditions.h
@@ -15,11 +15,13 @@ MockStaticTriggerConditions(); ~MockStaticTriggerConditions() override; - MOCK_METHOD4(Init, - void(Client* client, - const GURL& url, - TriggerContext* trigger_context, - base::OnceCallback<void(void)> callback)); + MOCK_METHOD5( + Init, + void(WebsiteLoginManager* website_login_manager, + base::RepeatingCallback<bool(void)> is_first_time_user_callback, + const GURL& url, + TriggerContext* trigger_context, + base::OnceCallback<void(void)> callback)); MOCK_METHOD1(set_is_first_time_user, void(bool)); MOCK_CONST_METHOD0(is_first_time_user, bool()); MOCK_CONST_METHOD0(has_stored_login_credentials, bool());
diff --git a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc index bbb0358..4551e4a 100644 --- a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc +++ b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.cc
@@ -12,21 +12,23 @@ StaticTriggerConditions::StaticTriggerConditions() = default; StaticTriggerConditions::~StaticTriggerConditions() = default; -void StaticTriggerConditions::Init(Client* client, - const GURL& url, - TriggerContext* trigger_context, - base::OnceCallback<void(void)> callback) { +void StaticTriggerConditions::Init( + WebsiteLoginManager* website_login_manager, + base::RepeatingCallback<bool(void)> is_first_time_user_callback, + const GURL& url, + TriggerContext* trigger_context, + base::OnceCallback<void(void)> callback) { DCHECK(!callback_) << "Call to Init while another call to Init was still pending"; if (callback_) { return; } - is_first_time_user_ = client->IsFirstTimeTriggerScriptUser(); + is_first_time_user_ = is_first_time_user_callback.Run(); trigger_context_ = trigger_context; has_stored_login_credentials_ = false; callback_ = std::move(callback); - client->GetWebsiteLoginManager()->GetLoginsForUrl( + website_login_manager->GetLoginsForUrl( url, base::BindOnce(&StaticTriggerConditions::OnGetLogins, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h index 77327466..0721699 100644 --- a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h +++ b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h
@@ -9,7 +9,6 @@ #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" -#include "components/autofill_assistant/browser/client.h" #include "components/autofill_assistant/browser/trigger_context.h" #include "components/autofill_assistant/browser/website_login_manager.h" #include "url/gurl.h" @@ -24,13 +23,15 @@ StaticTriggerConditions(); virtual ~StaticTriggerConditions(); - // Initializes the field values according to |url| and the current state of - // |client|. Invokes |callback| when done. |client| and |trigger_context| must - // outlive this instance. - virtual void Init(Client* client, - const GURL& url, - TriggerContext* trigger_context, - base::OnceCallback<void(void)> callback); + // Initializes the field values using |website_login_manager| and + // |is_first_time_user_callback|. Invokes |callback| when done. All parameters + // must outlive this call. + virtual void Init( + WebsiteLoginManager* website_login_manager, + base::RepeatingCallback<bool(void)> is_first_time_user_callback, + const GURL& url, + TriggerContext* trigger_context, + base::OnceCallback<void(void)> callback); virtual void set_is_first_time_user(bool first_time_user); virtual bool is_first_time_user() const; virtual bool has_stored_login_credentials() const;
diff --git a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc index cc415a40..d016a22c 100644 --- a/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc +++ b/components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions_unittest.cc
@@ -4,7 +4,6 @@ #include "components/autofill_assistant/browser/trigger_scripts/static_trigger_conditions.h" -#include "components/autofill_assistant/browser/mock_client.h" #include "components/autofill_assistant/browser/mock_website_login_manager.h" #include "base/test/gmock_callback_support.h" @@ -29,23 +28,22 @@ protected: StaticTriggerConditions static_trigger_conditions_; + base::MockCallback<base::RepeatingCallback<bool(void)>> + mock_is_first_time_user_callback_; base::MockCallback<base::OnceCallback<void(void)>> mock_callback_; - NiceMock<MockClient> mock_client_; NiceMock<MockWebsiteLoginManager> mock_website_login_manager_; }; TEST_F(StaticTriggerConditionsTest, Init) { TriggerContextImpl trigger_context(/* params = */ {}, /* exp = */ "1,2,4"); - EXPECT_CALL(mock_client_, IsFirstTimeTriggerScriptUser) - .WillOnce(Return(true)); - EXPECT_CALL(mock_client_, GetWebsiteLoginManager) - .WillOnce(Return(&mock_website_login_manager_)); + EXPECT_CALL(mock_is_first_time_user_callback_, Run).WillOnce(Return(true)); EXPECT_CALL(mock_website_login_manager_, OnGetLoginsForUrl(GURL(kFakeUrl), _)) .WillOnce(RunOnceCallback<1>(std::vector<WebsiteLoginManager::Login>{ WebsiteLoginManager::Login(GURL(kFakeUrl), "fake_username")})); EXPECT_CALL(mock_callback_, Run).Times(1); - static_trigger_conditions_.Init(&mock_client_, GURL(kFakeUrl), - &trigger_context, mock_callback_.Get()); + static_trigger_conditions_.Init( + &mock_website_login_manager_, mock_is_first_time_user_callback_.Get(), + GURL(kFakeUrl), &trigger_context, mock_callback_.Get()); EXPECT_TRUE(static_trigger_conditions_.is_first_time_user()); EXPECT_TRUE(static_trigger_conditions_.has_stored_login_credentials()); @@ -65,16 +63,14 @@ EXPECT_FALSE(static_trigger_conditions_.has_results()); TriggerContextImpl trigger_context(/* params = */ {}, /* exp = */ "1,2,4"); - EXPECT_CALL(mock_client_, IsFirstTimeTriggerScriptUser) - .WillOnce(Return(true)); - EXPECT_CALL(mock_client_, GetWebsiteLoginManager) - .WillOnce(Return(&mock_website_login_manager_)); + EXPECT_CALL(mock_is_first_time_user_callback_, Run).WillOnce(Return(true)); EXPECT_CALL(mock_website_login_manager_, OnGetLoginsForUrl(GURL(kFakeUrl), _)) .WillOnce(RunOnceCallback<1>(std::vector<WebsiteLoginManager::Login>{ WebsiteLoginManager::Login(GURL(kFakeUrl), "fake_username")})); EXPECT_CALL(mock_callback_, Run).Times(1); - static_trigger_conditions_.Init(&mock_client_, GURL(kFakeUrl), - &trigger_context, mock_callback_.Get()); + static_trigger_conditions_.Init( + &mock_website_login_manager_, mock_is_first_time_user_callback_.Get(), + GURL(kFakeUrl), &trigger_context, mock_callback_.Get()); EXPECT_TRUE(static_trigger_conditions_.has_results()); }
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc index b34fc0ab..3d251de9 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc
@@ -42,15 +42,18 @@ namespace autofill_assistant { TriggerScriptCoordinator::TriggerScriptCoordinator( - Client* client, + content::WebContents* web_contents, + WebsiteLoginManager* website_login_manager, + base::RepeatingCallback<bool(void)> is_first_time_user_callback, std::unique_ptr<WebController> web_controller, std::unique_ptr<ServiceRequestSender> request_sender, const GURL& get_trigger_scripts_server, std::unique_ptr<StaticTriggerConditions> static_trigger_conditions, std::unique_ptr<DynamicTriggerConditions> dynamic_trigger_conditions, ukm::UkmRecorder* ukm_recorder) - : content::WebContentsObserver(client->GetWebContents()), - client_(client), + : content::WebContentsObserver(web_contents), + website_login_manager_(website_login_manager), + is_first_time_user_callback_(std::move(is_first_time_user_callback)), request_sender_(std::move(request_sender)), get_trigger_scripts_server_(get_trigger_scripts_server), web_controller_(std::move(web_controller)), @@ -117,7 +120,7 @@ initial_trigger_condition_evaluations_; Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, client_->GetWebContents(), + ukm_recorder_, web_contents(), Metrics::LiteScriptShownToUser::LITE_SCRIPT_RUNNING); StartCheckingTriggerConditions(); } @@ -128,7 +131,7 @@ case TriggerScriptProto::NOT_NOW: if (visible_trigger_script_ != -1) { Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, client_->GetWebContents(), + ukm_recorder_, web_contents(), Metrics::LiteScriptShownToUser::LITE_SCRIPT_NOT_NOW); trigger_scripts_[visible_trigger_script_] ->waiting_for_precondition_no_longer_true(true); @@ -169,7 +172,7 @@ return; } Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, client_->GetWebContents(), + ukm_recorder_, web_contents(), Metrics::LiteScriptShownToUser::LITE_SCRIPT_SWIPE_DISMISSED); PerformTriggerScriptAction(trigger_scripts_[visible_trigger_script_] ->AsProto() @@ -180,8 +183,8 @@ if (visible_trigger_script_ == -1) { return false; } - if (client_->GetWebContents()->GetController().CanGoBack()) { - client_->GetWebContents()->GetController().GoBack(); + if (web_contents()->GetController().CanGoBack()) { + web_contents()->GetController().GoBack(); } // We need to handle this event, because by default the bottom sheet will // close when the back button is pressed. @@ -295,7 +298,7 @@ void TriggerScriptCoordinator::WebContentsDestroyed() { if (!finished_state_recorded_) { Metrics::RecordLiteScriptFinished( - ukm_recorder_, client_->GetWebContents(), + ukm_recorder_, web_contents(), visible_trigger_script_ == -1 ? Metrics::LiteScriptFinishedState:: LITE_SCRIPT_WEB_CONTENTS_DESTROYED_WHILE_INVISIBLE @@ -313,7 +316,8 @@ trigger_script->AsProto()); } static_trigger_conditions_->Init( - client_, deeplink_url_, trigger_context_.get(), + website_login_manager_, is_first_time_user_callback_, deeplink_url_, + trigger_context_.get(), base::BindOnce(&TriggerScriptCoordinator::CheckDynamicTriggerConditions, weak_ptr_factory_.GetWeakPtr())); } @@ -337,7 +341,7 @@ } Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, client_->GetWebContents(), + ukm_recorder_, web_contents(), Metrics::LiteScriptShownToUser::LITE_SCRIPT_SHOWN_TO_USER); visible_trigger_script_ = index; auto proto = trigger_scripts_[index]->AsProto().user_interface(); @@ -384,7 +388,7 @@ if (visible_trigger_script_ != -1 && !evaluated_trigger_conditions[visible_trigger_script_]) { Metrics::RecordLiteScriptShownToUser( - ukm_recorder_, client_->GetWebContents(), + ukm_recorder_, web_contents(), Metrics::LiteScriptShownToUser:: LITE_SCRIPT_HIDE_ON_TRIGGER_CONDITION_NO_LONGER_TRUE); HideTriggerScript(); @@ -453,8 +457,7 @@ Metrics::LiteScriptFinishedState state) { if (!finished_state_recorded_) { finished_state_recorded_ = true; - Metrics::RecordLiteScriptFinished(ukm_recorder_, client_->GetWebContents(), - state); + Metrics::RecordLiteScriptFinished(ukm_recorder_, web_contents(), state); } for (Observer& observer : observers_) {
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h index 1a01bed..4bd629c 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.h
@@ -49,9 +49,11 @@ virtual void OnVisibilityChanged(bool visible) = 0; }; - // |client| and |web_contents| must outlive this instance. + // |web_contents| must outlive this instance. TriggerScriptCoordinator( - Client* client, + content::WebContents* web_contents, + WebsiteLoginManager* website_login_manager, + base::RepeatingCallback<bool(void)> is_first_time_user_callback, std::unique_ptr<WebController> web_controller, std::unique_ptr<ServiceRequestSender> request_sender, const GURL& get_trigger_scripts_server, @@ -126,9 +128,12 @@ void NotifyOnTriggerScriptFinished(Metrics::LiteScriptFinishedState state); - // Used to retrieve deps and also to request shutdown and, if applicable, - // start of the regular script. - Client* client_; + // Used to query login information for the current webcontents. + WebsiteLoginManager* website_login_manager_; + + // Callback that can be used to query whether a user has seen the trigger + // script UI at least once or not. + base::RepeatingCallback<bool(void)> is_first_time_user_callback_; // The original deeplink to request trigger scripts for. GURL deeplink_url_;
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc index 701e46e..a0c7384 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc
@@ -7,7 +7,7 @@ #include "base/test/gmock_callback_support.h" #include "base/test/mock_callback.h" #include "base/test/task_environment.h" -#include "components/autofill_assistant/browser/mock_client.h" +#include "components/autofill_assistant/browser/mock_website_login_manager.h" #include "components/autofill_assistant/browser/service/mock_service_request_sender.h" #include "components/autofill_assistant/browser/test_util.h" #include "components/autofill_assistant/browser/trigger_scripts/mock_dynamic_trigger_conditions.h" @@ -57,8 +57,6 @@ RenderViewHostTestHarness::SetUp(); ukm::InitializeSourceUrlRecorderForWebContents(web_contents()); - ON_CALL(mock_client_, GetWebContents).WillByDefault(Return(web_contents())); - auto mock_request_sender = std::make_unique<NiceMock<MockServiceRequestSender>>(); mock_request_sender_ = mock_request_sender.get(); @@ -79,7 +77,8 @@ .WillByDefault(Return(true)); coordinator_ = std::make_unique<TriggerScriptCoordinator>( - &mock_client_, std::move(mock_web_controller), + web_contents(), &mock_website_login_manager_, + mock_is_first_time_user_callback_.Get(), std::move(mock_web_controller), std::move(mock_request_sender), GURL(kFakeServerUrl), std::move(mock_static_trigger_conditions), std::move(mock_dynamic_trigger_conditions), &ukm_recorder_); @@ -88,7 +87,10 @@ SimulateNavigateToUrl(GURL(kFakeDeepLink)); } - void TearDown() override { coordinator_->RemoveObserver(&mock_observer_); } + void TearDown() override { + coordinator_->RemoveObserver(&mock_observer_); + RenderViewHostTestHarness::TearDown(); + } void SimulateWebContentsVisibilityChanged(content::Visibility visibility) { coordinator_->OnVisibilityChanged(visibility); @@ -135,7 +137,9 @@ ukm::TestAutoSetUkmRecorder ukm_recorder_; NiceMock<MockServiceRequestSender>* mock_request_sender_; NiceMock<MockWebController>* mock_web_controller_; - NiceMock<MockClient> mock_client_; + NiceMock<MockWebsiteLoginManager> mock_website_login_manager_; + base::MockCallback<base::RepeatingCallback<bool(void)>> + mock_is_first_time_user_callback_; NaggyMock<MockObserver> mock_observer_; std::unique_ptr<TriggerScriptCoordinator> coordinator_; NiceMock<MockStaticTriggerConditions>* mock_static_trigger_conditions_; @@ -235,7 +239,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, ClearSelectors).Times(1); EXPECT_CALL(*mock_dynamic_trigger_conditions_, AddSelectorsFromTriggerScript(response.trigger_scripts(0))) @@ -264,7 +268,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); ON_CALL(*mock_dynamic_trigger_conditions_, GetSelectorMatches) @@ -300,7 +304,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillOnce(RunOnceCallback<1>()); @@ -324,7 +328,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillOnce(RunOnceCallback<1>()); @@ -346,7 +350,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, GetSelectorMatches) @@ -386,7 +390,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, GetSelectorMatches) @@ -416,7 +420,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, GetSelectorMatches) @@ -446,7 +450,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, GetSelectorMatches) @@ -477,7 +481,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, GetSelectorMatches) @@ -521,7 +525,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillOnce(RunOnceCallback<1>()); @@ -565,7 +569,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); ON_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillByDefault(RunOnceCallback<1>()); EXPECT_CALL(mock_observer_, OnTriggerScriptShown).Times(1); @@ -591,7 +595,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); // Note: expect 4 calls: 1 initial plus 3 until timeout. EXPECT_CALL(*mock_dynamic_trigger_conditions_, @@ -627,7 +631,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillRepeatedly(RunOnceCallback<1>()); @@ -670,7 +674,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillRepeatedly(RunOnceCallback<1>()); @@ -698,7 +702,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillOnce(RunOnceCallback<1>()); @@ -744,7 +748,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillRepeatedly(RunOnceCallback<1>()); @@ -771,7 +775,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillRepeatedly(RunOnceCallback<1>()); @@ -801,7 +805,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillOnce(RunOnceCallback<1>()); @@ -826,7 +830,7 @@ EXPECT_CALL(*mock_request_sender_, OnSendRequest(GURL(kFakeServerUrl), _, _)) .WillOnce(RunOnceCallback<2>(net::HTTP_OK, serialized_response)); EXPECT_CALL(*mock_static_trigger_conditions_, Init) - .WillOnce(RunOnceCallback<3>()); + .WillOnce(RunOnceCallback<4>()); EXPECT_CALL(*mock_dynamic_trigger_conditions_, OnUpdate(mock_web_controller_, _)) .WillOnce(RunOnceCallback<1>());
diff --git a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc index 3e73e11..363674e7 100644 --- a/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc +++ b/components/autofill_assistant/browser/website_login_manager_impl_unittest.cc
@@ -103,6 +103,7 @@ protected: void SetUp() override { + RenderViewHostTestHarness::SetUp(); profile_store_ = new password_manager::MockPasswordStore; ON_CALL(*profile_store_, IsAccountStore()).WillByDefault(Return(false)); ASSERT_TRUE(profile_store_->Init(/*prefs=*/nullptr)); @@ -129,6 +130,7 @@ account_store_->ShutdownOnUIThread(); } profile_store_->ShutdownOnUIThread(); + RenderViewHostTestHarness::TearDown(); } WebsiteLoginManagerImpl* manager() { return manager_.get(); }
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index 4c4dbd4..0536b94 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -140,7 +140,7 @@ <translation id="5063480226653192405">Erabilera</translation> <translation id="5100237604440890931">Tolestuta; egin klik zabaltzeko.</translation> <translation id="5123685120097942451">Ezkutuko moduko fitxa</translation> -<translation id="5186036860380548585">aukera pantailaren goialdean dago</translation> +<translation id="5186036860380548585">Aukera pantailaren goialdean dago</translation> <translation id="5197729504361054390">Hautatzen dituzun kontaktuak <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> webgunearekin partekatuko dira.</translation> <translation id="528192093759286357">Pantaila osoko ikuspegitik irteteko, arrastatu goitik eta ukitu Atzera botoia.</translation> <translation id="5300589172476337783">Erakutsi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index 209781e2..3701339 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -140,7 +140,7 @@ <translation id="5063480226653192405">Utilisation</translation> <translation id="5100237604440890931">Réduit : cliquer pour développer</translation> <translation id="5123685120097942451">Onglet de navigation privée</translation> -<translation id="5186036860380548585">Options accessibles près du haut de l'écran</translation> +<translation id="5186036860380548585">Option accessible près du haut de l'écran</translation> <translation id="5197729504361054390">Les contacts que vous sélectionnez seront partagés avec <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation> <translation id="528192093759286357">Faites glisser du haut vers le bas et appuyez sur le bouton de retour pour quitter le mode plein écran.</translation> <translation id="5300589172476337783">Afficher</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index 560d059..d86dc936 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -107,7 +107,7 @@ <translation id="3987993985790029246">Kopírovať odkaz</translation> <translation id="3991845972263764475"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / ?</translation> <translation id="4002066346123236978">Názov</translation> -<translation id="4008040567710660924">Povolenie súborov cookie konkrétneho webu</translation> +<translation id="4008040567710660924">Povoliť súbory cookie na konkrétnom webe.</translation> <translation id="4046123991198612571">Ďalšia skladba</translation> <translation id="4165986682804962316">Nastavenia webu</translation> <translation id="4200726100658658164">Otvoriť nastavenia polohy</translation> @@ -120,7 +120,7 @@ <translation id="4433925000917964731">Zjednodušenú verziu stránky poskytol Google</translation> <translation id="4434045419905280838">Vyskakovacie okná a presmerovania</translation> <translation id="445467742685312942">Povoliť webom prehrávať chránený obsah</translation> -<translation id="4468959413250150279">Vypnite zvuk konkrétneho webu.</translation> +<translation id="4468959413250150279">Vypnúť zvuk na konkrétnom webe.</translation> <translation id="4479647676395637221">Pýtať sa, či chcete povoliť webu používať kameru (odporúčané)</translation> <translation id="4505788138578415521">Webová adresa bola rozbalená</translation> <translation id="4534723447064627427">Ak chcete povoliť aplikácii <ph name="APP_NAME" /> používať mikrofón, zapnite ho aj v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" />.</translation> @@ -155,7 +155,7 @@ <translation id="5394307150471348411">{DETAIL_COUNT,plural, =1{(+ 1 ďalšie)}few{(+ # ďalšie)}many{(+ # more)}other{(+ # ďalších)}}</translation> <translation id="5403592356182871684">Názvy</translation> <translation id="5489227211564503167">Uplynutý čas: <ph name="ELAPSED_TIME" /> z <ph name="TOTAL_TIME" />.</translation> -<translation id="5494752089476963479">Blokovať reklamy webov, ktoré zobrazujú obťažujúce alebo zavádzajúce reklamy</translation> +<translation id="5494752089476963479">Blokovať reklamy na weboch, ktoré zobrazujú obťažujúce alebo zavádzajúce reklamy</translation> <translation id="5502860503640766021">Povolené: <ph name="PERMISSION_1" />, blokované: <ph name="PERMISSION_2" /></translation> <translation id="5505264765875738116">Weby nemôžu žiadať o odosielanie upozornení</translation> <translation id="5516455585884385570">Otvoriť nastavenia upozornení</translation> @@ -250,7 +250,7 @@ <translation id="783819812427904514">Zapnúť zvuk videa</translation> <translation id="7846076177841592234">Zrušiť výber</translation> <translation id="7846621471902887024">Systém vás odhlási zo všetkých webov.</translation> -<translation id="7882806643839505685">Povoliť zvuk pre konkrétny web.</translation> +<translation id="7882806643839505685">Povoliť zvuk na konkrétnom webe.</translation> <translation id="7986741934819883144">Výber kontaktu</translation> <translation id="7993619969781047893">Funkcie na niektorých weboch môžu zlyhávať</translation> <translation id="7999064672810608036">Naozaj chcete vymazať všetky miestne dáta tohto webu, vrátane súborov cookie, a resetovať všetky jeho povolenia?</translation> @@ -259,7 +259,7 @@ <translation id="8067883171444229417">Prehrať video</translation> <translation id="8068648041423924542">Nedá sa vybrať certifikát</translation> <translation id="8087000398470557479">Tento obsah pochádza z domény <ph name="DOMAIN_NAME" /> a bol doručený Googlom.</translation> -<translation id="8116925261070264013">Zvuk bol vypnutý</translation> +<translation id="8116925261070264013">Vypnuté</translation> <translation id="8131740175452115882">Potvrdiť</translation> <translation id="8197286292360124385">Povolené: <ph name="PERMISSION_1" /></translation> <translation id="8200772114523450471">Pokračovať</translation> @@ -268,7 +268,7 @@ <translation id="8261506727792406068">Odstrániť</translation> <translation id="8300705686683892304">Spravované aplikáciou</translation> <translation id="8324158725704657629">Nabudúce sa nepýtať</translation> -<translation id="8372893542064058268">Povolenie synchronizácie na pozadí na konkrétnom webe.</translation> +<translation id="8372893542064058268">Povoliť synchronizáciu na pozadí na konkrétnom webe.</translation> <translation id="8376384591331888629">Vrátane súborov cookie tretích strán na tomto webe</translation> <translation id="83792324527827022">Váš fotoaparát a mikrofón používa nejaký web</translation> <translation id="8380167699614421159">Tento web zobrazuje obťažujúce alebo zavádzajúce reklamy</translation> @@ -279,17 +279,17 @@ <translation id="8447861592752582886">Odvolať povolenie pre zariadenie</translation> <translation id="8451050538944905715">{NUM_SELECTED,plural, =1{Používa sa 1 súbor cookie}few{Používajú sa # súbory cookie}many{# cookies in use}other{Používa sa # súborov cookie}}</translation> <translation id="8463851957836045671">Web je rýchly</translation> -<translation id="851751545965956758">Zakázať webom pripájať sa k zariadeniam</translation> +<translation id="851751545965956758">Brániť webom pripájať sa k zariadeniam</translation> <translation id="8525306231823319788">Celá obrazovka</translation> <translation id="857943718398505171">Povolené (odporúčané)</translation> <translation id="8609465669617005112">Presunúť nahor</translation> <translation id="8676374126336081632">Vymazať vstup</translation> <translation id="868929229000858085">Prehľadať kontakty</translation> -<translation id="8702612070107455751">Budú vymazané všetky offline údaje.</translation> +<translation id="8702612070107455751">Všetky offline dáta budú vymazané.</translation> <translation id="8719283222052720129">Zapnite v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" /> povolenie pre aplikáciu <ph name="APP_NAME" />.</translation> <translation id="8725066075913043281">Skúsiť znova</translation> <translation id="8730621377337864115">Hotovo</translation> -<translation id="8737217482364735741">Týmto vymažete všetky dáta a súbory cookie uložené zdrojom <ph name="ORIGIN" />.</translation> +<translation id="8737217482364735741">Týmto vymažete všetky dáta a súbory cookie uložené webom <ph name="ORIGIN" />.</translation> <translation id="8751914237388039244">Vyberte obrázok</translation> <translation id="8801436777607969138">Blokovať JavaScript na konkrétnom webe.</translation> <translation id="8816026460808729765">Zablokovať webom prístup k senzorom</translation> @@ -299,7 +299,7 @@ <translation id="8929372349074745002">Tento web sa väčšine ľudí otvára rýchlo, aj tak reaguje</translation> <translation id="8941729603749328384">www.example.com</translation> <translation id="894871326938397531">Ukončiť režim inkognito?</translation> -<translation id="8958424370300090006">Blokovanie súborov cookie konkrétneho webu</translation> +<translation id="8958424370300090006">Blokovať súbory cookie na konkrétnom webe.</translation> <translation id="8959122750345127698">Navigácia je nedostupná: <ph name="URL" /></translation> <translation id="9019902583201351841">Spravované vašimi rodičmi</translation> <translation id="9074739597929991885">Bluetooth</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index 0b3852e6..cd97779 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -20,7 +20,7 @@ <translation id="1415402041810619267">URL kısaltıldı</translation> <translation id="1431402976894535801">Etkin olduğunuzda sitelerin bilmesini engelleyin</translation> <translation id="1446450296470737166">MIDI cihazlarının tam denetimine izin verme</translation> -<translation id="1509960214886564027">Birçok sitedeki özellikler bozulabilir</translation> +<translation id="1509960214886564027">Birçok sitedeki özellikler çalışmayabilir</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1660204651932907780">Sitelerin ses çalmasına izin ver (önerilir)</translation> <translation id="1677097821151855053">Çerezler ve diğer site verileri sizi hatırlamamız için kullanılır, örneğin oturumunuzu açmak veya reklamları kişiselleştirmek için. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="BEGIN_LINK" />Ayarlar<ph name="END_LINK" /> bölümünden öğrenebilirsiniz.</translation> @@ -113,7 +113,7 @@ <translation id="4200726100658658164">Konum Ayarlarını açın</translation> <translation id="4226663524361240545">Bildirimler cihazı titretebilir</translation> <translation id="4259722352634471385">Gezinme engellendi: <ph name="URL" /></translation> -<translation id="4278390842282768270">İzin verilen</translation> +<translation id="4278390842282768270">İzin veriliyor</translation> <translation id="429312253194641664">Bir site medya oynatıyor</translation> <translation id="42981349822642051">Genişlet</translation> <translation id="4336434711095810371">Tüm verileri temizle</translation> @@ -163,7 +163,7 @@ <translation id="5556459405103347317">Yeniden Yükle</translation> <translation id="5596627076506792578">Diğer seçenekler</translation> <translation id="5649053991847567735">Otomatik indirmeler</translation> -<translation id="5677928146339483299">Engellendi</translation> +<translation id="5677928146339483299">Engelleniyor</translation> <translation id="5689516760719285838">Konum</translation> <translation id="5690795753582697420">Kamera, Android ayarlarında kapatıldı</translation> <translation id="5710871682236653961">NFC cihazlarına dokunduğunuzda sitelerin bilgi göndermesine ve almasına izin verilmeden önce size sorulur (önerilen)</translation> @@ -188,7 +188,7 @@ <translation id="6206551242102657620">Bağlantı güvenli. Site bilgileri</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Seçenekleri</translation> <translation id="6262279340360821358"><ph name="PERMISSION_1" /> ve <ph name="PERMISSION_2" /> engellendi</translation> -<translation id="6270391203985052864">Siteler bildirim göndermek isteyebilir</translation> +<translation id="6270391203985052864">Siteler bildirim gönderme izni isteyebilir</translation> <translation id="6295158916970320988">Tüm siteler</translation> <translation id="6320088164292336938">Titreşim</translation> <translation id="6388207532828177975">Temizle ve sıfırla</translation> @@ -199,7 +199,7 @@ <translation id="6527303717912515753">Paylaş</translation> <translation id="6545864417968258051">Bluetooth taraması</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> izin daha engellendi}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> izin daha engellendi}}</translation> -<translation id="6561560012278703671">Bilgiyi daha az rahatsız edici bir şekilde alın (bildirim istemlerinin sizi rahatsız etmesini engelleyin)</translation> +<translation id="6561560012278703671">İletişim daha sessiz kurulsun (bildirim istemlerinin sizi rahatsız etmesini engeller)</translation> <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation> <translation id="6612358246767739896">Korunan içerik</translation> <translation id="662080504995468778">Kal</translation> @@ -252,7 +252,7 @@ <translation id="7846621471902887024">Tüm sitelerdeki oturumunuz kapatılacak.</translation> <translation id="7882806643839505685">Belirli bir site için sese izin verin.</translation> <translation id="7986741934819883144">Kişi seçin</translation> -<translation id="7993619969781047893">Bazı sitelerdeki özellikler bozulabilir</translation> +<translation id="7993619969781047893">Bazı sitelerdeki özellikler çalışmayabilir</translation> <translation id="7999064672810608036">Bu web sitesine ilişkin çerezler dahil tüm yerel verileri temizlemek ve bu sitenin tüm izinlerini sıfırlamak istediğinizden emin misiniz?</translation> <translation id="8007176423574883786">Bu cihaz için kapatıldı</translation> <translation id="802154636333426148">İndirilemedi</translation> @@ -305,6 +305,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> tane daha}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> tane daha}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> için izinleri açmak üzere <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda izinleri açın.</translation> -<translation id="965817943346481315">Site, araya giren veya yanıltıcı reklamlar gösteriyorsa engelle (önerilen)</translation> +<translation id="965817943346481315">Araya giren veya yanıltıcı reklamlar gösteren sitelerde reklamları engelle (önerilir)</translation> <translation id="967624055006145463">Depolanan veriler</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index e63cf66..fd3cea0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -27,7 +27,7 @@ <translation id="1688867105868176567">要清除网站数据吗?</translation> <translation id="169515064810179024">禁止网站使用动态传感器</translation> <translation id="1717218214683051432">动态传感器</translation> -<translation id="1743802530341753419">网站需先询问并得到许可才能连接设备(推荐)</translation> +<translation id="1743802530341753419">需先询问,得到许可后才允许网站连接设备(推荐)</translation> <translation id="1779089405699405702">图片解码器</translation> <translation id="1818308510395330587">若要允许 <ph name="APP_NAME" /> 使用 AR 功能,您还需在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启摄像头。</translation> <translation id="1887786770086287077">此设备的位置信息使用权已关闭;若想开启这项权限,请转到 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />。</translation> @@ -42,10 +42,10 @@ <translation id="2054665754582400095">您的状态</translation> <translation id="2079545284768500474">撤消</translation> <translation id="2091887806945687916">声音</translation> -<translation id="2107397443965016585">网站需先询问并得到许可才能播放受保护内容 (推荐)</translation> +<translation id="2107397443965016585">需先询问,得到许可后才允许网站播放受保护的内容 (推荐)</translation> <translation id="2146738493024040262">打开免安装应用</translation> <translation id="2148716181193084225">今天</translation> -<translation id="2182457891543959921">在允许网站为您的周边环境创建 3D 地图或跟踪摄像头位置之前询问您(推荐)</translation> +<translation id="2182457891543959921">需先询问,得到许可后才允许网站为您的周边环境创建 3D 地图或跟踪摄像头位置(推荐)</translation> <translation id="2212565012507486665">允许使用 Cookie</translation> <translation id="2228071138934252756">若要允许 <ph name="APP_NAME" /> 使用您的摄像头,您还需在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中开启摄像头。</translation> <translation id="2241634353105152135">仅一次</translation> @@ -73,7 +73,7 @@ <translation id="2870560284913253234">网站</translation> <translation id="2874939134665556319">上一首</translation> <translation id="2903493209154104877">地址</translation> -<translation id="2910701580606108292">网站需先询问并得到许可才能播放受保护内容</translation> +<translation id="2910701580606108292">需先询问,得到许可后才允许网站播放受保护的内容</translation> <translation id="2913331724188855103">允许网站保存和读取 Cookie 数据(推荐)</translation> <translation id="2968755619301702150">证书查看器</translation> <translation id="300526633675317032">这会清除全部的网站存储数据 (<ph name="SIZE_IN_KB" />)。</translation> @@ -90,7 +90,7 @@ <translation id="3295602654194328831">隐藏信息</translation> <translation id="3328801116991980348">网站信息</translation> <translation id="3333961966071413176">所有联系人</translation> -<translation id="3386292677130313581">网站需要先询问并得到您的许可才能获取您的位置信息(推荐)</translation> +<translation id="3386292677130313581">网站需要先询问,得到许可后才能获取您的位置信息(推荐)</translation> <translation id="3538390592868664640">禁止网站为您的周边环境创建 3D 地图或跟踪摄像头位置</translation> <translation id="3586500876634962664">正在使用摄像头和麦克风</translation> <translation id="3587482841069643663">全部</translation> @@ -130,14 +130,14 @@ <translation id="4708011789095599544">确定要清除此网站的 Cookie 和其他网站数据吗?</translation> <translation id="4751476147751820511">动态传感器或光传感器</translation> <translation id="4883854917563148705">无法重置托管设置</translation> -<translation id="4887024562049524730">网站需在使用您的虚拟实境设备和数据之前获得您的许可(推荐)</translation> +<translation id="4887024562049524730">需先询问,得到许可后才允许网站使用您的虚拟实境设备和数据(推荐)</translation> <translation id="4962975101802056554">撤消设备的所有权限</translation> <translation id="497421865427891073">前进</translation> <translation id="4994033804516042629">找不到任何联系人</translation> <translation id="4996978546172906250">分享方式</translation> <translation id="5039804452771397117">允许</translation> <translation id="5048398596102334565">允许网站使用动态传感器(推荐)</translation> -<translation id="5063480226653192405">使用情况</translation> +<translation id="5063480226653192405">空间占用量</translation> <translation id="5100237604440890931">已收起 - 点击此处即可展开。</translation> <translation id="5123685120097942451">无痕式标签页</translation> <translation id="5186036860380548585">选项位于屏幕顶部附近</translation> @@ -159,14 +159,14 @@ <translation id="5502860503640766021">已授予“<ph name="PERMISSION_1" />”权限,已禁用“<ph name="PERMISSION_2" />”权限</translation> <translation id="5505264765875738116">网站无法询问能否向您发送通知</translation> <translation id="5516455585884385570">打开通知设置</translation> -<translation id="5527111080432883924">网站需先询问并得到许可才能读取剪贴板中的文字和图片(推荐)</translation> +<translation id="5527111080432883924">需先询问,得到许可后才允许网站读取剪贴板中的文字和图片(推荐)</translation> <translation id="5556459405103347317">重新加载</translation> <translation id="5596627076506792578">更多选项</translation> <translation id="5649053991847567735">自动下载项</translation> <translation id="5677928146339483299">已禁止</translation> <translation id="5689516760719285838">位置信息</translation> <translation id="5690795753582697420">已在 Android 设置中关闭摄像头</translation> -<translation id="5710871682236653961">(推荐)网站需先询问并获得您的许可,才能在您触碰 NFC 设备时发送和接收信息</translation> +<translation id="5710871682236653961">需先询问,得到许可后才允许网站在您触碰 NFC 设备时发送和接收信息(推荐)</translation> <translation id="5719847187258001597">此操作会清除 <ph name="ORIGIN" /> 或其在主屏幕中安装的应用所存储的全部数据和 Cookie。</translation> <translation id="5771720122942595109">已禁用“<ph name="PERMISSION_1" />”权限</translation> <translation id="5804241973901381774">权限</translation> @@ -199,7 +199,7 @@ <translation id="6527303717912515753">分享</translation> <translation id="6545864417968258051">蓝牙扫描</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{已禁用“<ph name="PERMISSION_1" />”权限、“<ph name="PERMISSION_2" />”权限和另外 <ph name="NUM_MORE" /> 项权限}other{已禁用“<ph name="PERMISSION_1" />”权限、“<ph name="PERMISSION_2" />”权限和另外 <ph name="NUM_MORE" /> 项权限}}</translation> -<translation id="6561560012278703671">改用静态指示方式(禁止网站发送通知,以免干扰)</translation> +<translation id="6561560012278703671">改用干扰性更低的提示方式(禁止网站发送通知,以免干扰)</translation> <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation> <translation id="6612358246767739896">受保护的内容</translation> <translation id="662080504995468778">留下</translation> @@ -236,7 +236,7 @@ <translation id="7554752735887601236">有一个网站正在使用您的麦克风</translation> <translation id="7561196759112975576">永远</translation> <translation id="7572498721684305250">禁止网站在您触碰 NFC 设备时发送和接收信息</translation> -<translation id="757524316907819857">禁止网站播放受保护内容</translation> +<translation id="757524316907819857">禁止网站播放受保护的内容</translation> <translation id="7589445247086920869">不允许当前搜索引擎使用</translation> <translation id="7649070708921625228">帮助</translation> <translation id="7658239707568436148">取消</translation> @@ -259,7 +259,7 @@ <translation id="8067883171444229417">播放视频</translation> <translation id="8068648041423924542">无法选择证书。</translation> <translation id="8087000398470557479">此内容来自 <ph name="DOMAIN_NAME" />(由 Google 提供)。</translation> -<translation id="8116925261070264013">已静音的网站</translation> +<translation id="8116925261070264013">已静音</translation> <translation id="8131740175452115882">确认</translation> <translation id="8197286292360124385">已授予“<ph name="PERMISSION_1" />”权限</translation> <translation id="8200772114523450471">继续</translation>
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml index b73e81a..92dd5f1 100644 --- a/components/browser_ui/styles/android/java/res/values/styles.xml +++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -9,7 +9,7 @@ <!-- Text colors --> <item name="android:textColorLink">@color/default_text_color_link</item> <item name="android:textColorHighlight">@color/text_highlight_color</item> - <item name="android:textColorHint">@color/default_text_color_secondary</item> + <item name="android:textColorHint">@color/default_text_color_hint_list</item> <!-- Color of checkboxes, switches, buttons, etc. --> <item name="colorAccent">@color/default_control_color_active</item>
diff --git a/components/embedder_support/android/metrics/android_metrics_service_client.cc b/components/embedder_support/android/metrics/android_metrics_service_client.cc index ce00e9f..1cbba062 100644 --- a/components/embedder_support/android/metrics/android_metrics_service_client.cc +++ b/components/embedder_support/android/metrics/android_metrics_service_client.cc
@@ -147,8 +147,8 @@ PrefService* pref_service, bool metrics_reporting_enabled) { // Create an object to monitor files of metrics and include them in reports. - std::unique_ptr<metrics::FileMetricsProvider> file_metrics_provider( - new metrics::FileMetricsProvider(pref_service)); + std::unique_ptr<metrics::FileMetricsProvider> file_metrics_provider = + std::make_unique<metrics::FileMetricsProvider>(pref_service); base::FilePath user_data_dir; base::PathService::Get(base::DIR_ANDROID_APP_DATA, &user_data_dir); @@ -264,34 +264,46 @@ // TODO:(crbug.com/1148351) Make the initialization consistent with Chrome. void AndroidMetricsServiceClient::MaybeStartMetrics() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!IsConsentDetermined()) + return; + +#if DCHECK_IS_ON() + // This function should be called only once after consent has been determined. + DCHECK(!did_start_metrics_with_consent_); + did_start_metrics_with_consent_ = true; +#endif + // Treat the debugging flag the same as user consent because the user set it, // but keep app_consent_ separate so we never persist data from an opted-out // app. bool user_consent_or_flag = user_consent_ || IsMetricsReportingForceEnabled(); - if (IsConsentDetermined()) { - if (app_consent_ && user_consent_or_flag) { - did_start_metrics_ = true; - // Make GetSampleBucketValue() work properly. - metrics_state_manager_->ForceClientIdCreation(); - is_client_id_forced_ = true; - RegisterMetricsProvidersAndInitState(); - // Register for notifications so we can detect when the user or app are - // interacting with the embedder. We use these as signals to wake up the - // MetricsService. - RegisterForNotifications(); - OnMetricsStart(); + if (app_consent_ && user_consent_or_flag) { + did_start_metrics_ = true; + // Make GetSampleBucketValue() work properly. + metrics_state_manager_->ForceClientIdCreation(); + is_client_id_forced_ = true; + RegisterMetricsProvidersAndInitState(); + // Register for notifications so we can detect when the user or app are + // interacting with the embedder. We use these as signals to wake up the + // MetricsService. + RegisterForNotifications(); + OnMetricsStart(); - if (IsReportingEnabled()) { - // We assume the embedder has no shutdown sequence, so there's no need - // for a matching Stop() call. - metrics_service_->Start(); - } - - CreateUkmService(); - } else { - OnMetricsNotStarted(); - pref_service_->ClearPref(prefs::kMetricsClientID); + if (IsReportingEnabled()) { + // We assume the embedder has no shutdown sequence, so there's no need + // for a matching Stop() call. + metrics_service_->Start(); } + + CreateUkmService(); + } else { + // Even though reporting is not enabled, CreateFileMetricsProvider() is + // called. This ensures on disk state is removed. + metrics_service_->RegisterMetricsProvider(CreateFileMetricsProvider( + pref_service_, /* metrics_reporting_enabled */ false)); + OnMetricsNotStarted(); + pref_service_->ClearPref(prefs::kMetricsClientID); } }
diff --git a/components/embedder_support/android/metrics/android_metrics_service_client.h b/components/embedder_support/android/metrics/android_metrics_service_client.h index c4e2a8a..4a193b3 100644 --- a/components/embedder_support/android/metrics/android_metrics_service_client.h +++ b/components/embedder_support/android/metrics/android_metrics_service_client.h
@@ -263,6 +263,10 @@ base::OnceClosure collect_final_metrics_for_log_closure_; base::RepeatingClosure on_final_metrics_collected_listener_; +#if DCHECK_IS_ON() + bool did_start_metrics_with_consent_ = false; +#endif + // MetricsServiceClient may be created before the UI thread is promoted to // BrowserThread::UI. Use |sequence_checker_| to enforce that the // MetricsServiceClient is used on a single thread.
diff --git a/components/embedder_support/android/metrics/android_metrics_service_client_unittest.cc b/components/embedder_support/android/metrics/android_metrics_service_client_unittest.cc index 40f1a81..85ee302 100644 --- a/components/embedder_support/android/metrics/android_metrics_service_client_unittest.cc +++ b/components/embedder_support/android/metrics/android_metrics_service_client_unittest.cc
@@ -403,6 +403,30 @@ } TEST_F(AndroidMetricsServiceClientTest, + TestBrowserMetricsDirClearedIfNoConsent) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeatureWithParameters( + base::kPersistentHistogramsFeature, {{"storage", "MappedFile"}}); + + base::FilePath metrics_dir; + ASSERT_TRUE(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &metrics_dir)); + InstantiatePersistentHistograms(metrics_dir); + base::FilePath upload_dir = metrics_dir.AppendASCII(kBrowserMetricsName); + ASSERT_TRUE(base::PathExists(upload_dir)); + + auto prefs = CreateTestPrefs(); + auto client = std::make_unique<TestClient>(); + + // Setup the client isn't in sample. + client->SetHaveMetricsConsent(/* user_consent= */ false, + /* app_consent= */ false); + client->Initialize(prefs.get()); + task_environment()->RunUntilIdle(); + + EXPECT_FALSE(base::PathExists(upload_dir)); +} + +TEST_F(AndroidMetricsServiceClientTest, TestBrowserMetricsDirExistsIfReportingEnabled) { base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeatureWithParameters(
diff --git a/components/externalauth/android/java/src/org/chromium/components/externalauth/ExternalAuthUtils.java b/components/externalauth/android/java/src/org/chromium/components/externalauth/ExternalAuthUtils.java index 4302def..422b443 100644 --- a/components/externalauth/android/java/src/org/chromium/components/externalauth/ExternalAuthUtils.java +++ b/components/externalauth/android/java/src/org/chromium/components/externalauth/ExternalAuthUtils.java
@@ -286,4 +286,12 @@ protected String describeError(final int errorCode) { return GoogleApiAvailability.getInstance().getErrorString(errorCode); } + + /** + * Sets an instance for testing. + * @param externalAuthUtils The instance to set for testing. + */ + public static void setInstanceForTesting(ExternalAuthUtils externalAuthUtils) { + sInstance = externalAuthUtils; + } }
diff --git a/components/full_restore/full_restore_read_handler.cc b/components/full_restore/full_restore_read_handler.cc index 07b49fd70..267b3b7 100644 --- a/components/full_restore/full_restore_read_handler.cc +++ b/components/full_restore/full_restore_read_handler.cc
@@ -37,6 +37,15 @@ std::move(callback))); } +void FullRestoreReadHandler::RemoveApp(const base::FilePath& profile_path, + const std::string& app_id) { + auto it = profile_path_to_restore_data_.find(profile_path); + if (it == profile_path_to_restore_data_.end()) + return; + + it->second->RemoveApp(app_id); +} + void FullRestoreReadHandler::OnGetRestoreData( const base::FilePath& profile_path, Callback callback,
diff --git a/components/full_restore/full_restore_read_handler.h b/components/full_restore/full_restore_read_handler.h index 6104189b..f531d39 100644 --- a/components/full_restore/full_restore_read_handler.h +++ b/components/full_restore/full_restore_read_handler.h
@@ -43,6 +43,10 @@ // calls |callback| when the reading operation is done. void ReadFromFile(const base::FilePath& profile_path, Callback callback); + // Removes app launching and app windows for an app with the given |app_id| + // from |profile_path_to_restore_data_| for |profile_path| . + void RemoveApp(const base::FilePath& profile_path, const std::string& app_id); + private: // Invoked when reading the restore data from |profile_path| is finished, and // calls |callback| to notify that the reading operation is done.
diff --git a/components/full_restore/full_restore_save_handler.cc b/components/full_restore/full_restore_save_handler.cc index f6b2ebcc..0c45667 100644 --- a/components/full_restore/full_restore_save_handler.cc +++ b/components/full_restore/full_restore_save_handler.cc
@@ -142,6 +142,19 @@ weak_factory_.GetWeakPtr(), profile_path)); } +void FullRestoreSaveHandler::RemoveApp(const base::FilePath& profile_path, + const std::string& app_id) { + auto it = profile_path_to_restore_data_.find(profile_path); + if (it == profile_path_to_restore_data_.end()) + return; + + it->second.RemoveApp(app_id); + + pending_save_profile_paths_.insert(profile_path); + + MaybeStartSaveTimer(); +} + void FullRestoreSaveHandler::MaybeStartSaveTimer() { if (!save_timer_.IsRunning() && save_running_.empty()) { save_timer_.Start(FROM_HERE, kSaveDelay,
diff --git a/components/full_restore/full_restore_save_handler.h b/components/full_restore/full_restore_save_handler.h index 4e6cc9ff..d1a81bd 100644 --- a/components/full_restore/full_restore_save_handler.h +++ b/components/full_restore/full_restore_save_handler.h
@@ -65,6 +65,10 @@ // data. void Flush(const base::FilePath& profile_path); + // Removes app launching and app windows for an app with the given |app_id| + // from |file_path_to_restore_data_| for |profile_path| . + void RemoveApp(const base::FilePath& profile_path, const std::string& app_id); + base::OneShotTimer* GetTimerForTesting() { return &save_timer_; } private:
diff --git a/components/history/metrics/domain_diversity_reporter.cc b/components/history/metrics/domain_diversity_reporter.cc index ef6c85f..244c69d3 100644 --- a/components/history/metrics/domain_diversity_reporter.cc +++ b/components/history/metrics/domain_diversity_reporter.cc
@@ -31,6 +31,8 @@ clock_(clock), history_service_observer_(this) { DCHECK_NE(prefs_, nullptr); + DCHECK_NE(history_service_, nullptr); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); base::SequencedTaskRunnerHandle::Get()->PostTask(
diff --git a/components/mirroring/README.md b/components/mirroring/README.md new file mode 100644 index 0000000..d8c0060 --- /dev/null +++ b/components/mirroring/README.md
@@ -0,0 +1,26 @@ +# //components/mirroring + +Service implementation and browser integration for Cast Mirroring. + +The Mirroring Service is run in its own sandboxed process. It uses mojo +message pipes between its process and the privileged browser process to: + + * acquire inputs, such as screen capture video or tab audio capture. + * communicate with remote Cast devices using Cast Channel messaging. See `../cast_channel/`. + * open UDP network sockets for Cast Streaming packets. + * switch between screen mirroring and content remoting modes. + +The Service contains all session-management logic, and also interfaces with +`../../media/cast/` to encode and packetize media in realtime. + +Specification: *TODO(jophba): Link to Cast Spec markdown.* + +# Directory Breakdown + +* browser/ - Browser-side implementation. Also, more can be found in + `../../chrome/browser/media/cast_mirroring_service_host.h` and + `../../chrome/browser/media/router/providers/cast/`. + +* mojom/ - Mojo interfaces. + +* service/ - Mirroring Service implementation, as described above.
diff --git a/components/payments/content/android/java_templates/ErrorStrings.java.tmpl b/components/payments/content/android/java_templates/ErrorStrings.java.tmpl index eaf67b2..1908867 100644 --- a/components/payments/content/android/java_templates/ErrorStrings.java.tmpl +++ b/components/payments/content/android/java_templates/ErrorStrings.java.tmpl
@@ -30,6 +30,8 @@ public static final String CONTEXT_NOT_FOUND = "Unable to find Chrome context."; + public static final String TAB_NOT_FOUND = "Unable to find Chrome tab."; + public static final String WINDOW_NOT_FOUND = "Unable to find Chrome window."; public static final String PAYMENT_APP_INVALID_RESPONSE = "Payment app response is not valid.";
diff --git a/components/performance_manager/public/mojom/web_memory.mojom b/components/performance_manager/public/mojom/web_memory.mojom index 7b3888b..b3110b1 100644 --- a/components/performance_manager/public/mojom/web_memory.mojom +++ b/components/performance_manager/public/mojom/web_memory.mojom
@@ -47,13 +47,21 @@ string? id; }; +// The amount of memory used by a breakdown. +struct WebMemoryUsage { + uint64 bytes; +}; + // Describes a memory region and attributes it to a set of contexts. // Usually the set consists of a single context. If there are multiple // contexts then this means that the memory may be owned by any of them. struct WebMemoryBreakdownEntry { - uint64 bytes; - array<WebMemoryAttribution> attribution; + // The memory used in this breakdown. It is null for breakdowns that did not + // have a memory measurement (for example a frame that was added after the + // measurement started). + WebMemoryUsage? memory; + array<WebMemoryAttribution> attribution; // TODO(1085129): Add memory types once they are implemented. };
diff --git a/components/performance_manager/v8_memory/v8_memory_test_helpers.cc b/components/performance_manager/v8_memory/v8_memory_test_helpers.cc index d73875e..89eb97b 100644 --- a/components/performance_manager/v8_memory/v8_memory_test_helpers.cc +++ b/components/performance_manager/v8_memory/v8_memory_test_helpers.cc
@@ -19,6 +19,7 @@ #include "components/performance_manager/graph/process_node_impl.h" #include "components/performance_manager/public/mojom/v8_contexts.mojom.h" #include "components/performance_manager/public/performance_manager.h" +#include "components/performance_manager/v8_memory/v8_context_tracker.h" #include "content/public/browser/render_process_host.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" @@ -226,6 +227,7 @@ GetGraphFeaturesHelper().EnableV8ContextTracker(); Super::SetUp(); process_ = CreateNode<ProcessNodeImpl>(); + other_process_ = CreateNode<ProcessNodeImpl>(); pages_.push_back(CreateNode<PageNodeImpl>()); } @@ -239,6 +241,7 @@ Bytes memory_usage, FrameNodeImpl* parent, FrameNodeImpl* opener, + ProcessNodeImpl* process, base::Optional<std::string> id_attribute, base::Optional<std::string> src_attribute) { // If there's an opener, the new frame is also a new page. @@ -252,14 +255,16 @@ int frame_tree_node_id = GetNextUniqueId(); int frame_routing_id = GetNextUniqueId(); auto frame_token = blink::LocalFrameToken(); - auto frame = CreateNode<FrameNodeImpl>(process_.get(), page, parent, + auto frame = CreateNode<FrameNodeImpl>(process, page, parent, frame_tree_node_id, frame_routing_id, frame_token, browsing_instance_id); if (url) { frame->OnNavigationCommitted(GURL(*url), /*same document*/ true); } - V8DetailedMemoryExecutionContextData::CreateForTesting(frame.get()) - ->set_v8_bytes_used(memory_usage.bytes); + if (memory_usage) { + V8DetailedMemoryExecutionContextData::CreateForTesting(frame.get()) + ->set_v8_bytes_used(memory_usage.value()); + } frames_.push_back(std::move(frame)); FrameNodeImpl* frame_impl = frames_.back().get(); @@ -284,9 +289,20 @@ DCHECK(!id_attribute); DCHECK(!src_attribute); } + + // If the frame is in the same process as its parent include the attribution + // in OnV8ContextCreated, otherwise it must be attached separately with + // OnRemoteIframeAttached. DCHECK(frame_impl->process_node()); - frame_impl->process_node()->OnV8ContextCreated(std::move(description), - std::move(attribution)); + if (parent && parent->process_node() != frame_impl->process_node()) { + frame_impl->process_node()->OnV8ContextCreated( + std::move(description), mojom::IframeAttributionDataPtr()); + V8ContextTracker::GetFromGraph(graph())->OnRemoteIframeAttachedForTesting( + frame_impl, parent, blink::RemoteFrameToken(), std::move(attribution)); + } else { + frame_impl->process_node()->OnV8ContextCreated(std::move(description), + std::move(attribution)); + } return frame_impl; }
diff --git a/components/performance_manager/v8_memory/v8_memory_test_helpers.h b/components/performance_manager/v8_memory/v8_memory_test_helpers.h index fdae0c8..90810172 100644 --- a/components/performance_manager/v8_memory/v8_memory_test_helpers.h +++ b/components/performance_manager/v8_memory/v8_memory_test_helpers.h
@@ -225,10 +225,7 @@ using Super = GraphTestHarness; // Wrapper for memory usage bytes to improve test readability. - struct Bytes { - uint64_t bytes; - bool operator==(const Bytes& other) const { return bytes == other.bytes; } - }; + using Bytes = base::Optional<uint64_t>; WebMemoryTestHarness(); ~WebMemoryTestHarness() override; @@ -243,7 +240,8 @@ base::Optional<std::string> id_attribute = base::nullopt, base::Optional<std::string> src_attribute = base::nullopt) { return AddFrameNodeImpl(url, kDefaultBrowsingInstanceId, bytes, parent, - /*opener=*/nullptr, id_attribute, src_attribute); + /*opener=*/nullptr, process_.get(), id_attribute, + src_attribute); } // Creates a frame node as if from window.open and adds it to the graph. @@ -251,7 +249,9 @@ Bytes bytes, FrameNodeImpl* opener) { return AddFrameNodeImpl(url, kDefaultBrowsingInstanceId, bytes, - /*parent=*/nullptr, opener); + /*parent=*/nullptr, opener, process_.get(), + /*id_attribute=*/base::nullopt, + /*src_attribute=*/base::nullopt); } // Creates a frame node in a different browsing instance and adds it to the @@ -263,7 +263,8 @@ base::Optional<std::string> id_attribute = base::nullopt, base::Optional<std::string> src_attribute = base::nullopt) { return AddFrameNodeImpl(url, kDefaultBrowsingInstanceId + 1, bytes, parent, - /*opener=*/nullptr, id_attribute, src_attribute); + /*opener=*/nullptr, process_.get(), id_attribute, + src_attribute); } // Creates a frame node in a different browsing instance as if from @@ -273,7 +274,21 @@ Bytes bytes, FrameNodeImpl* opener) { return AddFrameNodeImpl(url, kDefaultBrowsingInstanceId + 1, bytes, - /*parent=*/nullptr, opener); + /*parent=*/nullptr, opener, process_.get(), + /*id_attribute=*/base::nullopt, + /*src_attribute=*/base::nullopt); + } + + // Creates a frame node in a different process and adds it to the graph. + FrameNodeImpl* AddCrossProcessFrameNode( + std::string url, + Bytes bytes, + FrameNodeImpl* parent, + base::Optional<std::string> id_attribute = base::nullopt, + base::Optional<std::string> src_attribute = base::nullopt) { + return AddFrameNodeImpl(url, kDefaultBrowsingInstanceId, bytes, parent, + /*opener=*/nullptr, other_process_.get(), + id_attribute, src_attribute); } ProcessNode* process_node() const { return process_.get(); } @@ -282,16 +297,17 @@ static constexpr int kDefaultBrowsingInstanceId = 0; // Creates and adds a new frame node to the graph. - FrameNodeImpl* AddFrameNodeImpl( - base::Optional<std::string> url, - int browsing_instance_id, - Bytes bytes, - FrameNodeImpl* parent = nullptr, - FrameNodeImpl* opener = nullptr, - base::Optional<std::string> id_attribute = base::nullopt, - base::Optional<std::string> src_attribute = base::nullopt); + FrameNodeImpl* AddFrameNodeImpl(base::Optional<std::string> url, + int browsing_instance_id, + Bytes bytes, + FrameNodeImpl* parent, + FrameNodeImpl* opener, + ProcessNodeImpl* process, + base::Optional<std::string> id_attribute, + base::Optional<std::string> src_attribute); int GetNextUniqueId(); TestNodeWrapper<ProcessNodeImpl> process_; + TestNodeWrapper<ProcessNodeImpl> other_process_; std::vector<TestNodeWrapper<PageNodeImpl>> pages_; std::vector<TestNodeWrapper<FrameNodeImpl>> frames_; int next_unique_id_ = 0;
diff --git a/components/performance_manager/v8_memory/web_memory_aggregator.cc b/components/performance_manager/v8_memory/web_memory_aggregator.cc index ebd5529..845cc36 100644 --- a/components/performance_manager/v8_memory/web_memory_aggregator.cc +++ b/components/performance_manager/v8_memory/web_memory_aggregator.cc
@@ -141,13 +141,6 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); aggregation_result_ = mojom::WebMemoryMeasurement::New(); VisitFrame(nullptr, aggregation_start_node_); - - // Don't report breakdowns without any memory use. - base::EraseIf(aggregation_result_->breakdown, - [](const mojom::WebMemoryBreakdownEntryPtr& entry) { - return entry->bytes == 0; - }); - return std::move(aggregation_result_); } @@ -221,7 +214,18 @@ DCHECK(aggregation_point); if (auto* frame_data = V8DetailedMemoryExecutionContextData::ForFrameNode(frame_node)) { - aggregation_point->bytes += frame_data->v8_bytes_used(); + if (!aggregation_point->memory) { + aggregation_point->memory = mojom::WebMemoryUsage::New(); + } + + // Ensure this frame is actually in the same process as the requesting + // frame. If not it should be considered to have 0 bytes. + // (https://github.com/WICG/performance-measure-memory/issues/20). + uint64_t bytes_used = (frame_node->GetProcessNode() == + aggregation_start_node_->GetProcessNode()) + ? frame_data->v8_bytes_used() + : 0; + aggregation_point->memory->bytes += bytes_used; } // Recurse into children and opened pages. This node's aggregation point @@ -269,10 +273,16 @@ // Follow parent and opener links to find the most general same-site node to // start the aggregation traversal from. - const FrameNode* start_node = requesting_node; - while (auto* parent_or_opener = - GetSameOriginParentOrOpener(start_node, requesting_origin)) { - start_node = parent_or_opener; + const FrameNode* start_node = nullptr; + for (auto* parent_or_opener = requesting_node; parent_or_opener; + parent_or_opener = + GetSameOriginParentOrOpener(parent_or_opener, requesting_origin)) { + // Only consider nodes in the same process as potential start nodes. + // (https://github.com/WICG/performance-measure-memory/issues/20). + if (parent_or_opener->GetProcessNode() == + requesting_node->GetProcessNode()) { + start_node = parent_or_opener; + } } DCHECK(start_node);
diff --git a/components/performance_manager/v8_memory/web_memory_aggregator_unittest.cc b/components/performance_manager/v8_memory/web_memory_aggregator_unittest.cc index c41f2c9..0590a640 100644 --- a/components/performance_manager/v8_memory/web_memory_aggregator_unittest.cc +++ b/components/performance_manager/v8_memory/web_memory_aggregator_unittest.cc
@@ -30,7 +30,7 @@ using WebMemoryAggregatorTest = WebMemoryTestHarness; struct ExpectedMemoryBreakdown { - uint64_t bytes = 0U; + WebMemoryTestHarness::Bytes bytes; AttributionScope scope = AttributionScope::kWindow; base::Optional<std::string> url; base::Optional<std::string> id; @@ -38,7 +38,7 @@ ExpectedMemoryBreakdown() = default; ExpectedMemoryBreakdown( - uint64_t expected_bytes, + WebMemoryTestHarness::Bytes expected_bytes, AttributionScope expected_scope, base::Optional<std::string> expected_url = base::nullopt, base::Optional<std::string> expected_id = base::nullopt, @@ -59,7 +59,10 @@ auto expected_measurement = mojom::WebMemoryMeasurement::New(); for (const auto& breakdown : breakdowns) { auto expected_breakdown = mojom::WebMemoryBreakdownEntry::New(); - expected_breakdown->bytes = breakdown.bytes; + if (breakdown.bytes) { + expected_breakdown->memory = mojom::WebMemoryUsage::New(); + expected_breakdown->memory->bytes = breakdown.bytes.value(); + } auto attribution = mojom::WebMemoryAttribution::New(); attribution->scope = breakdown.scope; @@ -129,15 +132,18 @@ internal::CopyBreakdownAttribution(breakdown_with_url, breakdown_with_empty_url); - // All measurements should be created with 0 bytes. + // All measurements should be created without measurement results. auto expected_result = CreateExpectedMemoryMeasurement({ - ExpectedMemoryBreakdown(0, AttributionScope::kCrossOriginAggregated, + ExpectedMemoryBreakdown(/*bytes=*/base::nullopt, + AttributionScope::kCrossOriginAggregated, /*expected_url=*/base::nullopt, /*expected_id=*/base::nullopt, /*expected_src=*/base::nullopt), - ExpectedMemoryBreakdown(0, AttributionScope::kWindow, + ExpectedMemoryBreakdown(/*bytes=*/base::nullopt, + AttributionScope::kWindow, "https://example.com", attribute, attribute), - ExpectedMemoryBreakdown(0, AttributionScope::kWindow, + ExpectedMemoryBreakdown(/*bytes=*/base::nullopt, + AttributionScope::kWindow, /*expected_url=*/"", attribute, attribute), }); EXPECT_EQ(MeasurementToJSON(measurement), @@ -293,10 +299,21 @@ AddFrameNode("https://example.com/iframe3", Bytes{6}, subframe3, "example-id6", "https://example.com/iframe3"); - // A frame with 0 bytes of memory use (eg. a frame that's added to the frame - // tree during the measurement) should not appear in the result. + // To test aggregation all the frames above are in the same process, even + // though in production frames with different origins will be in different + // processes whenever possible. Frames in a different process from the + // requesting frame should all have 0 bytes reported. + FrameNodeImpl* cross_process_frame = + AddCrossProcessFrameNode("https://example.com/cross_process", Bytes{100}, + subframe3, "cross-process-id1"); + FrameNodeImpl* cross_process_frame2 = + AddCrossProcessFrameNode("https://foo.com/cross_process", Bytes{200}, + subframe3, "cross-process-id2"); + + // A frame without a memory measurement (eg. a frame that's added to the frame + // tree during the measurement) should not have a memory entry in the result. FrameNodeImpl* empty_frame = - AddFrameNode("https://example.com/empty_frame", Bytes{0}, subframe3); + AddFrameNode("https://example.com/empty_frame", base::nullopt, subframe3); EXPECT_EQ(internal::FindAggregationStartNode(main_frame), main_frame); WebMemoryAggregator aggregator(main_frame); @@ -339,6 +356,16 @@ EXPECT_EQ(internal::GetSameOriginParentOrOpener( empty_frame, aggregator.requesting_origin()), subframe3); + EXPECT_EQ(aggregator.FindNodeAggregationType(cross_process_frame), + NodeAggregationType::kSameOriginAggregationPoint); + EXPECT_EQ(internal::GetSameOriginParentOrOpener( + cross_process_frame, aggregator.requesting_origin()), + subframe3); + EXPECT_EQ(aggregator.FindNodeAggregationType(cross_process_frame2), + NodeAggregationType::kCrossOriginAggregationPoint); + EXPECT_EQ(internal::GetSameOriginParentOrOpener( + cross_process_frame2, aggregator.requesting_origin()), + subframe3); auto expected_result = CreateExpectedMemoryMeasurement({ ExpectedMemoryBreakdown(10, AttributionScope::kWindow, @@ -358,6 +385,13 @@ ExpectedMemoryBreakdown(6, AttributionScope::kWindow, "https://example.com/iframe3", "example-id6", "https://example.com/iframe3"), + ExpectedMemoryBreakdown(0, AttributionScope::kWindow, + "https://example.com/cross_process", + "cross-process-id1"), + ExpectedMemoryBreakdown(0, AttributionScope::kCrossOriginAggregated, + base::nullopt, "cross-process-id2"), + ExpectedMemoryBreakdown(base::nullopt, AttributionScope::kWindow, + "https://example.com/empty_frame"), }); auto result = aggregator.AggregateMeasureMemoryResult(); EXPECT_EQ(MeasurementToJSON(result), MeasurementToJSON(expected_result)); @@ -407,6 +441,29 @@ MeasurementToJSON(main_frame_expected_result)); } +TEST_F(WebMemoryAggregatorTest, FindCrossProcessAggregationStartNode) { + FrameNodeImpl* main_frame = AddFrameNode("https://example.com/", Bytes{1}); + FrameNodeImpl* cross_process_child = AddCrossProcessFrameNode( + "https://example.com/cross_process.html", Bytes{2}, main_frame); + FrameNodeImpl* same_process_child = AddFrameNode( + "https://example.com/same_process.html", Bytes{3}, cross_process_child); + + auto origin = url::Origin::Create(GURL("https://example.com")); + ASSERT_EQ(internal::GetSameOriginParentOrOpener(cross_process_child, origin), + main_frame); + ASSERT_EQ(internal::GetSameOriginParentOrOpener(same_process_child, origin), + cross_process_child); + + // |cross_process_child| has no ancestor in the same process as it. + EXPECT_EQ(internal::FindAggregationStartNode(cross_process_child), + cross_process_child); + + // The search starting from |same_process_child| should skip over + // |cross_process_child|, which is in a different process, and find + // |main_frame| which is in the same process. + EXPECT_EQ(internal::FindAggregationStartNode(same_process_child), main_frame); +} + TEST_F(WebMemoryAggregatorTest, AggregateWindowOpener) { FrameNodeImpl* main_frame = AddFrameNode("https://example.com/", Bytes{10}); FrameNodeImpl* child_frame = AddFrameNode("https://example.com/iframe.html",
diff --git a/components/performance_manager/v8_memory/web_memory_impl_unittest.cc b/components/performance_manager/v8_memory/web_memory_impl_unittest.cc index d2dc784..a9718ace 100644 --- a/components/performance_manager/v8_memory/web_memory_impl_unittest.cc +++ b/components/performance_manager/v8_memory/web_memory_impl_unittest.cc
@@ -70,12 +70,13 @@ base::flat_map<std::string, Bytes> actual; for (const auto& entry : result->breakdown) { EXPECT_EQ(1u, entry->attribution.size()); - if (mojom::WebMemoryAttribution::Scope::kWindow == - entry->attribution[0]->scope) { - actual[*entry->attribution[0]->url] = Bytes{entry->bytes}; - } else { - actual[*entry->attribution[0]->src] = Bytes{entry->bytes}; - } + std::string attribution_tag = + (mojom::WebMemoryAttribution::Scope::kWindow == + entry->attribution[0]->scope) + ? *entry->attribution[0]->url + : *entry->attribution[0]->src; + actual[attribution_tag] = + entry->memory ? Bytes{entry->memory->bytes} : base::nullopt; } EXPECT_EQ(expected, actual); measurement_done = true; @@ -130,7 +131,8 @@ const auto& entry = result->breakdown[0]; EXPECT_EQ(1u, entry->attribution.size()); EXPECT_EQ(kMainFrameUrl, *(entry->attribution[0]->url)); - EXPECT_EQ(1001u, entry->bytes); + ASSERT_TRUE(entry->memory); + EXPECT_EQ(1001u, entry->memory->bytes); run_loop.Quit(); }); auto bad_message_callback =
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index 34e189b..cf783a3 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -363,6 +363,7 @@ // google/chromeos/user => ChromeSettingsProto // google/chromeos/publicaccount => ChromeSettingsProto // google/chrome/machine-level-user => ChromeSettingsProto + // google/chrome/machine-level-user-ios => ChromeSettingsProto // google/chrome/extension => ExternalPolicyData // google/chrome/machine-level-extension => ExternalPolicyData // google/chromeos/signinextension => ExternalPolicyData
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 08019f5..89fd395 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -10482,11 +10482,11 @@ 'id': 151, 'caption': '''Enable or disable spell checking web service''', 'tags': [], - 'desc': '''<ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> can use a Google web service to help resolve spelling errors. If this setting is enabled, then this service is always used. If this setting is disabled, then this service is never used. + 'desc': '''Setting the policy to Enabled puts a Google web service in use to help resolve spelling errors. This policy only controls the use of the online service. Setting the policy to Disabled means this service is never used. - Spell checking can still be performed using a downloaded dictionary; this policy only controls the usage of the online service. + Leaving the policy unset lets users choose whether to use the spellcheck service. - If this setting is not configured then users can choose whether the spell checking service should be used or not.''', + The spell check can always use a downloaded dictionary locally unless the feature is disabled by <ph name="SPELLCHECK_ENABLED_POLICY_NAME">SpellcheckEnabled</ph> in which case this policy will have no effect.''', }, { 'name': 'ExternalStorageDisabled', @@ -17653,12 +17653,11 @@ 'id': 408, 'caption': '''Enable spellcheck''', 'tags': [], - 'desc': '''If this policy is not set, the user can enable or disable spellcheck in the language settings. + 'desc': '''Setting the policy to Enabled turns spellcheck on, and users can't turn it off. On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> and <ph name="LINUX_OS_NAME">Linux®</ph>, spellcheck languages can be switched on or off individually, so users can still turn spellcheck off by switching off every spellcheck language. To avoid that, use the <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME">SpellcheckLanguage</ph> to force-enable specific spellcheck languages. - If this policy is set to true, spellcheck is enabled and the user cannot disable it. On <ph name="MS_WIN_NAME">Microsoft® Windows</ph>, <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> and <ph name="LINUX_OS_NAME">Linux</ph>, spellcheck languages can be individually toggled on or off, so the user can still effectively disable spellcheck by toggling off every spellcheck language. To avoid that, the <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME">SpellcheckLanguage</ph> policy can be used to force specific spellcheck languages to be enabled. + Setting the policy to Disabled turns off spellcheck from all sources, and users can't turn it on. The <ph name="SPELL_CHECK_SERVICE_ENABLED_POLICY_NAME">SpellCheckServiceEnabled</ph>, <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME">SpellcheckLanguage</ph> and <ph name="SPELLCHECK_LANGUAGE_BLOCKLIST_POLICY_NAME">SpellcheckLanguageBlocklist</ph> policies have no effect when this policy is set to False. - If this policy is set to false, spellcheck is disabled and the user cannot enable it. The <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME">SpellcheckLanguage</ph> and <ph name="SPELLCHECK_LANGUAGE_BLACKLIST_POLICY_NAME">SpellcheckLanguageBlacklist</ph> policies have no effect when this policy is set to false. - ''' + Leaving the policy unset lets users turn spellcheck on or off in the language settings. ''' }, { 'name': 'AdsSettingForIntrusiveAdsSites',
diff --git a/components/reading_list/core/reading_list_pref_names.cc b/components/reading_list/core/reading_list_pref_names.cc index 9e43435..08da77f0 100644 --- a/components/reading_list/core/reading_list_pref_names.cc +++ b/components/reading_list/core/reading_list_pref_names.cc
@@ -11,5 +11,11 @@ // device. Not synced. const char kReadingListHasUnseenEntries[] = "reading_list.has_unseen_entries"; +#if !defined(OS_ANDROID) && !defined(OS_IOS) +// Boolean to track if the first-use experience has been shown on desktop. +const char kReadingListDesktopFirstUseExperienceShown[] = + "reading_list.desktop_first_use_experience_shown"; +#endif // !defined(OS_ANDROID) && !defined(OS_IOS) + } // namespace prefs } // namespace reading_list
diff --git a/components/reading_list/core/reading_list_pref_names.h b/components/reading_list/core/reading_list_pref_names.h index 997da56..76a8f76 100644 --- a/components/reading_list/core/reading_list_pref_names.h +++ b/components/reading_list/core/reading_list_pref_names.h
@@ -7,11 +7,17 @@ #ifndef COMPONENTS_READING_LIST_CORE_READING_LIST_PREF_NAMES_H_ #define COMPONENTS_READING_LIST_CORE_READING_LIST_PREF_NAMES_H_ +#include "build/build_config.h" + namespace reading_list { namespace prefs { extern const char kReadingListHasUnseenEntries[]; +#if !defined(OS_ANDROID) && !defined(OS_IOS) +extern const char kReadingListDesktopFirstUseExperienceShown[]; +#endif // !defined(OS_ANDROID) && !defined(OS_IOS) + } // namespace prefs } // namespace reading_list
diff --git a/components/safe_browsing/core/browser/BUILD.gn b/components/safe_browsing/core/browser/BUILD.gn index 7d110830..c7dba7f 100644 --- a/components/safe_browsing/core/browser/BUILD.gn +++ b/components/safe_browsing/core/browser/BUILD.gn
@@ -77,28 +77,7 @@ } source_set("token_fetcher") { - sources = [ - "safe_browsing_token_fetcher.cc", - "safe_browsing_token_fetcher.h", - ] + sources = [ "safe_browsing_token_fetcher.h" ] - deps = [ - "//base", - "//components/safe_browsing/core/common:thread_utils", - "//components/signin/public/identity_manager", - "//google_apis", - ] -} - -source_set("token_fetcher_unittest") { - testonly = true - sources = [ "safe_browsing_token_fetcher_unittest.cc" ] - - deps = [ - ":token_fetcher", - "//base/test:test_support", - "//components/safe_browsing/core/common:test_support", - "//components/signin/public/identity_manager:test_support", - "//testing/gtest", - ] + deps = [ "//base" ] }
diff --git a/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h b/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h index de5f5a8..13fab0f4 100644 --- a/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h +++ b/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h
@@ -5,65 +5,24 @@ #ifndef COMPONENTS_SAFE_BROWSING_CORE_BROWSER_SAFE_BROWSING_TOKEN_FETCHER_H_ #define COMPONENTS_SAFE_BROWSING_CORE_BROWSER_SAFE_BROWSING_TOKEN_FETCHER_H_ -#include <memory> - #include "base/callback.h" -#include "base/containers/flat_map.h" -#include "base/memory/weak_ptr.h" -#include "base/optional.h" -#include "components/signin/public/identity_manager/access_token_info.h" -#include "components/signin/public/identity_manager/consent_level.h" -#include "google_apis/gaia/google_service_auth_error.h" - -namespace signin { -class IdentityManager; -class AccessTokenFetcher; -} // namespace signin namespace safe_browsing { -// This class is used to fetch access tokens for communcations with Safe -// Browsing. It asynchronously returns the access token for the current -// primary account, or nullopt if an error occurred. This must be -// run on the UI thread. +// This interface is used to fetch access tokens for communcations with Safe +// Browsing. It asynchronously returns an access token for the current account +// (as determined in concrete implementations), or the empty string if no access +// token is available (e.g., an error occurred). +// This must be run on the UI thread. class SafeBrowsingTokenFetcher { public: - using Callback = - base::OnceCallback<void(base::Optional<signin::AccessTokenInfo>)>; + using Callback = base::OnceCallback<void(const std::string& access_token)>; - // Create a SafeBrowsingTokenFetcher for the primary account of - // |identity_manager|. |identity_manager| is unowned, and must outlive this - // object. - explicit SafeBrowsingTokenFetcher(signin::IdentityManager* identity_manager); + virtual ~SafeBrowsingTokenFetcher() = default; - ~SafeBrowsingTokenFetcher(); - - // Begin fetching a token for the account with the given |consent_level|. The + // Begin fetching a token for the account. The // result will be returned in |callback|. Must be called on the UI thread. - void Start(signin::ConsentLevel consent_level, Callback callback); - - private: - void OnTokenFetched(int request_id, - GoogleServiceAuthError error, - signin::AccessTokenInfo access_token_info); - void OnTokenTimeout(int request_id); - void Finish(int request_id, - base::Optional<signin::AccessTokenInfo> token_info); - - // Reference to the identity manager to fetch from. - signin::IdentityManager* identity_manager_; - - // The count of requests sent. This is used as an ID for requests. - int requests_sent_; - - // Active fetchers, keyed by ID. - base::flat_map<int, std::unique_ptr<signin::AccessTokenFetcher>> - token_fetchers_; - - // Active callbacks, keyed by ID. - base::flat_map<int, Callback> callbacks_; - - base::WeakPtrFactory<SafeBrowsingTokenFetcher> weak_ptr_factory_; + virtual void Start(Callback callback) = 0; }; } // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/safe_browsing_token_fetcher_unittest.cc b/components/safe_browsing/core/browser/safe_browsing_token_fetcher_unittest.cc deleted file mode 100644 index 77137ed9..0000000 --- a/components/safe_browsing/core/browser/safe_browsing_token_fetcher_unittest.cc +++ /dev/null
@@ -1,103 +0,0 @@ -// Copyright 2020 The Chromium 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/safe_browsing/core/browser/safe_browsing_token_fetcher.h" -#include <memory> - -#include "base/run_loop.h" -#include "base/test/task_environment.h" -#include "components/safe_browsing/core/common/test_task_environment.h" -#include "components/signin/public/identity_manager/identity_test_environment.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace safe_browsing { - -class SafeBrowsingTokenFetcherTest : public ::testing::Test { - public: - SafeBrowsingTokenFetcherTest() - : task_environment_(CreateTestTaskEnvironment()) {} - - protected: - std::unique_ptr<base::test::TaskEnvironment> task_environment_; - signin::IdentityTestEnvironment identity_test_environment_; -}; - -TEST_F(SafeBrowsingTokenFetcherTest, Success) { - identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable( - "test@example.com"); - base::Optional<signin::AccessTokenInfo> maybe_account_info; - SafeBrowsingTokenFetcher fetcher( - identity_test_environment_.identity_manager()); - fetcher.Start(signin::ConsentLevel::kNotRequired, - base::BindOnce( - [](base::Optional<signin::AccessTokenInfo>* target_info, - base::Optional<signin::AccessTokenInfo> info) { - *target_info = info; - }, - &maybe_account_info)); - identity_test_environment_ - .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( - "token", base::Time::Now()); - ASSERT_TRUE(maybe_account_info.has_value()); - EXPECT_EQ(maybe_account_info.value().token, "token"); -} - -TEST_F(SafeBrowsingTokenFetcherTest, Failure) { - identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable( - "test@example.com"); - base::Optional<signin::AccessTokenInfo> maybe_account_info; - SafeBrowsingTokenFetcher fetcher( - identity_test_environment_.identity_manager()); - fetcher.Start(signin::ConsentLevel::kNotRequired, - base::BindOnce( - [](base::Optional<signin::AccessTokenInfo>* target_info, - base::Optional<signin::AccessTokenInfo> info) { - *target_info = info; - }, - &maybe_account_info)); - identity_test_environment_ - .WaitForAccessTokenRequestIfNecessaryAndRespondWithError( - GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED)); - ASSERT_FALSE(maybe_account_info.has_value()); -} - -TEST_F(SafeBrowsingTokenFetcherTest, NoSyncingAccount) { - identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable( - "test@example.com"); - base::Optional<signin::AccessTokenInfo> maybe_account_info; - SafeBrowsingTokenFetcher fetcher( - identity_test_environment_.identity_manager()); - fetcher.Start(signin::ConsentLevel::kSync, - base::BindOnce( - [](base::Optional<signin::AccessTokenInfo>* target_info, - base::Optional<signin::AccessTokenInfo> info) { - *target_info = info; - }, - &maybe_account_info)); - identity_test_environment_ - .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( - "token", base::Time::Now()); - ASSERT_FALSE(maybe_account_info.has_value()); -} - -TEST_F(SafeBrowsingTokenFetcherTest, SyncSuccess) { - identity_test_environment_.MakePrimaryAccountAvailable("test@example.com"); - base::Optional<signin::AccessTokenInfo> maybe_account_info; - SafeBrowsingTokenFetcher fetcher( - identity_test_environment_.identity_manager()); - fetcher.Start(signin::ConsentLevel::kSync, - base::BindOnce( - [](base::Optional<signin::AccessTokenInfo>* target_info, - base::Optional<signin::AccessTokenInfo> info) { - *target_info = info; - }, - &maybe_account_info)); - identity_test_environment_ - .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( - "token", base::Time::Now()); - ASSERT_TRUE(maybe_account_info.has_value()); - EXPECT_EQ(maybe_account_info.value().token, "token"); -} - -} // namespace safe_browsing
diff --git a/components/safe_browsing/core/browser/sync/BUILD.gn b/components/safe_browsing/core/browser/sync/BUILD.gn new file mode 100644 index 0000000..68a0503 --- /dev/null +++ b/components/safe_browsing/core/browser/sync/BUILD.gn
@@ -0,0 +1,33 @@ +# Copyright 2021 The Chromium 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("sync") { + sources = [ + "safe_browsing_primary_account_token_fetcher.cc", + "safe_browsing_primary_account_token_fetcher.h", + ] + + deps = [ + "//base", + "//components/safe_browsing/core/browser:token_fetcher", + "//components/safe_browsing/core/common:thread_utils", + "//components/signin/public/identity_manager", + "//google_apis", + ] +} + +source_set("unittests") { + testonly = true + sources = [ "safe_browsing_primary_account_token_fetcher_unittest.cc" ] + + deps = [ + ":sync", + "//base/test:test_support", + "//components/safe_browsing/core/common:test_support", + "//components/signin/public/identity_manager:test_support", + "//testing/gtest", + ] +}
diff --git a/components/safe_browsing/core/browser/sync/README.md b/components/safe_browsing/core/browser/sync/README.md new file mode 100644 index 0000000..6f45bc4 --- /dev/null +++ b/components/safe_browsing/core/browser/sync/README.md
@@ -0,0 +1 @@ +Holds touchpoints for safe_browsing's integration with signin and sync.
diff --git a/components/safe_browsing/core/browser/safe_browsing_token_fetcher.cc b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc similarity index 67% rename from components/safe_browsing/core/browser/safe_browsing_token_fetcher.cc rename to components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc index 97a18d0c..f2e12675 100644 --- a/components/safe_browsing/core/browser/safe_browsing_token_fetcher.cc +++ b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.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 "components/safe_browsing/core/browser/safe_browsing_token_fetcher.h" +#include "components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h" #include "base/bind.h" #include "base/memory/weak_ptr.h" @@ -33,7 +33,7 @@ } // namespace -SafeBrowsingTokenFetcher::SafeBrowsingTokenFetcher( +SafeBrowsingPrimaryAccountTokenFetcher::SafeBrowsingPrimaryAccountTokenFetcher( signin::IdentityManager* identity_manager) : identity_manager_(identity_manager), requests_sent_(0), @@ -41,54 +41,56 @@ DCHECK(CurrentlyOnThread(ThreadID::UI)); } -SafeBrowsingTokenFetcher::~SafeBrowsingTokenFetcher() { +SafeBrowsingPrimaryAccountTokenFetcher:: + ~SafeBrowsingPrimaryAccountTokenFetcher() { for (auto& id_and_callback : callbacks_) { - std::move(id_and_callback.second).Run(base::nullopt); + std::move(id_and_callback.second).Run(std::string()); } } -void SafeBrowsingTokenFetcher::Start(signin::ConsentLevel consent_level, - Callback callback) { +void SafeBrowsingPrimaryAccountTokenFetcher::Start( + Callback callback) { DCHECK(CurrentlyOnThread(ThreadID::UI)); const int request_id = requests_sent_; requests_sent_++; - CoreAccountId account_id = - identity_manager_->GetPrimaryAccountId(consent_level); + CoreAccountId account_id = identity_manager_->GetPrimaryAccountId( + signin::ConsentLevel::kNotRequired); callbacks_[request_id] = std::move(callback); token_fetchers_[request_id] = identity_manager_->CreateAccessTokenFetcherForAccount( account_id, "safe_browsing_service", {kAPIScope}, - base::BindOnce(&SafeBrowsingTokenFetcher::OnTokenFetched, - weak_ptr_factory_.GetWeakPtr(), request_id), + base::BindOnce( + &SafeBrowsingPrimaryAccountTokenFetcher::OnTokenFetched, + weak_ptr_factory_.GetWeakPtr(), request_id), signin::AccessTokenFetcher::Mode::kImmediate); base::PostDelayedTask( FROM_HERE, CreateTaskTraits(ThreadID::UI), - base::BindOnce(&SafeBrowsingTokenFetcher::OnTokenTimeout, + base::BindOnce(&SafeBrowsingPrimaryAccountTokenFetcher::OnTokenTimeout, weak_ptr_factory_.GetWeakPtr(), request_id), base::TimeDelta::FromMilliseconds(kTimeoutDelayFromMilliseconds)); } -void SafeBrowsingTokenFetcher::OnTokenFetched( +void SafeBrowsingPrimaryAccountTokenFetcher::OnTokenFetched( int request_id, GoogleServiceAuthError error, signin::AccessTokenInfo access_token_info) { UMA_HISTOGRAM_ENUMERATION("SafeBrowsing.TokenFetcher.ErrorType", error.state(), GoogleServiceAuthError::NUM_STATES); if (error.state() == GoogleServiceAuthError::NONE) - Finish(request_id, access_token_info); + Finish(request_id, access_token_info.token); else - Finish(request_id, base::nullopt); + Finish(request_id, std::string()); } -void SafeBrowsingTokenFetcher::OnTokenTimeout(int request_id) { - Finish(request_id, base::nullopt); +void SafeBrowsingPrimaryAccountTokenFetcher::OnTokenTimeout(int request_id) { + Finish(request_id, std::string()); } -void SafeBrowsingTokenFetcher::Finish( +void SafeBrowsingPrimaryAccountTokenFetcher::Finish( int request_id, - base::Optional<signin::AccessTokenInfo> token_info) { + const std::string& access_token) { if (callbacks_.contains(request_id)) { - std::move(callbacks_[request_id]).Run(token_info); + std::move(callbacks_[request_id]).Run(access_token); } token_fetchers_.erase(request_id);
diff --git a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h new file mode 100644 index 0000000..8aebacd --- /dev/null +++ b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h
@@ -0,0 +1,64 @@ +// Copyright 2021 The Chromium 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_SAFE_BROWSING_CORE_BROWSER_SYNC_SAFE_BROWSING_PRIMARY_ACCOUNT_TOKEN_FETCHER_H_ +#define COMPONENTS_SAFE_BROWSING_CORE_BROWSER_SYNC_SAFE_BROWSING_PRIMARY_ACCOUNT_TOKEN_FETCHER_H_ + +#include <memory> + +#include "base/containers/flat_map.h" +#include "base/memory/weak_ptr.h" +#include "components/safe_browsing/core/browser/safe_browsing_token_fetcher.h" +#include "components/signin/public/identity_manager/access_token_info.h" +#include "google_apis/gaia/google_service_auth_error.h" + +namespace signin { +class AccessTokenFetcher; +class IdentityManager; +} // namespace signin + +namespace safe_browsing { + +// This class fetches access tokens for Safe Browsing for the current +// primary account. +class SafeBrowsingPrimaryAccountTokenFetcher : public SafeBrowsingTokenFetcher { + public: + // Create a SafeBrowsingPrimaryAccountTokenFetcher for the primary account of + // |identity_manager|. |identity_manager| is unowned, and must outlive this + // object. + explicit SafeBrowsingPrimaryAccountTokenFetcher( + signin::IdentityManager* identity_manager); + + ~SafeBrowsingPrimaryAccountTokenFetcher() override; + + // SafeBrowsingTokenFetcher: + void Start(Callback callback) override; + + private: + void OnTokenFetched(int request_id, + GoogleServiceAuthError error, + signin::AccessTokenInfo access_token_info); + void OnTokenTimeout(int request_id); + void Finish(int request_id, const std::string& access_token); + + // Reference to the identity manager to fetch from. + signin::IdentityManager* identity_manager_; + + // The count of requests sent. This is used as an ID for requests. + int requests_sent_; + + // Active fetchers, keyed by ID. + base::flat_map<int, std::unique_ptr<signin::AccessTokenFetcher>> + token_fetchers_; + + // Active callbacks, keyed by ID. + base::flat_map<int, Callback> callbacks_; + + base::WeakPtrFactory<SafeBrowsingPrimaryAccountTokenFetcher> + weak_ptr_factory_; +}; + +} // namespace safe_browsing + +#endif // COMPONENTS_SAFE_BROWSING_CORE_BROWSER_SYNC_SAFE_BROWSING_PRIMARY_ACCOUNT_TOKEN_FETCHER_H_
diff --git a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc new file mode 100644 index 0000000..bf8418b0 --- /dev/null +++ b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher_unittest.cc
@@ -0,0 +1,74 @@ +// Copyright 2020 The Chromium 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/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h" +#include <memory> + +#include "base/run_loop.h" +#include "base/test/task_environment.h" +#include "components/safe_browsing/core/common/test_task_environment.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace safe_browsing { + +class SafeBrowsingPrimaryAccountTokenFetcherTest : public ::testing::Test { + public: + SafeBrowsingPrimaryAccountTokenFetcherTest() + : task_environment_(CreateTestTaskEnvironment()) {} + + protected: + std::unique_ptr<base::test::TaskEnvironment> task_environment_; + signin::IdentityTestEnvironment identity_test_environment_; +}; + +TEST_F(SafeBrowsingPrimaryAccountTokenFetcherTest, Success) { + identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable( + "test@example.com"); + std::string access_token; + SafeBrowsingPrimaryAccountTokenFetcher fetcher( + identity_test_environment_.identity_manager()); + fetcher.Start( + base::BindOnce([](std::string* target_token, + const std::string& token) { *target_token = token; }, + &access_token)); + identity_test_environment_ + .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "token", base::Time::Now()); + EXPECT_EQ(access_token, "token"); +} + +TEST_F(SafeBrowsingPrimaryAccountTokenFetcherTest, Failure) { + identity_test_environment_.MakeUnconsentedPrimaryAccountAvailable( + "test@example.com"); + std::string access_token; + SafeBrowsingPrimaryAccountTokenFetcher fetcher( + identity_test_environment_.identity_manager()); + fetcher.Start( + base::BindOnce([](std::string* target_token, + const std::string& token) { *target_token = token; }, + &access_token)); + identity_test_environment_ + .WaitForAccessTokenRequestIfNecessaryAndRespondWithError( + GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED)); + ASSERT_TRUE(access_token.empty()); +} + +TEST_F(SafeBrowsingPrimaryAccountTokenFetcherTest, + SuccessWithConsentedPrimaryAccount) { + identity_test_environment_.MakePrimaryAccountAvailable("test@example.com"); + std::string access_token; + SafeBrowsingPrimaryAccountTokenFetcher fetcher( + identity_test_environment_.identity_manager()); + fetcher.Start( + base::BindOnce([](std::string* target_token, + const std::string& token) { *target_token = token; }, + &access_token)); + identity_test_environment_ + .WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "token", base::Time::Now()); + EXPECT_EQ(access_token, "token"); +} + +} // namespace safe_browsing
diff --git a/components/safe_browsing/core/realtime/BUILD.gn b/components/safe_browsing/core/realtime/BUILD.gn index 1a0aa02..f600bd8c 100644 --- a/components/safe_browsing/core/realtime/BUILD.gn +++ b/components/safe_browsing/core/realtime/BUILD.gn
@@ -38,7 +38,7 @@ "//components/safe_browsing/core:csd_proto", "//components/safe_browsing/core:realtimeapi_proto", "//components/safe_browsing/core:verdict_cache_manager", - "//components/safe_browsing/core/browser:token_fetcher", + "//components/safe_browsing/core/browser/sync", "//components/safe_browsing/core/common:safe_browsing_prefs", "//components/safe_browsing/core/common:thread_utils", "//components/safe_browsing/core/db:v4_protocol_manager_util",
diff --git a/components/safe_browsing/core/realtime/url_lookup_service.cc b/components/safe_browsing/core/realtime/url_lookup_service.cc index 6d0851c3..1c796a7 100644 --- a/components/safe_browsing/core/realtime/url_lookup_service.cc +++ b/components/safe_browsing/core/realtime/url_lookup_service.cc
@@ -13,7 +13,7 @@ #include "base/time/time.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/buildflags.h" -#include "components/safe_browsing/core/browser/safe_browsing_token_fetcher.h" +#include "components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/safe_browsing/core/common/thread_utils.h" #include "components/safe_browsing/core/db/v4_protocol_manager_util.h" @@ -54,8 +54,8 @@ pref_service_(pref_service), is_off_the_record_(is_off_the_record), variations_(variations_service) { - token_fetcher_ = - std::make_unique<SafeBrowsingTokenFetcher>(identity_manager_); + token_fetcher_ = std::make_unique<SafeBrowsingPrimaryAccountTokenFetcher>( + identity_manager_); } void RealTimeUrlLookupService::GetAccessToken( @@ -63,7 +63,6 @@ RTLookupRequestCallback request_callback, RTLookupResponseCallback response_callback) { token_fetcher_->Start( - signin::ConsentLevel::kNotRequired, base::BindOnce(&RealTimeUrlLookupService::OnGetAccessToken, weak_factory_.GetWeakPtr(), url, std::move(request_callback), std::move(response_callback), @@ -75,14 +74,12 @@ RTLookupRequestCallback request_callback, RTLookupResponseCallback response_callback, base::TimeTicks get_token_start_time, - base::Optional<signin::AccessTokenInfo> access_token_info) { + const std::string& access_token) { base::UmaHistogramTimes("SafeBrowsing.RT.GetToken.Time", base::TimeTicks::Now() - get_token_start_time); base::UmaHistogramBoolean("SafeBrowsing.RT.HasTokenFromFetcher", - access_token_info.has_value()); - std::string access_token_string = - access_token_info.value_or(signin::AccessTokenInfo()).token; - SendRequest(url, access_token_string, std::move(request_callback), + !access_token.empty()); + SendRequest(url, access_token, std::move(request_callback), std::move(response_callback)); }
diff --git a/components/safe_browsing/core/realtime/url_lookup_service.h b/components/safe_browsing/core/realtime/url_lookup_service.h index 5f4de4d..2eebf4a 100644 --- a/components/safe_browsing/core/realtime/url_lookup_service.h +++ b/components/safe_browsing/core/realtime/url_lookup_service.h
@@ -84,12 +84,11 @@ bool ShouldIncludeCredentials() const override; // Called when the access token is obtained from |token_fetcher_|. - void OnGetAccessToken( - const GURL& url, - RTLookupRequestCallback request_callback, - RTLookupResponseCallback response_callback, - base::TimeTicks get_token_start_time, - base::Optional<signin::AccessTokenInfo> access_token_info); + void OnGetAccessToken(const GURL& url, + RTLookupRequestCallback request_callback, + RTLookupResponseCallback response_callback, + base::TimeTicks get_token_start_time, + const std::string& access_token); // Unowned object used for getting access token when real time url check with // token is enabled.
diff --git a/components/safe_browsing/core/realtime/url_lookup_service_base.cc b/components/safe_browsing/core/realtime/url_lookup_service_base.cc index e6ce006c..bf849653 100644 --- a/components/safe_browsing/core/realtime/url_lookup_service_base.cc +++ b/components/safe_browsing/core/realtime/url_lookup_service_base.cc
@@ -73,6 +73,13 @@ base::UmaHistogramCounts100(metric + suffix, value); } +void RecordCount1MWithAndWithoutSuffix(const std::string& metric, + const std::string& suffix, + int value) { + base::UmaHistogramCounts1M(metric, value); + base::UmaHistogramCounts1M(metric + suffix, value); +} + void RecordRequestPopulationWithAndWithoutSuffix( const std::string& metric, const std::string& suffix, @@ -357,6 +364,8 @@ network::SimpleURLLoader::Create(std::move(resource_request), GetTrafficAnnotationTag()); network::SimpleURLLoader* loader = owned_loader.get(); + RecordCount1MWithAndWithoutSuffix("SafeBrowsing.RT.Request.Size", + GetMetricSuffix(), req_data.size()); owned_loader->AttachStringForUpload(req_data, "application/octet-stream"); owned_loader->SetTimeoutDuration( base::TimeDelta::FromSeconds(kURLLookupTimeoutDurationInSeconds));
diff --git a/components/services/storage/dom_storage/local_storage_impl.cc b/components/services/storage/dom_storage/local_storage_impl.cc index eb2a106..e3ce9cb 100644 --- a/components/services/storage/dom_storage/local_storage_impl.cc +++ b/components/services/storage/dom_storage/local_storage_impl.cc
@@ -1102,10 +1102,10 @@ void LocalStorageImpl::OnShutdownComplete() { DCHECK(shutdown_complete_callback_); // Flush any final tasks on the DB task runner before invoking the callback. - leveldb_task_runner_->PostTaskAndReply( - FROM_HERE, base::DoNothing(), std::move(shutdown_complete_callback_)); PurgeAllStorageAreas(); database_.reset(); + leveldb_task_runner_->PostTaskAndReply( + FROM_HERE, base::DoNothing(), std::move(shutdown_complete_callback_)); } void LocalStorageImpl::GetStatistics(size_t* total_cache_size,
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 afcaf9a..e847b80 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
@@ -24,6 +24,16 @@ */ public interface AccountManagerFacade { /** + * Listener for {@link ChildAccountStatus.Status}. + */ + interface ChildAccountStatusListener { + /** + * The method is called when child account status is ready. + */ + void onStatusReady(@ChildAccountStatus.Status int status); + } + + /** * Adds an observer to receive accounts change notifications. * @param observer the observer to add. */ @@ -118,13 +128,13 @@ void invalidateAccessToken(String accessToken) throws AuthException; /** - * Checks the child account status in background. + * Checks the child account status of the given account. * - * @param account The account to check the child account status - * @param callback The callback takes the ChildAccountStatus.Status as argument + * @param account The account to check the child account status. + * @param listener The listener is called when the {@link ChildAccountStatus.Status} is ready. */ @MainThread - void checkChildAccountStatus(Account account, Callback<Integer> callback); + void checkChildAccountStatus(Account account, ChildAccountStatusListener listener); /** * Creates an intent that will ask the user to add a new account to the device. See
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java index 59163fa..2c8b62a 100644 --- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java +++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerFacadeImpl.java
@@ -221,7 +221,7 @@ // overriding. @SuppressWarnings("WrongThread") @Override - public void checkChildAccountStatus(Account account, Callback<Integer> callback) { + public void checkChildAccountStatus(Account account, ChildAccountStatusListener listener) { ThreadUtils.assertOnUiThread(); new AsyncTask<Integer>() { @Override @@ -236,8 +236,8 @@ } @Override - public void onPostExecute(@ChildAccountStatus.Status Integer value) { - callback.onResult(value); + public void onPostExecute(@ChildAccountStatus.Status Integer status) { + listener.onStatusReady(status); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java index 82f4cb7..116bd424 100644 --- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java +++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
@@ -127,7 +127,7 @@ } @Override - public void checkChildAccountStatus(Account account, Callback<Integer> callback) {} + public void checkChildAccountStatus(Account account, ChildAccountStatusListener listener) {} @Override public void createAddAccountIntent(Callback<Intent> callback) {}
diff --git a/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java b/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java index f5f0b7f..c946d08 100644 --- a/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java +++ b/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java
@@ -271,8 +271,7 @@ mDelegate.removeAccountHolderExplicitly(AccountHolder.builder(account).build()); } - private void assertChildAccountStatus( - Account account, @ChildAccountStatus.Status Integer status) { + private void assertChildAccountStatus(Account account, @ChildAccountStatus.Status int status) { final AtomicInteger callCount = new AtomicInteger(); mFacade.checkChildAccountStatus(account, result -> { callCount.incrementAndGet();
diff --git a/components/signin/internal/identity_manager/primary_account_manager.cc b/components/signin/internal/identity_manager/primary_account_manager.cc index a3f3a572..7b95c04 100644 --- a/components/signin/internal/identity_manager/primary_account_manager.cc +++ b/components/signin/internal/identity_manager/primary_account_manager.cc
@@ -328,7 +328,6 @@ if (primary_account_info().IsEmpty()) { return; } - // TODO(crbug.com/887756): Consider moving this higher up, or document why // the above blocks are exempt from the |signout_decision| early return. if (signout_decision == SigninClient::SignoutDecision::DISALLOW_SIGNOUT) { @@ -351,6 +350,12 @@ kPrimaryAccountManager_ClearAccount); break; case RemoveAccountsOption::kKeepAllAccounts: + if (previous_state.consent_level == signin::ConsentLevel::kNotRequired) { + // Nothing to update as the primary account is already at kNotRequired + // consent level. Prefer returning to avoid firing useless + // OnPrimaryAccountChanged() notifications. + return; + } SetPrimaryAccountInternal(primary_account_info(), /*consented_to_sync=*/false); break;
diff --git a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc index 89a4638..f067f52 100644 --- a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc +++ b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
@@ -43,9 +43,7 @@ : test_signin_client_(&user_prefs_), token_service_( &user_prefs_, - std::make_unique<FakeProfileOAuth2TokenServiceDelegate>()), - num_successful_signins_(0), - num_unconsented_account_changed_(0) { + std::make_unique<FakeProfileOAuth2TokenServiceDelegate>()) { AccountFetcherService::RegisterPrefs(user_prefs_.registry()); AccountTrackerService::RegisterPrefs(user_prefs_.registry()); ProfileOAuth2TokenService::RegisterProfilePrefs(user_prefs_.registry()); @@ -135,7 +133,7 @@ num_successful_signins_++; break; case signin::PrimaryAccountChangeEvent::Type::kCleared: - // ignored + num_successful_signouts_++; break; case signin::PrimaryAccountChangeEvent::Type::kNone: break; @@ -163,8 +161,9 @@ std::unique_ptr<PrimaryAccountManager> manager_; std::vector<std::string> oauth_tokens_fetched_; std::vector<std::string> cookies_; - int num_successful_signins_; - int num_unconsented_account_changed_; + int num_successful_signins_{0}; + int num_successful_signouts_{0}; + int num_unconsented_account_changed_{0}; }; #if !BUILDFLAG(IS_CHROMEOS_ASH) @@ -176,6 +175,7 @@ account_tracker()->GetAccountInfo(main_account_id)); manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST, signin_metrics::SignoutDelete::IGNORE_METRIC); + EXPECT_EQ(1, num_successful_signouts_); EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); EXPECT_TRUE( manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty()); @@ -211,6 +211,7 @@ signin_metrics::SignoutDelete::IGNORE_METRIC); // Tokens are revoked. + EXPECT_EQ(1, num_successful_signouts_); EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); EXPECT_TRUE(token_service_.GetAccounts().empty()); } @@ -229,10 +230,12 @@ signin_client()->set_is_signout_allowed(false); manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST, signin_metrics::SignoutDelete::IGNORE_METRIC); + EXPECT_EQ(0, num_successful_signouts_); EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); signin_client()->set_is_signout_allowed(true); manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST, signin_metrics::SignoutDelete::IGNORE_METRIC); + EXPECT_EQ(1, num_successful_signouts_); EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); } @@ -282,6 +285,26 @@ } #endif +// Regression test for https://crbug.com/1155519. +TEST_F(PrimaryAccountManagerTest, NoopSignOutDoesNotNotifyObservers) { + CreatePrimaryAccountManager(); + EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); + + CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com"); + CoreAccountInfo account_info = account_tracker()->GetAccountInfo(account_id); + manager_->SetUnconsentedPrimaryAccountInfo(account_info); + EXPECT_EQ(1, num_unconsented_account_changed_); + EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired)); + EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); + + manager_->RevokeSyncConsent(signin_metrics::SIGNOUT_TEST, + signin_metrics::SignoutDelete::IGNORE_METRIC); + + // Since there was no sync consent, observers shouldn't be notified. + EXPECT_EQ(0, num_successful_signouts_); + EXPECT_EQ(1, num_unconsented_account_changed_); +} + TEST_F(PrimaryAccountManagerTest, SignIn) { CreatePrimaryAccountManager(); EXPECT_EQ("", manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email); @@ -472,6 +495,7 @@ account_info.email = "user@gmail.com"; manager_->SetUnconsentedPrimaryAccountInfo(account_info); EXPECT_EQ(0, num_successful_signins_); + EXPECT_EQ(0, num_successful_signouts_); EXPECT_EQ(1, num_unconsented_account_changed_); EXPECT_EQ(account_info, manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)); @@ -481,6 +505,7 @@ // Set the same account again. manager_->SetUnconsentedPrimaryAccountInfo(account_info); EXPECT_EQ(0, num_successful_signins_); + EXPECT_EQ(0, num_successful_signouts_); EXPECT_EQ(1, num_unconsented_account_changed_); EXPECT_EQ(account_info, manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)); @@ -492,6 +517,7 @@ account_info.email = "us.er@gmail.com"; manager_->SetUnconsentedPrimaryAccountInfo(account_info); EXPECT_EQ(0, num_successful_signins_); + EXPECT_EQ(0, num_successful_signouts_); EXPECT_EQ(1, num_unconsented_account_changed_); EXPECT_EQ(account_info, manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)); @@ -501,6 +527,7 @@ // Clear it. manager_->SetUnconsentedPrimaryAccountInfo(CoreAccountInfo()); EXPECT_EQ(0, num_successful_signins_); + EXPECT_EQ(0, num_successful_signouts_); EXPECT_EQ(2, num_unconsented_account_changed_); EXPECT_EQ(CoreAccountInfo(), manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)); @@ -517,6 +544,7 @@ manager_->RevokeSyncConsent(signin_metrics::ProfileSignout::SIGNOUT_TEST, signin_metrics::SignoutDelete::IGNORE_METRIC); + EXPECT_EQ(1, num_successful_signouts_); EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired)); EXPECT_EQ( @@ -534,6 +562,7 @@ manager_->ClearPrimaryAccount(signin_metrics::ProfileSignout::SIGNOUT_TEST, signin_metrics::SignoutDelete::IGNORE_METRIC); + EXPECT_EQ(1, num_successful_signouts_); EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync)); EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired)); }
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java index 87b5b5f..aa6fab7 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java
@@ -17,17 +17,35 @@ * This class has a native counterpart called AccountInfo. */ public class AccountInfo extends CoreAccountInfo { + private final String mFullName; + private final String mGivenName; private final @Nullable Bitmap mAccountImage; @VisibleForTesting @CalledByNative - public AccountInfo( - CoreAccountId id, String email, String gaiaId, @Nullable Bitmap accountImage) { + public AccountInfo(CoreAccountId id, String email, String gaiaId, String fullName, + String givenName, @Nullable Bitmap accountImage) { super(id, email, gaiaId); + mFullName = fullName; + mGivenName = givenName; mAccountImage = accountImage; } /** + * @return Full name of the account. + */ + public String getFullName() { + return mFullName; + } + + /** + * @return Given name of the account. + */ + public String getGivenName() { + return mGivenName; + } + + /** * Gets the account's image. * It can be the image user uploaded, monogram or null. */
diff --git a/components/signin/public/identity_manager/account_info.cc b/components/signin/public/identity_manager/account_info.cc index 3ee85a7..9f6f24dc 100644 --- a/components/signin/public/identity_manager/account_info.cc +++ b/components/signin/public/identity_manager/account_info.cc
@@ -157,6 +157,8 @@ env, ConvertToJavaCoreAccountId(env, account_info.account_id), base::android::ConvertUTF8ToJavaString(env, account_info.email), base::android::ConvertUTF8ToJavaString(env, account_info.gaia), + base::android::ConvertUTF8ToJavaString(env, account_info.full_name), + base::android::ConvertUTF8ToJavaString(env, account_info.given_name), avatar_image.IsEmpty() ? nullptr : gfx::ConvertToJavaBitmap(*avatar_image.AsImageSkia().bitmap()));
diff --git a/components/signin/public/identity_manager/primary_account_access_token_fetcher.cc b/components/signin/public/identity_manager/primary_account_access_token_fetcher.cc index e96ecfc9..df2d6e02 100644 --- a/components/signin/public/identity_manager/primary_account_access_token_fetcher.cc +++ b/components/signin/public/identity_manager/primary_account_access_token_fetcher.cc
@@ -77,25 +77,15 @@ AccessTokenFetcher::Mode::kImmediate); } -void PrimaryAccountAccessTokenFetcher::OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) { - // When sync consent is not required the signin is handled in - // OnUnconsentedPrimaryAccountChanged() below. - if (consent_ == ConsentLevel::kNotRequired) +void PrimaryAccountAccessTokenFetcher::OnPrimaryAccountChanged( + const PrimaryAccountChangeEvent& event) { + // We're only interested when the account is set for the |consent_| + // consent level. + if (event.GetEventTypeFor(consent_) != + PrimaryAccountChangeEvent::Type::kSet) { return; - DCHECK(!primary_account_info.account_id.empty()); - ProcessSigninStateChange(); -} - -void PrimaryAccountAccessTokenFetcher::OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& primary_account_info) { - // This method is called after both SetPrimaryAccount and - // SetUnconsentedPrimaryAccount. - if (consent_ == ConsentLevel::kSync) - return; - // We're only interested when the account is set. - if (primary_account_info.account_id.empty()) - return; + } + DCHECK(!event.GetCurrentState().primary_account.account_id.empty()); ProcessSigninStateChange(); }
diff --git a/components/signin/public/identity_manager/primary_account_access_token_fetcher.h b/components/signin/public/identity_manager/primary_account_access_token_fetcher.h index 36d37f9..e982fa4 100644 --- a/components/signin/public/identity_manager/primary_account_access_token_fetcher.h +++ b/components/signin/public/identity_manager/primary_account_access_token_fetcher.h
@@ -177,10 +177,7 @@ void StartAccessTokenRequest(); // IdentityManager::Observer implementation. - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override; - void OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& primary_account_info) override; + void OnPrimaryAccountChanged(const PrimaryAccountChangeEvent& event) override; void OnRefreshTokenUpdatedForAccount( const CoreAccountInfo& account_info) override;
diff --git a/components/signin/public/identity_manager/test_identity_manager_observer.cc b/components/signin/public/identity_manager/test_identity_manager_observer.cc index afa01cb..6fcdd672 100644 --- a/components/signin/public/identity_manager/test_identity_manager_observer.cc +++ b/components/signin/public/identity_manager/test_identity_manager_observer.cc
@@ -133,25 +133,38 @@ } // IdentityManager::Observer: -void TestIdentityManagerObserver::OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) { - primary_account_from_set_callback_ = primary_account_info; - if (on_primary_account_set_callback_) - std::move(on_primary_account_set_callback_).Run(); -} - -void TestIdentityManagerObserver::OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) { - primary_account_from_cleared_callback_ = previous_primary_account_info; - if (on_primary_account_cleared_callback_) - std::move(on_primary_account_cleared_callback_).Run(); -} - -void TestIdentityManagerObserver::OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& unconsented_primary_account_info) { - unconsented_primary_account_from_callback_ = unconsented_primary_account_info; - if (on_unconsented_primary_account_callback_) - std::move(on_unconsented_primary_account_callback_).Run(); +void TestIdentityManagerObserver::OnPrimaryAccountChanged( + const PrimaryAccountChangeEvent& event) { + // TODO(https://crbug.com/1158855): Refactor this test observer to + // have a single on_primary_account_changed_callback_ and a single + // on_primary_account_changed_event_. + switch (event.GetEventTypeFor(ConsentLevel::kNotRequired)) { + case PrimaryAccountChangeEvent::Type::kSet: + case PrimaryAccountChangeEvent::Type::kCleared: + unconsented_primary_account_from_callback_ = + event.GetCurrentState().primary_account; + if (on_unconsented_primary_account_callback_) + std::move(on_unconsented_primary_account_callback_).Run(); + break; + case PrimaryAccountChangeEvent::Type::kNone: + break; + } + switch (event.GetEventTypeFor(ConsentLevel::kSync)) { + case PrimaryAccountChangeEvent::Type::kSet: + primary_account_from_set_callback_ = + event.GetCurrentState().primary_account; + if (on_primary_account_set_callback_) + std::move(on_primary_account_set_callback_).Run(); + break; + case PrimaryAccountChangeEvent::Type::kCleared: + primary_account_from_cleared_callback_ = + event.GetPreviousState().primary_account; + if (on_primary_account_cleared_callback_) + std::move(on_primary_account_cleared_callback_).Run(); + break; + case PrimaryAccountChangeEvent::Type::kNone: + break; + } } void TestIdentityManagerObserver::OnRefreshTokenUpdatedForAccount(
diff --git a/components/signin/public/identity_manager/test_identity_manager_observer.h b/components/signin/public/identity_manager/test_identity_manager_observer.h index 506e246..91479fe 100644 --- a/components/signin/public/identity_manager/test_identity_manager_observer.h +++ b/components/signin/public/identity_manager/test_identity_manager_observer.h
@@ -64,12 +64,8 @@ private: // IdentityManager::Observer: - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override; - void OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) override; - void OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& unconsented_primary_account_info) override; + void OnPrimaryAccountChanged( + const PrimaryAccountChangeEvent& event_details) override; void OnRefreshTokenUpdatedForAccount( const CoreAccountInfo& account_info) override; void OnRefreshTokenRemovedForAccount(
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 5de6774..1b49caf 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -1443,6 +1443,7 @@ <translation id="6687335167692595844">Lettertipegrootte versoek</translation> <translation id="6689249931105087298">Relatief met swartpuntsaampersing</translation> <translation id="6689271823431384964">Chrome bied aan om jou kaarte in jou Google-rekening te stoor omdat jy aangemeld is. Jy kan hierdie gedrag in instellings verander. Die kaarthouernaam kom van jou rekening af.</translation> +<translation id="6698381487523150993">Geskep:</translation> <translation id="6702919718839027939">Bied aan</translation> <translation id="6710213216561001401">Vorige</translation> <translation id="6710594484020273272"><Tik soekterm in></translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index e51d864..29ab461b 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -630,6 +630,7 @@ <translation id="3487845404393360112">መሳቢያ 4</translation> <translation id="3495081129428749620">በገጽ ውስጥ ያግኙ <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">የፋይል ስም፦</translation> <translation id="3507936815618196901">የዙሪያዎ የ3ል ካርታ መፍጠር ወይም የካሜራ ቦታን መከታተል</translation> <translation id="3512163584740124171">ይህ መመሪያ ከተመሳሳይ የመመሪያ ቡድን የመጣ ሌላ መመሪያ ከፍተኛ ተቀዳሚነት ስላለው ችላ ተብሏል።</translation> <translation id="3518941727116570328">በርካታ ነገሮችን መያዝ</translation> @@ -1237,6 +1238,7 @@ <translation id="5895138241574237353">እንደገና ጀምር</translation> <translation id="5895187275912066135">በዚህ ቀን ቀርቧል</translation> <translation id="5901630391730855834">ቢጫ</translation> +<translation id="5903264686717710770">ርዕስ፡-</translation> <translation id="5905445707201418379">በ <ph name="ORIGIN" /> የደህንነት መመሪያ መሠረት ታግዷል።</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (ሰምሯል)</translation> <translation id="5913377024445952699">የማያ ገጽ ቀረጻ ባለበት ቆሟል</translation> @@ -1433,6 +1435,7 @@ <translation id="6687335167692595844">የቅርጸ-ቁምፊ መጠን ተጠይቋል</translation> <translation id="6689249931105087298">አንጻራዊ ከጥቁር ነጥብ እመቃ ጋር</translation> <translation id="6689271823431384964">በመለያ ስለገቡ Chrome ካርዶችዎን በGoogle መለያዎ ሊያስቀምጥልዎ እየጠየቀ ነው። ይህን ባህሪ በቅንብሮች ውስጥ መቀየር ይችላሉ። የካርድ ያዢው ስም ከመለያዎ ነው የመጣው።</translation> +<translation id="6698381487523150993">ተፈጠረ:</translation> <translation id="6702919718839027939">አቅርብ</translation> <translation id="6710213216561001401">ቀዳሚ</translation> <translation id="6710594484020273272"><የፍለጋ ቃል ይተይቡ></translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 3bf012c59..5decf8c7 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">الدُرج 4</translation> <translation id="3495081129428749620">البحث في الصفحة <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">اسم الملفّ:</translation> <translation id="3507936815618196901">إنشاء خريطة ثلاثية الأبعاد للبيئة المحيطة بك وتتبُّع موضع الكاميرا</translation> <translation id="3512163584740124171">يتم تجاهل هذه السياسة بسبب سياسة أخرى من نفس مجموعة السياسة لها أولوية أعلى.</translation> <translation id="3518941727116570328">معالجة الأهداف المتعددة</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">إعادة التشغيل</translation> <translation id="5895187275912066135">تاريخ الإصدار</translation> <translation id="5901630391730855834">أصفر</translation> +<translation id="5903264686717710770">العنوان:</translation> <translation id="5905445707201418379">تم الحظر وفقًا لسياسة المصدر <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (تمت المزامنة)</translation> <translation id="5913377024445952699">إيقاف وضع "التقاط الشاشة" مؤقتًا</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">حجم الخط المطلوب</translation> <translation id="6689249931105087298">طباعة نسبية باستخدام ميزة "تعويض النقاط السوداء"</translation> <translation id="6689271823431384964">يتيح لك Chrome حفظ بطاقاتك في حسابك على Google لأنك سجَّلت الدخول. يمكنك تغيير هذا السلوك في الإعدادات. ويتم الحصول على اسم حامل البطاقة من حسابك.</translation> +<translation id="6698381487523150993">تاريخ الإنشاء:</translation> <translation id="6702919718839027939">وضع العرض التقديمي</translation> <translation id="6710213216561001401">السابق</translation> <translation id="6710594484020273272"><إدخال عبارة البحث></translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 4aee01ad..cc2259c 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -1438,6 +1438,7 @@ <translation id="6687335167692595844">Şrift ölçüsü üzrə sorğu göndərildi</translation> <translation id="6689249931105087298">Qara nöqtə sıxılması ilə nisbi</translation> <translation id="6689271823431384964">Daxil olduğunuza görə Chrome kartları Google Hesabında yadda saxlamağı təklif edir. Bunu ayarlarda dəyişə bilərsiniz. Kart sahibinin adı hesabınızdan götürülüb.</translation> +<translation id="6698381487523150993">Yaradılıb:</translation> <translation id="6702919718839027939">Təqdim edin</translation> <translation id="6710213216561001401">Əvvəlki</translation> <translation id="6710594484020273272"><Axtarış sözünü yazın></translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 3158e44..81c7112 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -633,6 +633,7 @@ <translation id="3487845404393360112">Тава 4</translation> <translation id="3495081129428749620">Търсене в страницата <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Име на файла:</translation> <translation id="3507936815618196901">Създаване на триизмерна карта на заобикалящата ви среда и следене на позицията на камерата</translation> <translation id="3512163584740124171">Това правило е пренебрегнато, защото друго правило от същата група е с по-висок приоритет.</translation> <translation id="3518941727116570328">Обработване на няколко обекта</translation> @@ -1243,6 +1244,7 @@ <translation id="5895138241574237353">Рестартиране</translation> <translation id="5895187275912066135">Издаден на</translation> <translation id="5901630391730855834">жълто</translation> +<translation id="5903264686717710770">Заглавие:</translation> <translation id="5905445707201418379">Блокирано според правилото за източник на <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (синхронизирано)</translation> <translation id="5913377024445952699">Функцията за заснемане на екрана е поставена на пауза</translation> @@ -1439,6 +1441,7 @@ <translation id="6687335167692595844">Размерът на шрифта е заявен</translation> <translation id="6689249931105087298">Относително с компенсиране на черните точки</translation> <translation id="6689271823431384964">Chrome предлага да запази картите ви в профила ви в Google, защото сте влезли в него. Можете да промените това поведение от настройките. Името на картодържателя е от профила ви.</translation> +<translation id="6698381487523150993">Създадено:</translation> <translation id="6702919718839027939">Представяне</translation> <translation id="6710213216561001401">Предишно</translation> <translation id="6710594484020273272"><Въведете дума за търсене></translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index a4783cb1..215dcd8 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -638,6 +638,7 @@ <translation id="3487845404393360112">ট্রে ৪</translation> <translation id="3495081129428749620">এই পৃষ্ঠাতে খুঁজুন <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">ফাইলের নাম:</translation> <translation id="3507936815618196901">আপনার আশেপাশের এলাকার একটি 3D ম্যাপ তৈরি করতে এবং ক্যামেরার অবস্থান ট্র্যাক করতে চায়</translation> <translation id="3512163584740124171">একই নীতির গ্রুপের অন্য একটি নীতি অগ্রাধিকার পেয়েছে, তাই এই নীতি অগ্রাহ্য করা হয়েছে।</translation> <translation id="3518941727116570328">মাল্টিপল অবজেক্ট ম্যানেজ করা</translation> @@ -1248,6 +1249,7 @@ <translation id="5895138241574237353">পুনর্সূচনা</translation> <translation id="5895187275912066135">এই তারিখে ইস্যু করা</translation> <translation id="5901630391730855834">হলুদ</translation> +<translation id="5903264686717710770">শিরোনাম:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> সার্ভারের 'অরিজিন নীতি' অনুযায়ী ব্লক করা হয়েছে।</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (সিঙ্ক হয়েছে)</translation> <translation id="5913377024445952699">স্ক্রিন ক্যাপচার পজ করা হয়েছে</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">ফন্ট সাইজের অনুরোধ করা হয়েছে</translation> <translation id="6689249931105087298">ব্ল্যাক পয়েন্ট কম্প্রেশনের সাথে রিলেটিভ</translation> <translation id="6689271823431384964">আপনি সাইন-ইন করে আছেন বলে, Chrome আপনার কার্ডগুলি Google অ্যাকাউন্টে সেভ করতে চান কিনা তা জানতে চাইছে। সেটিংস থেকে আপনি এই বিকল্প পরিবর্তন করতে পারেন। আপনার অ্যাকাউন্ট থেকেই কার্ডহোল্ডারের নাম পাওয়া গেছে।</translation> +<translation id="6698381487523150993">তৈরি হয়েছে:</translation> <translation id="6702919718839027939">প্রেজেন্টেশন মোড</translation> <translation id="6710213216561001401">আগের</translation> <translation id="6710594484020273272"><সার্চের পদ লিখুন></translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index f1c42adb..383f50c 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Ladica 4</translation> <translation id="3495081129428749620">Pronađi na stranici <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Naziv:</translation> <translation id="3507936815618196901">Kreirati 3D mapu vašeg okruženja i prati položaj kamere</translation> <translation id="3512163584740124171">Ovo pravilo je zanemareno jer drugo pravilo iz iste grupe pravila ima veći prioritet.</translation> <translation id="3518941727116570328">Obrada više objekata</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Ponovo pokreni</translation> <translation id="5895187275912066135">Izdano</translation> <translation id="5901630391730855834">Žuta</translation> +<translation id="5903264686717710770">Naslov:</translation> <translation id="5905445707201418379">Blokirano prema izvornim pravilima koja određuje izvor <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinhronizirano)</translation> <translation id="5913377024445952699">Snimanje ekrana je pauzirano</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Zatražena je veličina fonta</translation> <translation id="6689249931105087298">Relativno s kompresijom crne tačke</translation> <translation id="6689271823431384964">Chrome vam nudi pohranjivanje kartica na Google računu zato što ste prijavljeni. Ovo ponašanje možete promjeniti u postavkama. Ime vlasnika kartice je ime s vašeg računa.</translation> +<translation id="6698381487523150993">Autor/ica:</translation> <translation id="6702919718839027939">Prezentacija</translation> <translation id="6710213216561001401">Nazad</translation> <translation id="6710594484020273272"><Unesite pojam za pretraživanje></translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 25357fce..6b2fd5da 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -631,6 +631,7 @@ <translation id="3487845404393360112">Safata 4</translation> <translation id="3495081129428749620">Cerca a la pàgina <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nom del fitxer:</translation> <translation id="3507936815618196901">Crear un mapa en 3D del teu entorn i fer un seguiment de la posició de la càmera</translation> <translation id="3512163584740124171">Aquesta política s'ignora perquè una altra política del mateix grup de polítiques té una prioritat més alta.</translation> <translation id="3518941727116570328">Gestió de diversos objectes</translation> @@ -1236,6 +1237,7 @@ <translation id="5895138241574237353">Reinicia</translation> <translation id="5895187275912066135">Emès el</translation> <translation id="5901630391730855834">Groc</translation> +<translation id="5903264686717710770">Títol:</translation> <translation id="5905445707201418379">S'ha bloquejat d'acord amb la política d'origen de: <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (informació sincronitzada)</translation> <translation id="5913377024445952699">La captura de pantalla s'ha posat en pausa</translation> @@ -1432,6 +1434,7 @@ <translation id="6687335167692595844">Mida de la lletra sol·licitada</translation> <translation id="6689249931105087298">Relatiu amb compressió de punts negres</translation> <translation id="6689271823431384964">Chrome t'està oferint desar les targetes al Compte de Google perquè tens la sessió iniciada. Pots canviar aquest comportament a la configuració. El nom del titular de la targeta s'obté del teu compte.</translation> +<translation id="6698381487523150993">Creat:</translation> <translation id="6702919718839027939">Presenta</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Escriviu el terme de cerca></translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 1cc64611..471b5ec 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -628,6 +628,7 @@ <translation id="3487845404393360112">Přihrádka 4</translation> <translation id="3495081129428749620">Najít na stránce <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Název souboru:</translation> <translation id="3507936815618196901">Vytvářet 3D mapu vašeho okolí a sledovat polohu kamery</translation> <translation id="3512163584740124171">Tato zásada se ignoruje, protože jiná zásada ze stejné skupiny zásad má vyšší prioritu.</translation> <translation id="3518941727116570328">Zpracování více objektů</translation> @@ -1232,6 +1233,7 @@ <translation id="5895138241574237353">Restartovat</translation> <translation id="5895187275912066135">Datum vydání</translation> <translation id="5901630391730855834">Žlutá</translation> +<translation id="5903264686717710770">Název:</translation> <translation id="5905445707201418379">Zablokováno na základě zásad webu <ph name="ORIGIN" /> ohledně původu.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronizováno)</translation> <translation id="5913377024445952699">Záznam obrazovky je pozastaven</translation> @@ -1427,6 +1429,7 @@ <translation id="6687335167692595844">Požadována velikost písma</translation> <translation id="6689249931105087298">Relativní s kompresí černého bodu</translation> <translation id="6689271823431384964">Chrome vám nabízí uložení karet do účtu Google, protože jste přihlášeni. Toto chování můžete změnit v Nastavení. Jméno držitele karty pochází z vašeho účtu.</translation> +<translation id="6698381487523150993">Vytvořil:</translation> <translation id="6702919718839027939">Prezentovat</translation> <translation id="6710213216561001401">Předchozí</translation> <translation id="6710594484020273272"><Zadejte vyhledávací dotaz></translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 3350d9e..7b283f9 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Bakke 4</translation> <translation id="3495081129428749620">Find på side <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Filnavn:</translation> <translation id="3507936815618196901">Oprette et 3D-kort over dine omgivelser og registrere kamerapositionen</translation> <translation id="3512163584740124171">Politikken ignoreres, da en anden politik fra samme politikgruppe har højere prioritet.</translation> <translation id="3518941727116570328">Håndtering af flere objekter</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Genstart</translation> <translation id="5895187275912066135">Udstedt den</translation> <translation id="5901630391730855834">Gul</translation> +<translation id="5903264686717710770">Titel:</translation> <translation id="5905445707201418379">Blokeret i overensstemmelse med oprindelsespolitikken for <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synkroniseret)</translation> <translation id="5913377024445952699">Screenshots er sat på pause</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Der blev anmodet om størrelse på skrifttype</translation> <translation id="6689249931105087298">Relativ komprimering med sorte punkter</translation> <translation id="6689271823431384964">Chrome tilbyder at gemme dine kort på din Google-konto, fordi du er logget ind. Du kan ændre dette i indstillingerne. Kortindehaverens navn hentes fra din konto.</translation> +<translation id="6698381487523150993">Oprettet:</translation> <translation id="6702919718839027939">Nutid</translation> <translation id="6710213216561001401">Forrige</translation> <translation id="6710594484020273272"><Indtast søgeterm></translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 0bb509df..c2a4ece 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -630,6 +630,7 @@ <translation id="3484560055331845446">Sie könnten den Zugriff auf Ihr Google-Konto verlieren. Chrome empfiehlt Ihnen, Ihr Passwort jetzt zu ändern. Sie werden dazu aufgefordert, sich anzumelden.</translation> <translation id="3487845404393360112">Fach 4</translation> <translation id="3495081129428749620">Auf Seite "<ph name="PAGE_TITLE" />" suchen</translation> +<translation id="350069200438440499">Dateiname:</translation> <translation id="3507936815618196901">Eine 3D-Karte Ihrer Umgebung erstellen und die Kameraposition verfolgen</translation> <translation id="3512163584740124171">Diese Richtlinie wird ignoriert, da eine andere Richtlinie aus derselben Richtliniengruppe eine höhere Priorität hat.</translation> <translation id="3518941727116570328">Handhabung mehrerer Objekte</translation> @@ -1234,6 +1235,7 @@ <translation id="5895138241574237353">Neu starten</translation> <translation id="5895187275912066135">Ausgestellt am</translation> <translation id="5901630391730855834">Gelb</translation> +<translation id="5903264686717710770">Titel:</translation> <translation id="5905445707201418379">Gemäß der Ursprungsrichtlinie von <ph name="ORIGIN" /> blockiert.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronisiert)</translation> <translation id="5913377024445952699">Bildschirmaufnahme pausiert</translation> @@ -1430,6 +1432,7 @@ <translation id="6687335167692595844">Gewünschte Schriftgröße</translation> <translation id="6689249931105087298">Relativ mit Schwarzpunktkompensation</translation> <translation id="6689271823431384964">Chrome bietet Ihnen die Möglichkeit, die Karten in Ihrem Google-Konto zu speichern, weil Sie angemeldet sind. Sie können dies in den Einstellungen ändern. Der Name des Karteninhabers stammt aus Ihrem Konto.</translation> +<translation id="6698381487523150993">Erstellt:</translation> <translation id="6702919718839027939">Präsentieren</translation> <translation id="6710213216561001401">Zurück</translation> <translation id="6710594484020273272"><Suchbegriff eingeben></translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 8de8d46..e1e2996 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Δίσκος 4</translation> <translation id="3495081129428749620">Εύρεση στη σελίδα <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Όνομα αρχείου:</translation> <translation id="3507936815618196901">Δημιουργία τρισδιάστατου χάρτη του περιβάλλοντα χώρου σας και παρακολούθηση της θέσης της κάμερας.</translation> <translation id="3512163584740124171">Αυτή η πολιτική αγνοείται επειδή μια άλλη πολιτική από την ίδια ομάδα πολιτικής έχει υψηλότερη προτεραιότητα.</translation> <translation id="3518941727116570328">Χειρισμός πολλών αντικειμένων</translation> @@ -1248,6 +1249,7 @@ <translation id="5895138241574237353">Επανεκκίνηση</translation> <translation id="5895187275912066135">Εκδόθηκε την</translation> <translation id="5901630391730855834">Κίτρινο</translation> +<translation id="5903264686717710770">Τίτλος:</translation> <translation id="5905445707201418379">Αποκλείστηκε σύμφωνα με την πολιτική προέλευσης του <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (συγχρονισμένο)</translation> <translation id="5913377024445952699">Η καταγραφή οθόνης τέθηκε σε παύση</translation> @@ -1444,6 +1446,7 @@ <translation id="6687335167692595844">Ζητήθηκε μέγεθος γραμματοσειράς</translation> <translation id="6689249931105087298">Σχετική με τη συμπίεση μαύρου σημείου</translation> <translation id="6689271823431384964">Το Chrome προσφέρεται να αποθηκεύσει τις κάρτες σας στον Λογαριασμό σας Google, επειδή έχετε συνδεθεί. Μπορείτε να αλλάξετε αυτήν τη συμπεριφορά στις ρυθμίσεις. Το όνομα του κατόχου κάρτας προέρχεται από τον λογαριασμό σας.</translation> +<translation id="6698381487523150993">Δημιουργήθηκε:</translation> <translation id="6702919718839027939">Παρουσίαση</translation> <translation id="6710213216561001401">Προηγούμενο</translation> <translation id="6710594484020273272"><Πληκτρολογήστε όρο αναζήτησης></translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index c18c65a4..1941d6ea 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -96,7 +96,7 @@ <translation id="129553762522093515">Recently closed</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />Try clearing your cookies<ph name="END_LINK" /></translation> <translation id="1301324364792935241">Check your secure DNS settings</translation> -<translation id="1307966114820526988">Deprecated Features</translation> +<translation id="1307966114820526988">Deprecated features</translation> <translation id="131405271941274527"><ph name="URL" /> wants to send and receive info when you tap your phone on an NFC device</translation> <translation id="1314509827145471431">Bind right</translation> <translation id="1320233736580025032">Prc1 (Envelope)</translation> @@ -312,7 +312,7 @@ <translation id="2119867082804433120">Punch bottom right</translation> <translation id="2129079103035905234">Motion Sensors</translation> <translation id="2130448033692577677">The templates that you've specified may not be applied due to the DnsOverHttpsMode policy not being set.</translation> -<translation id="213826338245044447">Mobile Bookmarks</translation> +<translation id="213826338245044447">Mobile bookmarks</translation> <translation id="214556005048008348">Cancel payment</translation> <translation id="2147827593068025794">Background Sync</translation> <translation id="2148613324460538318">Add Card</translation> @@ -389,7 +389,7 @@ <translation id="2465402087343596252">Architecture-E</translation> <translation id="2465655957518002998">Choose delivery method</translation> <translation id="2465688316154986572">Staple</translation> -<translation id="2467694685043708798"><ph name="BEGIN_LINK" />Running Network Diagnostics<ph name="END_LINK" /></translation> +<translation id="2467694685043708798"><ph name="BEGIN_LINK" />Running network diagnostics<ph name="END_LINK" /></translation> <translation id="2469153820345007638">1-to-N order</translation> <translation id="2470767536994572628">When you edit annotations, this document will return to single-page view and its original rotation</translation> <translation id="2479410451996844060">Invalid search URL.</translation> @@ -636,6 +636,7 @@ <translation id="3487845404393360112">Tray 4</translation> <translation id="3495081129428749620">Find in page <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">File name:</translation> <translation id="3507936815618196901">Create a 3D map of your surroundings and track camera position</translation> <translation id="3512163584740124171">This policy is ignored because another policy from the same policy group has a higher priority.</translation> <translation id="3518941727116570328">Multiple objects handling</translation> @@ -1246,6 +1247,7 @@ <translation id="5895138241574237353">Restart</translation> <translation id="5895187275912066135">Issued On</translation> <translation id="5901630391730855834">Yellow</translation> +<translation id="5903264686717710770">Title:</translation> <translation id="5905445707201418379">Blocked according to <ph name="ORIGIN" />'s origin policy.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synced)</translation> <translation id="5913377024445952699">Screen capture paused</translation> @@ -1442,6 +1444,7 @@ <translation id="6687335167692595844">Font size requested</translation> <translation id="6689249931105087298">Relative with black point compression</translation> <translation id="6689271823431384964">Chrome is offering to save your cards in your Google account because you are signed in. You can change this behaviour in settings. The cardholder name comes from your account.</translation> +<translation id="6698381487523150993">Created:</translation> <translation id="6702919718839027939">Present</translation> <translation id="6710213216561001401">Previous</translation> <translation id="6710594484020273272"><Type search term></translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index d9311f1e..04a9a63 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -632,6 +632,7 @@ <translation id="3487845404393360112">Bandeja 4</translation> <translation id="3495081129428749620">Buscar en la página <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nombre de archivo:</translation> <translation id="3507936815618196901">Crear un mapa 3D de tu entorno y hacer un seguimiento de la posición de la cámara</translation> <translation id="3512163584740124171">Se ignora esta política porque otra del mismo grupo tiene prioridad.</translation> <translation id="3518941727116570328">Control de varios objetos</translation> @@ -1237,6 +1238,7 @@ <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido el</translation> <translation id="5901630391730855834">Amarillo</translation> +<translation id="5903264686717710770">Título:</translation> <translation id="5905445707201418379">Se bloqueó conforme a la política de origen de <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizado)</translation> <translation id="5913377024445952699">Se pausó la captura de pantalla</translation> @@ -1433,6 +1435,7 @@ <translation id="6687335167692595844">Se necesita el tamaño de la fuente</translation> <translation id="6689249931105087298">Relativo con la compresión de puntos negros</translation> <translation id="6689271823431384964">Como accediste a tu Cuenta de Google, Chrome te ofrece guardar tus tarjetas allí. Puedes modificar este comportamiento en la configuración. El nombre del titular de la tarjeta se obtiene de tu cuenta.</translation> +<translation id="6698381487523150993">Creado:</translation> <translation id="6702919718839027939">Presente</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Escribe el término de búsqueda></translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 3762324..e61b287b 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Bandeja 4</translation> <translation id="3495081129428749620">Buscar en la página <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nombre:</translation> <translation id="3507936815618196901">Crear un mapa 3D de tu entorno y hacer un seguimiento de la posición de la cámara</translation> <translation id="3512163584740124171">Se ha ignorado esta política porque existe otra en el mismo grupo de políticas con mayor prioridad.</translation> <translation id="3518941727116570328">Gestión de varios objetos</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido el</translation> <translation id="5901630391730855834">Amarillo</translation> +<translation id="5903264686717710770">Título:</translation> <translation id="5905445707201418379">Se ha bloqueado según la política de origen de <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizado)</translation> <translation id="5913377024445952699">Grabación de pantalla pausada</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Tamaño de fuente solicitado</translation> <translation id="6689249931105087298">Relativo con compresión de puntos negros</translation> <translation id="6689271823431384964">Chrome te ofrece guardar las tarjetas en tu cuenta de Google porque has iniciado sesión. Puedes cambiar esta opción en los ajustes. El nombre del titular procede de tu cuenta.</translation> +<translation id="6698381487523150993">Creado:</translation> <translation id="6702919718839027939">Presentar</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Introducir término de búsqueda></translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 47b3c09..c0ee2552 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -636,6 +636,7 @@ <translation id="3487845404393360112">Salv 4</translation> <translation id="3495081129428749620">Lehelt otsimine <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Faili nimi:</translation> <translation id="3507936815618196901">Teid ümbritsevast 3D-kaardi loomine ja kaamera asendi jälgimine</translation> <translation id="3512163584740124171">Seda reeglit eiratakse, kuna sama reegligrupi teisel reeglil on kõrgem prioriteet.</translation> <translation id="3518941727116570328">Mitme objekti käsitlemine</translation> @@ -1246,6 +1247,7 @@ <translation id="5895138241574237353">Taaskäivitamine</translation> <translation id="5895187275912066135">Väljastamiskuupäev</translation> <translation id="5901630391730855834">Kollane</translation> +<translation id="5903264686717710770">Pealkiri:</translation> <translation id="5905445707201418379">Blokeeritud saidi <ph name="ORIGIN" /> lähtekohareegli tõttu.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sünkroonitud)</translation> <translation id="5913377024445952699">Ekraanikuva jäädvustamine on peatatud</translation> @@ -1442,6 +1444,7 @@ <translation id="6687335167692595844">Fondi taotletud suurus</translation> <translation id="6689249931105087298">Suhteline, musta punkti tihendamisega</translation> <translation id="6689271823431384964">Chrome pakub kaartide salvestamist teie Google'i kontole, kuna olete sisse logitud. Seda käitumist saab seadetes muuta. Kaardiomaniku nimi pärineb teie kontolt.</translation> +<translation id="6698381487523150993">Loodud:</translation> <translation id="6702919718839027939">Esitlemine</translation> <translation id="6710213216561001401">Eelmine</translation> <translation id="6710594484020273272"><Sisestage otsingutermin></translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 68363c8..cc9541c 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -1427,6 +1427,7 @@ <translation id="6687335167692595844">Eskatutako letra-tamaina</translation> <translation id="6689249931105087298">Erlatiboa, puntu beltzen konprimaketarekin</translation> <translation id="6689271823431384964">Saioa hasita duzunez, txartelak Google-ko kontuan gordetzeko aukera ematen dizu Chrome-k. Aukera hori aldatzeko, joan Ezarpenak atalera. Txartelaren titularraren izena kontutik hartu da.</translation> +<translation id="6698381487523150993">Sortze-data:</translation> <translation id="6702919718839027939">Aurkeztu</translation> <translation id="6710213216561001401">Aurrekoa</translation> <translation id="6710594484020273272"><Idatzi bilaketa-hitza></translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 25cd8d1..c21f0e9 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -635,6 +635,7 @@ <translation id="3487845404393360112">سینی ۴</translation> <translation id="3495081129428749620">یافتن در صفحه <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">نام فایل:</translation> <translation id="3507936815618196901">ایجاد نقشه سهبعدی از محیط و ردیابی موقعیت دوربین</translation> <translation id="3512163584740124171">این خطمشی، چون خطمشی دیگری از همین گروه خطمشی اولویت بالاتری دارد، لحاظ نمیشود.</translation> <translation id="3518941727116570328">کار با چند شیء</translation> @@ -1441,6 +1442,7 @@ <translation id="6687335167692595844">اندازه قلم درخواست شد</translation> <translation id="6689249931105087298">نسبی با فشردهسازی نقطه سیاه</translation> <translation id="6689271823431384964">چون به سیستم وارد شدهاید، Chrome پیشنهاد میکند کارتها را در حساب Google ذخیره کنید. در تنظیمات میتوانید این رفتار را تغییر دهید. نام دارنده کارت از حساب شما گرفته شده است.</translation> +<translation id="6698381487523150993">ایجاد شده:</translation> <translation id="6702919718839027939">ارائه کردن</translation> <translation id="6710213216561001401">قبلی</translation> <translation id="6710594484020273272"><عبارت جستجو را تایپ کنید></translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index bf979ff..d6f99cc 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -638,6 +638,7 @@ <translation id="3487845404393360112">Lokero 4</translation> <translation id="3495081129428749620">Hae sivulta <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Tiedostonimi:</translation> <translation id="3507936815618196901">Luo 3D-kartta ympäristöstäsi ja seuraa kameran asentoa</translation> <translation id="3512163584740124171">Tämä käytäntö ohitetaan, koska saman käytäntöryhmän toisella käytännöllä on korkeampi prioriteetti.</translation> <translation id="3518941727116570328">Useiden objektien käsittely</translation> @@ -1248,6 +1249,7 @@ <translation id="5895138241574237353">Käynnistä uudelleen</translation> <translation id="5895187275912066135">Myönnetty</translation> <translation id="5901630391730855834">Keltainen</translation> +<translation id="5903264686717710770">Otsikko:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> estää tämän alkuperäkäytännössään.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synkronoitu)</translation> <translation id="5913377024445952699">Näytön tallennus keskeytetty</translation> @@ -1444,6 +1446,7 @@ <translation id="6687335167692595844">Fonttikokoa pyydetty</translation> <translation id="6689249931105087298">Suhteellinen mustan pisteen pakkauksella</translation> <translation id="6689271823431384964">Chrome tarjoaa korttien tallentamista Google-tilillesi, koska olet kirjautuneena sisään. Voit muuttaa tätä koska tahansa asetuksista. Kortinhaltijan nimi on peräisin tililtäsi.</translation> +<translation id="6698381487523150993">Luomispvm:</translation> <translation id="6702919718839027939">Esitystila</translation> <translation id="6710213216561001401">Edellinen</translation> <translation id="6710594484020273272"><Anna hakukysely></translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 9328c3b..dfd278f 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Tray 4</translation> <translation id="3495081129428749620">Hanapin sa page <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">File name:</translation> <translation id="3507936815618196901">Gumawa ng 3D na mapa ng iyong kapaligiran at subaybayan ang posisyon ng camera</translation> <translation id="3512163584740124171">Binabalewala ang patakarang ito dahil may isa pang patakaran mula sa parehong pangkat ng patakaran na may mas mataas na priyoridad.</translation> <translation id="3518941727116570328">Pangangasiwa sa maraming object</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">I-restart</translation> <translation id="5895187275912066135">Ibinigay Noong</translation> <translation id="5901630391730855834">Dilaw</translation> +<translation id="5903264686717710770">Pamagat:</translation> <translation id="5905445707201418379">Na-black ayon sa patakaran ng pinagmulan ng <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (naka-sync)</translation> <translation id="5913377024445952699">Na-pause ang screen capture</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Hiniling na laki ng font</translation> <translation id="6689249931105087298">Kaugnay sa black point compression</translation> <translation id="6689271823431384964">Nag-aalok ang Chrome na i-save ang iyong mga card sa Google Account mo dahil naka-sign in ka. Puwede mong baguhin ang gawing ito sa mga setting. Mula sa iyong account ang pangalan ng cardholder.</translation> +<translation id="6698381487523150993">Nalikha:</translation> <translation id="6702919718839027939">I-present</translation> <translation id="6710213216561001401">Nauna</translation> <translation id="6710594484020273272"><I-type ang termino para sa paghahanap></translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index a676af6..4efc00e 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -1432,6 +1432,7 @@ <translation id="6687335167692595844">Taille de police demandée</translation> <translation id="6689249931105087298">Valeur relative avec compression des points noirs</translation> <translation id="6689271823431384964">Chrome vous propose d'enregistrer vos cartes dans votre compte Google parce que vous y êtes connecté. Vous pouvez modifier ce comportement dans les paramètres. Le nom du détenteur de la carte provient de votre compte.</translation> +<translation id="6698381487523150993">Créé :</translation> <translation id="6702919718839027939">Présentation</translation> <translation id="6710213216561001401">Précédent</translation> <translation id="6710594484020273272"><Entrez un terme de recherche></translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index efcda375..572a632 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -635,6 +635,7 @@ <translation id="3487845404393360112">Bac 4</translation> <translation id="3495081129428749620">Rechercher sur la page <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nom du fichier :</translation> <translation id="3507936815618196901">Créer un plan 3D de votre environnement et suivre la position de la caméra</translation> <translation id="3512163584740124171">Cette règle est ignorée, car une autre issue du même groupe de règles présente une priorité plus élevée.</translation> <translation id="3518941727116570328">Gestion d'objets multiples</translation> @@ -1245,6 +1246,7 @@ <translation id="5895138241574237353">Redémarrer</translation> <translation id="5895187275912066135">Émis le</translation> <translation id="5901630391730855834">Jaune</translation> +<translation id="5903264686717710770">Titre :</translation> <translation id="5905445707201418379">Bloqué selon la règle relative à l'origine de <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronisés)</translation> <translation id="5913377024445952699">Capture d'écran mise en pause</translation> @@ -1441,6 +1443,7 @@ <translation id="6687335167692595844">Taille de police demandée</translation> <translation id="6689249931105087298">Valeur relative avec compression des points noirs</translation> <translation id="6689271823431384964">Chrome propose d'enregistrer vos cartes dans votre compte Google, car vous êtes connecté. Vous pouvez modifier ce comportement dans les paramètres. Le nom du titulaire de la carte provient de votre compte.</translation> +<translation id="6698381487523150993">Créé :</translation> <translation id="6702919718839027939">Présenter</translation> <translation id="6710213216561001401">Précédent</translation> <translation id="6710594484020273272"><Saisissez le terme de recherche></translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index fb0d3932..3210616 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -1440,6 +1440,7 @@ <translation id="6687335167692595844">Tamaño do tipo de letra solicitado</translation> <translation id="6689249931105087298">Relativo con compresión de puntos negros</translation> <translation id="6689271823431384964">Chrome permíteche gardar as túas tarxetas na túa Conta de Google porque tes a sesión iniciada. Podes cambiar esta opción na configuración cando queiras. O nome do titular da tarxeta procede da túa conta.</translation> +<translation id="6698381487523150993">Creada:</translation> <translation id="6702919718839027939">Presentar</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Escribe un termo de busca></translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 250f1b2..896f13d 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">ટ્રે 4</translation> <translation id="3495081129428749620">પેજ <ph name="PAGE_TITLE" />માં શોધો</translation> +<translation id="350069200438440499">ફાઇલનું નામ:</translation> <translation id="3507936815618196901">તમારી આજુબાજુનો 3D નકશો બનાવો અને કૅમેરાની સ્થિતિ ટ્રૅક કરો</translation> <translation id="3512163584740124171">આ નીતિને અવગણવામાં આવે છે કારણ કે સમાન નીતિ ગ્રૂપની બીજી નીતિ ઉચ્ચ પ્રાથમિકતા ધરાવે છે.</translation> <translation id="3518941727116570328">એકથી વધુ ઑબ્જેક્ટ હૅન્ડલ કરવા</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">પુનઃપ્રારંભ કરો</translation> <translation id="5895187275912066135">ના રોજ રજૂ કરાયું</translation> <translation id="5901630391730855834">પીળો</translation> +<translation id="5903264686717710770">શીર્ષક:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" />ની ઑરિજિન પૉલિસી અનુસાર બ્લૉક કરેલી છે.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (સમન્વયિત)</translation> <translation id="5913377024445952699">સ્ક્રીન કૅપ્ચરની સુવિધા થોભાવવામાં આવી છે</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">ફોન્ટના કદ માટે વિનંતી કરી</translation> <translation id="6689249931105087298">કાળા પૉઇન્ટને નાનો કરવા સંબંધિત</translation> <translation id="6689271823431384964">તમે સાઇન ઇન કરેલું છે તેથી Chrome તમને તમારા કાર્ડ તમારા Google એકાઉન્ટમાં સાચવવાની ઑફર કરે છે. તમે સેટિંગમાં આ વર્તણૂકને બદલી શકો છો. કાર્ડધારકનું નામ તમારા એકાઉન્ટમાંથી આવે છે.</translation> +<translation id="6698381487523150993">બનાવેલા:</translation> <translation id="6702919718839027939">પ્રસ્તુત કરો</translation> <translation id="6710213216561001401">પાછલી</translation> <translation id="6710594484020273272"><શોધ શબ્દ લખો></translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index ad1e2a5..3db9a8f 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -634,6 +634,7 @@ <translation id="3487845404393360112">ट्रे 4</translation> <translation id="3495081129428749620">पेज में ढूंढें <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">फ़ाइल नाम:</translation> <translation id="3507936815618196901">आपके आस-पास की जगह का 3D मैप बनाना और कैमरे की स्थिति ट्रैक करना चाहती है</translation> <translation id="3512163584740124171">इस नीति को अनदेखा कर दिया गया है, क्योंकि इसी नीति समूह की दूसरी नीति को ज़्यादा प्राथमिकता दी गई है.</translation> <translation id="3518941727116570328">कई ऑब्जेक्ट को हैंडल करना</translation> @@ -1244,6 +1245,7 @@ <translation id="5895138241574237353">फिर से प्रारंभ करें</translation> <translation id="5895187275912066135">जारी करने की तारीख</translation> <translation id="5901630391730855834">पीला</translation> +<translation id="5903264686717710770">शीर्षक :</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> की मूल नीति के मुताबिक रोक लगाई गई.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (सिंक किया गया)</translation> <translation id="5913377024445952699">स्क्रीन को कैप्चर करने की सुविधा रोक दी गई है</translation> @@ -1440,6 +1442,7 @@ <translation id="6687335167692595844">फ़ॉन्ट साइज़ का अनुरोध किया गया</translation> <translation id="6689249931105087298">ब्लैक पॉइंट कंप्रेशन से मिलता-जुलता</translation> <translation id="6689271823431384964">आपके साइन इन किए होने की वजह से, Chrome आपको Google खाते में कार्ड सेव करने की सुविधा देता है. आप 'सेटिंग' में जाकर इसे बदल सकते हैं. कार्डधारक का नाम आपके खाते से लिया जाता है.</translation> +<translation id="6698381487523150993">निर्मित:</translation> <translation id="6702919718839027939">प्रज़ेंट</translation> <translation id="6710213216561001401">पिछला</translation> <translation id="6710594484020273272"><खोज शब्द लिखें></translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 5d23591..5099f834 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Ladica 4</translation> <translation id="3495081129428749620">Traži na stranici <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Naziv:</translation> <translation id="3507936815618196901">Izradite 3D kartu svojeg okruženja i pratite položaj kamere</translation> <translation id="3512163584740124171">To se pravilo zanemaruje jer drugo pravilo iz iste grupe pravila ima viši prioritet.</translation> <translation id="3518941727116570328">Obrada više predmeta</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Ponovno pokreni</translation> <translation id="5895187275912066135">Izdano</translation> <translation id="5901630391730855834">Žuta</translation> +<translation id="5903264686717710770">Naslov:</translation> <translation id="5905445707201418379">Blokirano izvornim pravilom koje određuje <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinkronizirano)</translation> <translation id="5913377024445952699">Snimanje zaslona je pauzirano</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Zatražena je veličina fonta</translation> <translation id="6689249931105087298">Relativno s kompresijom crne točke</translation> <translation id="6689271823431384964">Chrome vam nudi spremanje vaših kartica na vaš Google račun jer ste prijavljeni. To ponašanje možete promijeniti u postavkama. Ime nositelja kartice preuzeto je s vašeg računa.</translation> +<translation id="6698381487523150993">Autor/ica:</translation> <translation id="6702919718839027939">Prezentacija</translation> <translation id="6710213216561001401">Prethodno</translation> <translation id="6710594484020273272"><Upišite pojam za pretraživanje></translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 626e6d1a..9bc9721 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -633,6 +633,7 @@ <translation id="3487845404393360112">4. tálca</translation> <translation id="3495081129428749620">Keresés a következő oldalon: <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Fájlnév?</translation> <translation id="3507936815618196901">3D-s térkép készítése az Ön környezetéről és a kamera pozíciójának követése</translation> <translation id="3512163584740124171">A böngésző figyelmen kívül hagyja ezt a házirendet, mert magasabb prioritással rendelkezik egy másik házirend ugyanabból a házirendcsoportból.</translation> <translation id="3518941727116570328">Több elem kezelése</translation> @@ -745,7 +746,7 @@ <translation id="3962859241508114581">Előző szám</translation> <translation id="3963721102035795474">Olvasási mód</translation> <translation id="3963837677003247395">Folytatja manuálisan?</translation> -<translation id="3964661563329879394">{COUNT,plural, =0{Nincs}=1{ 1 webhelytől }other{# webhelytől }}</translation> +<translation id="3964661563329879394">{COUNT,plural, =0{Nincs}=1{ 1 webhelyről }other{# webhelyről }}</translation> <translation id="397105322502079400">Számítás…</translation> <translation id="3973234410852337861">A(z) <ph name="HOST_NAME" /> le van tiltva</translation> <translation id="3987405730340719549">A Chrome azt észlelte, hogy ez a webhely hamis vagy megtévesztő szándékú lehet. @@ -1243,6 +1244,7 @@ <translation id="5895138241574237353">Újraindítás</translation> <translation id="5895187275912066135">Kiállítva</translation> <translation id="5901630391730855834">Sárga</translation> +<translation id="5903264686717710770">Megszólítás:</translation> <translation id="5905445707201418379">Letiltva a(z) <ph name="ORIGIN" /> eredetházirendje miatt.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (szinkronizálva)</translation> <translation id="5913377024445952699">Képernyőrögzítés szüneteltetve</translation> @@ -1439,6 +1441,7 @@ <translation id="6687335167692595844">Kért betűméret</translation> <translation id="6689249931105087298">Relatív, feketepontos tömörítéssel</translation> <translation id="6689271823431384964">A Chrome felajánlja a kártyák mentését az Ön Google-fiókjába, mert be van jelentkezve. A beállítások között ezt bármikor módosíthatja. A kártyatulajdonos nevének forrása az Ön fiókja.</translation> +<translation id="6698381487523150993">Létrehozva:</translation> <translation id="6702919718839027939">Prezentáció</translation> <translation id="6710213216561001401">Előző</translation> <translation id="6710594484020273272"><Írja be a keresési kifejezést></translation> @@ -1687,7 +1690,7 @@ <translation id="7673278391011283842">6. postaláda</translation> <translation id="7676643023259824263">Vágólapon lévő szöveg keresése, <ph name="TEXT" /></translation> <translation id="7682287625158474539">Szállítási cím</translation> -<translation id="7687186412095877299">Kitölti a fizetési űrlapokat az Ön mentett fizetési módjaival</translation> +<translation id="7687186412095877299">Kitölti a fizetési űrlapokat az Ön mentett fizetési adataival</translation> <translation id="7687305263118037187">Újrapróbálkozás időtúllépése</translation> <translation id="7693583928066320343">Fogadott oldalsorrend</translation> <translation id="7697066736081121494">Prc8 (boríték)</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index d783a3c1..fc3ff94 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -1443,6 +1443,7 @@ <translation id="6687335167692595844">Տառաչափի հարցումն ուղարկվել է</translation> <translation id="6689249931105087298">Հարաբերական՝ սև կետի սեղմումով</translation> <translation id="6689271823431384964">Chrome-ն առաջարկում է պահել քարտերը ձեր Google հաշվում, քանի որ դուք մտել եք հաշիվ: Այս գործառույթը կարող եք փոխել կարգավորումներում։ Քարտապանի անունը վերցվել է ձեր հաշվից:</translation> +<translation id="6698381487523150993">Ստեղծվել է`</translation> <translation id="6702919718839027939">Ներկայացում</translation> <translation id="6710213216561001401">Նախորդը</translation> <translation id="6710594484020273272"><Մուտքագրեք որոնման հարցումը></translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index ea45c0d..55af048 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -632,6 +632,7 @@ <translation id="3484560055331845446">Anda dapat kehilangan akses ke Akun Google Anda. Chrome merekomendasikan untuk mengubah sandi Anda sekarang. Anda akan diminta untuk login.</translation> <translation id="3487845404393360112">Baki 4</translation> <translation id="3495081129428749620">Cari pada halaman <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nama file:</translation> <translation id="3507936815618196901">Membuat peta 3D untuk area di sekeliling Anda dan melacak posisi kamera</translation> <translation id="3512163584740124171">Kebijakan ini diabaikan karena kebijakan lain dari grup kebijakan yang sama memiliki prioritas lebih tinggi.</translation> <translation id="3518941727116570328">Penanganan beberapa objek</translation> @@ -1237,6 +1238,7 @@ <translation id="5895138241574237353">Mulai Ulang</translation> <translation id="5895187275912066135">Diterbitkan Pada</translation> <translation id="5901630391730855834">Kuning</translation> +<translation id="5903264686717710770">Judul:</translation> <translation id="5905445707201418379">Diblokir sesuai dengan kebijakan asal <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (disinkronkan)</translation> <translation id="5913377024445952699">Tangkapan layar dijeda</translation> @@ -1433,6 +1435,7 @@ <translation id="6687335167692595844">Ukuran font diminta</translation> <translation id="6689249931105087298">Relatif dengan kompresi titik hitam</translation> <translation id="6689271823431384964">Chrome menawarkan untuk menyimpan informasi kartu ke Akun Google Anda karena Anda sedang login. Anda dapat mengubah perilaku ini di setelan. Nama pemegang kartu berasal dari akun Anda.</translation> +<translation id="6698381487523150993">Dibuat:</translation> <translation id="6702919718839027939">Presentasi</translation> <translation id="6710213216561001401">Sebelumnya</translation> <translation id="6710594484020273272"><Ketik istilah penelusuran></translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 1b3786f..e29d544 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -1444,6 +1444,7 @@ <translation id="6687335167692595844">Beðið um leturstærð</translation> <translation id="6689249931105087298">Háð með þjöppun svartra punkta</translation> <translation id="6689271823431384964">Chrome býður þér að vista kortin þín á Google reikningnum vegna þess að þú ert innskráð(ur). Þú getur breytt þessu í stillingunum. Nafn korthafa er sótt af reikningnum þínum.</translation> +<translation id="6698381487523150993">Búið til:</translation> <translation id="6702919718839027939">Kynna</translation> <translation id="6710213216561001401">Til baka</translation> <translation id="6710594484020273272"><Sláðu inn leitarorð></translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 6fa802de..c9e50b9e 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -634,6 +634,7 @@ <translation id="3487845404393360112">Vassoio 4</translation> <translation id="3495081129428749620">Trova nella pagina <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nome file:</translation> <translation id="3507936815618196901">Creare una mappa 3D dell'ambiente circostante e monitorare la posizione della fotocamera</translation> <translation id="3512163584740124171">Questo criterio viene ignorato perché un altro criterio dello stesso gruppo ha una priorità più elevata.</translation> <translation id="3518941727116570328">Gestione di più oggetti</translation> @@ -1244,6 +1245,7 @@ <translation id="5895138241574237353">Riavvia</translation> <translation id="5895187275912066135">Emesso in data</translation> <translation id="5901630391730855834">Giallo</translation> +<translation id="5903264686717710770">Titolo:</translation> <translation id="5905445707201418379">Bloccato secondo la norma di partenza di <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizzati)</translation> <translation id="5913377024445952699">Acquisizione schermo in pausa</translation> @@ -1439,6 +1441,7 @@ <translation id="6687335167692595844">Dimensioni carattere richieste</translation> <translation id="6689249931105087298">Relativo con compressione del punto nero</translation> <translation id="6689271823431384964">Chrome chiede se vuoi salvare le tue carte nel tuo Account Google perché hai eseguito l'accesso. Puoi modificare questo comportamento nelle impostazioni. Il nome del titolare della carta proviene dal tuo account.</translation> +<translation id="6698381487523150993">Data creazione:</translation> <translation id="6702919718839027939">Presentazione</translation> <translation id="6710213216561001401">Precedente</translation> <translation id="6710594484020273272"><Digita un termine di ricerca></translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 5b07ae1..a9f9bda 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">מגש 4</translation> <translation id="3495081129428749620">חיפוש בדף <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">שם הקובץ:</translation> <translation id="3507936815618196901">ליצור מפה בתלת ממד של הסביבה שלך ולעקוב אחר מיקום המצלמה</translation> <translation id="3512163584740124171">המערכת מתעלמת מהמדיניות הזו כי יש מדיניות אחרת מאותה קבוצה של הגדרות מדיניות שקיבלה עדיפות גבוהה יותר.</translation> <translation id="3518941727116570328">טיפול באובייקטים מרובים</translation> @@ -1250,6 +1251,7 @@ <translation id="5895138241574237353">הפעלה מחדש</translation> <translation id="5895187275912066135">הונפק בתאריך</translation> <translation id="5901630391730855834">צהוב</translation> +<translation id="5903264686717710770">כותרת:</translation> <translation id="5905445707201418379">נחסם בהתאם למדיניות המקור של <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (מסונכרנים)</translation> <translation id="5913377024445952699">אפשרות צילום המסך מושהית</translation> @@ -1446,6 +1448,7 @@ <translation id="6687335167692595844">גודל הגופן שהתבקש</translation> <translation id="6689249931105087298">יחסי עם דחיסת נקודות שחורות</translation> <translation id="6689271823431384964">מאחר שנכנסת לחשבון, Chrome מציע לשמור את הכרטיסים שלך בחשבון Google. אפשר לשנות את ההתנהגות הזאת בהגדרות. שם בעל הכרטיס מגיע מהחשבון שלך.</translation> +<translation id="6698381487523150993">נוצר:</translation> <translation id="6702919718839027939">הצגה</translation> <translation id="6710213216561001401">הקודם</translation> <translation id="6710594484020273272"><יש להקליד מונח חיפוש></translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 1531663..afe390e 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -631,6 +631,7 @@ <translation id="3487845404393360112">トレイ 4</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> ページ内を検索</translation> +<translation id="350069200438440499">ファイル名:</translation> <translation id="3507936815618196901">周囲の 3D マップの作成とカメラ位置の追跡</translation> <translation id="3512163584740124171">より優先度の高いポリシーが同じポリシー グループにあるため、このポリシーは無視されます。</translation> <translation id="3518941727116570328">複数オブジェクトの処理</translation> @@ -1236,6 +1237,7 @@ <translation id="5895138241574237353">再起動</translation> <translation id="5895187275912066135">発行日</translation> <translation id="5901630391730855834">黄</translation> +<translation id="5903264686717710770">タイトル:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> のオリジン ポリシーに沿ってブロックしました。</translation> <translation id="5908541034548427511"><ph name="TYPE_1" />(同期済み)</translation> <translation id="5913377024445952699">画面キャプチャが一時停止されました</translation> @@ -1432,6 +1434,7 @@ <translation id="6687335167692595844">リクエストされたフォントサイズ</translation> <translation id="6689249931105087298">相対的(黒点の補正あり)</translation> <translation id="6689271823431384964">ログインしている場合は、その Google アカウントにカードを保存できます。この動作は設定で変更できます。カード名義人はアカウントから取得されます。</translation> +<translation id="6698381487523150993">作成:</translation> <translation id="6702919718839027939">プレゼンテーション</translation> <translation id="6710213216561001401">前へ</translation> <translation id="6710594484020273272"><検索キーワードを入力></translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 5da324a..58b6d4e9 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -1432,6 +1432,7 @@ <translation id="6687335167692595844">შრიფტის ზომა მოთხოვნილია</translation> <translation id="6689249931105087298">ფარდობითი, შავი წერტილის შეკუმშვით</translation> <translation id="6689271823431384964">თქვენს Google ანგარიშში ბარათების შენახვას Chrome გთავაზობთ, ვინაიდან შესული ხართ სისტემაში. ამ ქცევის შეცვლა შეგიძლიათ პარამეტრებიდან. ბარათის მფლობელის სახელი მიღებულია თქვენი ანგარიშიდან.</translation> +<translation id="6698381487523150993">შექმნილია:</translation> <translation id="6702919718839027939">პრეზენტირება</translation> <translation id="6710213216561001401">წინა</translation> <translation id="6710594484020273272"><აკრიფეთ საძიებო ფრაზა></translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 6ecdad1..01bf0a2 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1442,6 +1442,7 @@ <translation id="6687335167692595844">Қаріп өлшемі сұралды</translation> <translation id="6689249931105087298">Қара нүктені сығуға қатысты</translation> <translation id="6689271823431384964">Сіз есептік жазбаға кіргендіктен, Chrome браузері карталарыңызды Google есептік жазбасына сақтауды ұсынып отыр. Мұны "Параметрлер" бөлімінен өзгертуіңізге болады. Карта иесінің аты-жөнін есептік жазбаңыздан алынады.</translation> +<translation id="6698381487523150993">Жасалған кезі:</translation> <translation id="6702919718839027939">Презентация</translation> <translation id="6710213216561001401">Алдыңғы</translation> <translation id="6710594484020273272"><Іздеу терминін теру></translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 56374665e..6adc40d1 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -1447,6 +1447,7 @@ <translation id="6687335167692595844">បានស្នើសុំទំហំពុម្ពអក្សរ</translation> <translation id="6689249931105087298">ពាក់ព័ន្ធនឹងការបង្ហាប់ចំណុចខ្មៅ</translation> <translation id="6689271823431384964">Chrome ផ្ដល់ជូនជម្រើសរក្សាទុកបណ្ណរបស់អ្នកនៅក្នុងគណនី Google របស់អ្នក ដោយសារអ្នកចូលគណនី។ អ្នកអាចប្ដូរសកម្មភាពនេះបាននៅក្នុងការកំណត់។ ឈ្មោះម្ចាស់បណ្ណគឺបានមកពីគណនីរបស់អ្នក។</translation> +<translation id="6698381487523150993">បានបង្កើត៖</translation> <translation id="6702919718839027939">បង្ហាញ</translation> <translation id="6710213216561001401">មុន</translation> <translation id="6710594484020273272"><វាយបញ្ចូលពាក្យដែលត្រូវស្វែងរក></translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 91eb6a2..74b5921 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -631,6 +631,7 @@ <translation id="3487845404393360112">ಟ್ರೇ 4</translation> <translation id="3495081129428749620">ಪುಟದಲ್ಲಿ ಹುಡುಕಿ <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">ಫೈಲ್ ಹೆಸರು:</translation> <translation id="3507936815618196901">ನಿಮ್ಮ ಸುತ್ತಮುತ್ತಲಿನ 3D ನಕ್ಷೆಗಳನ್ನು ರಚಿಸಿ ಮತ್ತು ಕ್ಯಾಮರಾ ಸ್ಥಿತಿಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ</translation> <translation id="3512163584740124171">ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ ಏಕೆಂದರೆ, ಅದೇ ಕಾರ್ಯನೀತಿಯ ಗುಂಪಿನ ಮತ್ತೊಂದು ಕಾರ್ಯನೀತಿಯು ಹೆಚ್ಚಿನ ಆದ್ಯತೆಯನ್ನು ಹೊಂದಿದೆ.</translation> <translation id="3518941727116570328">ಹಲವಾರು ಆಬ್ಜೆಕ್ಟ್ಗಳ ನಿರ್ವಹಣೆ</translation> @@ -1235,6 +1236,7 @@ <translation id="5895138241574237353">ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="5895187275912066135">ರಂದು ನೀಡಲಾಗಿದೆ</translation> <translation id="5901630391730855834">ಹಳದಿ</translation> +<translation id="5903264686717710770">ಶೀರ್ಷಿಕೆ:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> ನ ಮೂಲ ಕಾರ್ಯನೀತಿಗೆ ಅನುಗುಣವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ)</translation> <translation id="5913377024445952699">ಸ್ಕ್ರೀನ್ ಕ್ಯಾಪ್ಚರ್ ಅನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ</translation> @@ -1430,6 +1432,7 @@ <translation id="6687335167692595844">ವಿನಂತಿಸಲಾದ ಫಾಂಟ್ ಗಾತ್ರ</translation> <translation id="6689249931105087298">ಕಪ್ಪು ಬಿಂದು ಕಂಪ್ರೆಶ್ಶನ್ಗೆ ಸಂಬಂಧಿಸಿದ</translation> <translation id="6689271823431384964">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಕಾರಣದಿಂದಾಗಿ, ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಕಾರ್ಡ್ಗಳನ್ನು ಉಳಿಸಲು Chrome ಅವಕಾಶ ನೀಡುತ್ತಿದೆ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಬದಲಿಸಬಹುದು. ಕಾರ್ಡ್ ಹೋಲ್ಡರ್ ಹೆಸರು ನಿಮ್ಮ ಖಾತೆಯಿಂದ ಬರುತ್ತದೆ.</translation> +<translation id="6698381487523150993">ರಚಿಸಲಾಗಿದೆ:</translation> <translation id="6702919718839027939">ಪ್ರಸ್ತುತಿ ಮೋಡ್</translation> <translation id="6710213216561001401">ಹಿಂದಿನದು</translation> <translation id="6710594484020273272"><ಹುಡುಕಾಟದ ಪದ ಟೈಪ್ ಮಾಡಿ></translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index b84656c6..72d555d 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -631,6 +631,7 @@ <translation id="3487845404393360112">트레이 4</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> 페이지에서 찾기</translation> +<translation id="350069200438440499">파일 이름:</translation> <translation id="3507936815618196901">주변 환경의 3D 지도를 생성하고 카메라 위치를 추적</translation> <translation id="3512163584740124171">동일한 정책 그룹에 있는 다른 정책이 우선순위가 높기 때문에 이 정책은 무시됩니다.</translation> <translation id="3518941727116570328">다중 객체 처리</translation> @@ -1236,6 +1237,7 @@ <translation id="5895138241574237353">다시 시작</translation> <translation id="5895187275912066135">발급일:</translation> <translation id="5901630391730855834">노란색</translation> +<translation id="5903264686717710770">직책:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" />의 기존 정책에 따라 차단됨</translation> <translation id="5908541034548427511"><ph name="TYPE_1" />(동기화됨)</translation> <translation id="5913377024445952699">화면 캡처가 일시중지됨</translation> @@ -1432,6 +1434,7 @@ <translation id="6687335167692595844">글꼴 크기 요청됨</translation> <translation id="6689249931105087298">상대적이며 흑점 보정 포함</translation> <translation id="6689271823431384964">Google 계정에 로그인되어 있기 때문에 Chrome에서 계정에 카드를 저장할지 묻는 메시지가 표시됩니다. 설정에서 이 동작을 변경할 수 있습니다. 카드 소지자 이름은 계정에서 가져온 것입니다.</translation> +<translation id="6698381487523150993">생성됨:</translation> <translation id="6702919718839027939">발표</translation> <translation id="6710213216561001401">이전</translation> <translation id="6710594484020273272"><검색어 입력></translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 930e1456..0724a2a 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -1442,6 +1442,7 @@ <translation id="6687335167692595844">Ариптин өлчөмү суралды</translation> <translation id="6689249931105087298">Кара чекит кысуусуна тийиштүү</translation> <translation id="6689271823431384964">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди жөндөөлөргө өтүп, өзгөртүп койсоңуз болот. Картанын ээси – аккаунттун ээси болуп эсептелет.</translation> +<translation id="6698381487523150993">Түзүлгөн:</translation> <translation id="6702919718839027939">Презентация</translation> <translation id="6710213216561001401">Мурунку</translation> <translation id="6710594484020273272"><Изделүүчү сөздү териңиз></translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 7041cbef..fad3761 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -1443,6 +1443,7 @@ <translation id="6687335167692595844">ຂໍຂະໜາດຟອນແລ້ວ</translation> <translation id="6689249931105087298">ສຳພັນກັບການບີບຈຸດສີດຳ</translation> <translation id="6689271823431384964">Chrome ກຳລັງສະເໜີບັນທຶກບັດຂອງທ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານ ເພາະວ່າທ່ານເຂົ້າສູ່ລະບົບຢູ່. ທ່ານສາມາດປ່ຽນພຶດຕິກຳນີ້ໄດ້ໃນການຕັ້ງຄ່າ. ຊື່ຜູ້ຖືບັດມາຈາກບັນຊີຂອງທ່ານ.</translation> +<translation id="6698381487523150993">ສ້າງຂຶ້ນແລ້ວ:</translation> <translation id="6702919718839027939">ປັດຈຸບັນ</translation> <translation id="6710213216561001401">ຜ່ານມາ</translation> <translation id="6710594484020273272"><ພິມຄຳສັບການຄົ້ນຫາ></translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 0ad7c51e..8b0c966 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -638,6 +638,7 @@ <translation id="3487845404393360112">4 dėklas</translation> <translation id="3495081129428749620">Rasti puslapyje „<ph name="PAGE_TITLE" />“</translation> +<translation id="350069200438440499">Failo pav.:</translation> <translation id="3507936815618196901">Kurti jūsų aplinkos 3D žemėlapį ir stebėti kameros padėtį</translation> <translation id="3512163584740124171">Šios politikos nepaisoma, nes kitos politikos toje pačioje politikos grupėje prioritetas yra didesnis.</translation> <translation id="3518941727116570328">Kelių objektų apdorojimas</translation> @@ -1248,6 +1249,7 @@ <translation id="5895138241574237353">Paleisti iš naujo</translation> <translation id="5895187275912066135">Išduota</translation> <translation id="5901630391730855834">Geltona</translation> +<translation id="5903264686717710770">Pavadinimas:</translation> <translation id="5905445707201418379">Užblokuota vadovaujantis „<ph name="ORIGIN" />“ pradine politika.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinchronizuota)</translation> <translation id="5913377024445952699">Ekrano fiksavimas pristabdytas</translation> @@ -1444,6 +1446,7 @@ <translation id="6687335167692595844">Reikia nurodyti šrifto dydį</translation> <translation id="6689249931105087298">Santykinis su juodų taškų sutankinimu</translation> <translation id="6689271823431384964">„Chrome“ siūlo išsaugoti korteles „Google“ paskyroje, nes esate prisijungę. Šią elgseną galite pakeisti nustatymuose. Kortelės savininko vardas gaunamas iš jūsų paskyros.</translation> +<translation id="6698381487523150993">Sukurta:</translation> <translation id="6702919718839027939">Rodyti</translation> <translation id="6710213216561001401">Ankstesnė</translation> <translation id="6710594484020273272"><Įveskite paieškos terminą></translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 26f459d..23773d06 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -635,6 +635,7 @@ <translation id="3487845404393360112">4. paplāte</translation> <translation id="3495081129428749620">Meklēt lapā <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Faila vārds:</translation> <translation id="3507936815618196901">Izveidot jūsu apkārtnes 3D karti un izsekot kameras pozīciju</translation> <translation id="3512163584740124171">Šī politika tiek ignorēta, jo citai tās pašas politiku grupas politikai ir augstāka prioritāte.</translation> <translation id="3518941727116570328">Vairāku objektu apstrāde</translation> @@ -1244,6 +1245,7 @@ <translation id="5895138241574237353">Restartēt</translation> <translation id="5895187275912066135">Izsniegšanas datums</translation> <translation id="5901630391730855834">Dzeltena</translation> +<translation id="5903264686717710770">Nosaukums:</translation> <translation id="5905445707201418379">Bloķēts, pamatojoties uz <ph name="ORIGIN" /> izcelsmes politiku.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (veikta sinhronizācija)</translation> <translation id="5913377024445952699">Ekrānuzņēmumu izveide ir pārtraukta</translation> @@ -1440,6 +1442,7 @@ <translation id="6687335167692595844">Tika pieprasīts fonta lielums</translation> <translation id="6689249931105087298">Relatīva, ar melno punktu saspiešanu</translation> <translation id="6689271823431384964">Pārlūkprogrammā Chrome tiek piedāvāts saglabāt jūsu kartes Google kontā, jo esat pierakstījies. Varat mainīt šo darbību iestatījumos. Kartes īpašnieka vārds tiek iegūts no jūsu konta.</translation> +<translation id="6698381487523150993">Izveidots:</translation> <translation id="6702919718839027939">Prezentācija</translation> <translation id="6710213216561001401">Iepriekšējais</translation> <translation id="6710594484020273272"><Ierakstiet meklēšanas vienumu></translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 1655115..1fe86ec 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -1443,6 +1443,7 @@ <translation id="6687335167692595844">Побарана е големина на фонтот</translation> <translation id="6689249931105087298">Релативна, со компресија на црни точки</translation> <translation id="6689271823431384964">Chrome нуди да ви ги зачува картичките во вашата сметка на Google бидејќи сте најавени. Ваквото однесување може да го смените во поставки. Името на сопственикот на картичката доаѓа од сметката.</translation> +<translation id="6698381487523150993">Создадено:</translation> <translation id="6702919718839027939">Презентација</translation> <translation id="6710213216561001401">Претходно</translation> <translation id="6710594484020273272"><Внесете поим за пребарување></translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index e4dca21..3aaac01 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -633,6 +633,7 @@ <translation id="3487845404393360112">ട്രേ 4</translation> <translation id="3495081129428749620">പേജിൽ കണ്ടെത്തുക <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">ഫയല് നാമം:</translation> <translation id="3507936815618196901">നിങ്ങളുടെ ചുറ്റുപാടുകളുടെ 3D മാപ്പ് സൃഷ്ടിക്കാനും ക്യാമറയുടെ സ്ഥാനം ട്രാക്ക് ചെയ്യാനും</translation> <translation id="3512163584740124171">ഇതേ നയ ഗ്രൂപ്പിൽ നിന്നുള്ള മറ്റൊരു നയത്തിന് ഉയർന്ന മുൻഗണനയുള്ളതിനാൽ ഈ നയം അവഗണിച്ചു.</translation> <translation id="3518941727116570328">ഒന്നിലധികം ഒബ്ജക്റ്റുകൾ കൈകാര്യം ചെയ്യൽ</translation> @@ -1241,6 +1242,7 @@ <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation> <translation id="5895187275912066135">ഇനിപ്പറയുന്നദിവസം നല്കി</translation> <translation id="5901630391730855834">മഞ്ഞ</translation> +<translation id="5903264686717710770">ശീര്ഷകം:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> എന്നതിന്റെ ഉറവിട നയത്തിന് അനുസൃതമായി ബ്ലോക്ക് ചെയ്തു.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (സമന്വയിപ്പിച്ചത്)</translation> <translation id="5913377024445952699">സ്ക്രീൻ ക്യാപ്ചർ താൽക്കാലികമായി നിർത്തി</translation> @@ -1437,6 +1439,7 @@ <translation id="6687335167692595844">അഭ്യർത്ഥിച്ച ഫോണ്ട് വലുപ്പം</translation> <translation id="6689249931105087298">ബ്ലാക്ക് പോയിന്റ് കംപ്രഷനോട് കൂടിയ റിലേറ്റീവ്</translation> <translation id="6689271823431384964">നിങ്ങൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്നതിനാലാണ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ കാർഡുകൾ സംരക്ഷിക്കാമെന്ന് Chrome വാഗ്ദാനം ചെയ്യുന്നത്. ക്രമീകരണത്തിൽ ഈ രീതി മാറ്റാനാകും. കാർഡുടമയുടെ പേര് നിങ്ങളുടെ അക്കൗണ്ടിൽ നിന്നുമാണ് വന്നത്.</translation> +<translation id="6698381487523150993">സൃഷ്ടിച്ചു:</translation> <translation id="6702919718839027939">ദൃശ്യമാക്കുക</translation> <translation id="6710213216561001401">മുമ്പത്തേത്</translation> <translation id="6710594484020273272"><തിരയൽ പദം നൽകുക></translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 35267bd5..6b2be31 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -1443,6 +1443,7 @@ <translation id="6687335167692595844">Фонтын хэмжээг шаардсан</translation> <translation id="6689249931105087298">Хар цэгийн шахалттай харьцангуй</translation> <translation id="6689271823431384964">Та нэвтэрсэн тул Chrome таны картыг таны Google бүртгэлд хадгалахыг санал болгож байна. Та энэ ажиллах төлөвийг тохиргоонд өөрчилж болно. Карт эзэмшигчийн нэр таны бүртгэлээс гаралтай.</translation> +<translation id="6698381487523150993">Үүсгэсэн:</translation> <translation id="6702919718839027939">Үзүүлэн</translation> <translation id="6710213216561001401">Өмнөх</translation> <translation id="6710594484020273272"><Хайх зүйлээ шивнэ үү></translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 66b96f9..293b038 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -636,6 +636,7 @@ <translation id="3484560055331845446">तुम्ही तुमच्या Google खात्याचा ॲक्सेस कदाचित गमवाल. Chrome आता तुमचा पासवर्ड बदलण्याची शिफारस करते. तुम्हाला साइन इन करण्यासाठी सांगितले जाऊ शकते.</translation> <translation id="3487845404393360112">ट्रे ४</translation> <translation id="3495081129428749620">पेज <ph name="PAGE_TITLE" /> मध्ये शोधा</translation> +<translation id="350069200438440499">फाइल नाव:</translation> <translation id="3507936815618196901">तुमच्या आसपासच्या परिसराचा 3D नकाशा तयार करा आणि कॅमेर्याचे स्थान ट्रॅक करा</translation> <translation id="3512163584740124171">या धोरणाकडे दुर्लक्ष केले कारण त्याच धोरण गटातील दुसऱ्या धोरणाला उच्च प्राधान्य आहे.</translation> <translation id="3518941727116570328">एकापेक्षा अधिक ऑब्जेक्ट हाताळणी</translation> @@ -1246,6 +1247,7 @@ <translation id="5895138241574237353">रीस्टार्ट करा</translation> <translation id="5895187275912066135">रोजी जारी केले</translation> <translation id="5901630391730855834">पिवळा</translation> +<translation id="5903264686717710770">शीर्षक:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> च्या मूळ धोरणानुसार ब्लॉक केले आहे.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (सिंक केलेले)</translation> <translation id="5913377024445952699">स्क्रीन कॅप्चर थांबवले आहे</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">विनंती केलेल्या फॉंटचा आकार</translation> <translation id="6689249931105087298">काळ्या पॉइंटच्या काँप्रेशनशी संबंंधित</translation> <translation id="6689271823431384964">तुम्ही साइन इन केले असल्यामुळे Chrome तुमच्या Google खात्यामध्ये तुमची कार्डे सेव्ह करत आहे. तुम्ही हे वर्तन सेटिंग्जमध्ये बदलू शकता. कार्डधारकाचे नाव तुमच्या खात्यामधून घेतले जाते.</translation> +<translation id="6698381487523150993">तयार केलेले:</translation> <translation id="6702919718839027939">सादर करा</translation> <translation id="6710213216561001401">मागील</translation> <translation id="6710594484020273272"><शोध संज्ञा एंटर करा></translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index d3d5ed2..214740f1 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Dulang 4</translation> <translation id="3495081129428749620">Cari dalam halaman <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nama fail:</translation> <translation id="3507936815618196901">Buat peta 3D bagi persekitaran anda dan jejaki kedudukan kamera</translation> <translation id="3512163584740124171">Dasar ini diabaikan kerana dasar lain daripada kumpulan dasar yang sama mempunyai keutamaan yang lebih tinggi.</translation> <translation id="3518941727116570328">Pengendalian berbilang objek</translation> @@ -1444,6 +1445,7 @@ <translation id="6687335167692595844">Saiz fon diminta</translation> <translation id="6689249931105087298">Relatif dengan mampatan mata hitam</translation> <translation id="6689271823431384964">Chrome menawarkan penyimpanan kad dalam Akaun Google anda kerana anda telah log masuk. Anda boleh menukar gelagat ini dalam tetapan. Nama pemegang kad diambil daripada akaun anda.</translation> +<translation id="6698381487523150993">Dicipta:</translation> <translation id="6702919718839027939">Pembentangan</translation> <translation id="6710213216561001401">Sebelumnya</translation> <translation id="6710594484020273272"><Taip istilah carian></translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index bc0812b..8f61272 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -1442,6 +1442,7 @@ <translation id="6687335167692595844">ဖောင့်အရွယ်အစား တောင်းဆိုထားသည်</translation> <translation id="6689249931105087298">အနက်ရောင်အမှတ် အချိုင့်နှင့် အညီ</translation> <translation id="6689271823431384964">လက်မှတ်ထိုးဝင်ထားသဖြင့် သင်၏ကတ်များကို သင့် Google အကောင့်တွင် သိမ်းရန် Chrome က ကမ်းလှမ်းထားပါသည်။ ဤလုပ်ဆောင်ပုံကို ဆက်တင်များတွင် ပြောင်းနိုင်သည်။ ကတ်ကိုင်ဆောင်သူ အမည်ကို သင့်အကောင့်မှ ရရှိပါသည်။</translation> +<translation id="6698381487523150993">ဖန်တီးခဲ့:</translation> <translation id="6702919718839027939">တင်ပြရန်</translation> <translation id="6710213216561001401">အရင်</translation> <translation id="6710594484020273272"><ရှာဖွေရန် အကြောင်းအရာကို ရိုက်ထည့်ပါ></translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 398d40b..1d593e8 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -1439,6 +1439,7 @@ <translation id="6687335167692595844">फन्टको अनुरोध गरिएको आकार</translation> <translation id="6689249931105087298">कालो बिन्दुको कम्प्रेसनसँग सापेक्ष</translation> <translation id="6689271823431384964">तपाईं साइन इन हुनुभएकाले Chrome ले तपाईंको Google खातामा तपाईंका कार्डहरू सुरक्षित गरिदिने प्रस्ताव गर्दै छ। तपाईं सेटिङहरूमा गई उक्त व्यवहार परिवर्तन गर्न सक्नुहुन्छ। कार्डवाहकको नामका रूपमा तपाईंको खातामा भएको नाम प्रयोग गरिन्छ।</translation> +<translation id="6698381487523150993">सिर्जना गरिएको:</translation> <translation id="6702919718839027939">प्रस्तुति दिनुहोस्</translation> <translation id="6710213216561001401">अघिल्लो</translation> <translation id="6710594484020273272"><खोज पदलाई टाइप गर्नुहोस्></translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 765d031..ba162d2b 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -626,6 +626,7 @@ <translation id="3484560055331845446">Je kunt de toegang tot je Google-account kwijtraken. Chrome raadt je aan je wachtwoord nu te wijzigen. Je wordt gevraagd in te loggen op je account.</translation> <translation id="3487845404393360112">Lade 4</translation> <translation id="3495081129428749620">Zoeken op pagina <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Bestandsnaam:</translation> <translation id="3507936815618196901">Een 3D-kaart van je omgeving maken en de camerapositie volgen</translation> <translation id="3512163584740124171">Dit beleid wordt genegeerd omdat een ander beleid in dezelfde beleidsgroep een hogere prioriteit heeft.</translation> <translation id="3518941727116570328">Verwerking van meerdere objecten</translation> @@ -1233,6 +1234,7 @@ <translation id="5895138241574237353">Opnieuw starten</translation> <translation id="5895187275912066135">Verleend op</translation> <translation id="5901630391730855834">Geel</translation> +<translation id="5903264686717710770">Titel:</translation> <translation id="5905445707201418379">Geblokkeerd op basis van het herkomstbeleid van <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (gesynchroniseerd)</translation> <translation id="5913377024445952699">Schermopname onderbroken</translation> @@ -1428,6 +1430,7 @@ <translation id="6687335167692595844">Lettergrootte aangevraagd</translation> <translation id="6689249931105087298">Relatief met zwartpuntcompressie</translation> <translation id="6689271823431384964">Chrome biedt aan je kaarten in je Google-account op te slaan omdat je bent ingelogd. Je kunt dit wijzigen in de instellingen. De naam van de kaarthouder is afkomstig uit je account.</translation> +<translation id="6698381487523150993">Gemaakt:</translation> <translation id="6702919718839027939">Presenteren</translation> <translation id="6710213216561001401">Vorige</translation> <translation id="6710594484020273272"><Typ een zoekterm></translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 73e2ce0f..7198818 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Skuff 4</translation> <translation id="3495081129428749620">Finn på siden <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Filnavn:</translation> <translation id="3507936815618196901">lage et 3D-kart av omgivelsene dine og spore kameraposisjonen</translation> <translation id="3512163584740124171">Denne regelen ignoreres fordi en annen regel i den samme regelgruppen har høyere prioritet.</translation> <translation id="3518941727116570328">Håndtering av flere objekter</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Start på nytt</translation> <translation id="5895187275912066135">Utstedt</translation> <translation id="5901630391730855834">Gul</translation> +<translation id="5903264686717710770">Tittel:</translation> <translation id="5905445707201418379">Blokkert i samsvar med opphavsregelen for <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synkronisert)</translation> <translation id="5913377024445952699">Skjermopptaket er satt på pause</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Forespurt skriftstørrelse</translation> <translation id="6689249931105087298">Relativ med svartpunktkomprimering</translation> <translation id="6689271823431384964">Chrome tilbyr å lagre kort i Google-kontoen din fordi du er logget på. Du kan endre dette i innstillingene. Kortinnehaverens navn kommer fra kontoen din.</translation> +<translation id="6698381487523150993">Opprettet:</translation> <translation id="6702919718839027939">Presenter</translation> <translation id="6710213216561001401">Forrige</translation> <translation id="6710594484020273272"><Skriv inn en søketerm></translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 25f1b853..98ca3df 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -629,6 +629,7 @@ <translation id="3487845404393360112">ଟ୍ରେ 4</translation> <translation id="3495081129428749620">ପୃଷ୍ଠାରେ ଖୋଜନ୍ତୁ <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">ଫାଇଲ୍ ନାମ:</translation> <translation id="3507936815618196901">ଆପଣଙ୍କ ପରିପାର୍ଶ୍ୱର ଏକ 3D ମ୍ୟାପ୍ ତିଆରି କରନ୍ତୁ ଏବଂ କ୍ୟାମେରା ସ୍ଥିତି ଟ୍ରାକ୍ କରନ୍ତୁ</translation> <translation id="3512163584740124171">ଏହି ନୀତିକୁ ଅଣଦେଖା କରାଯାଏ କାରଣ ସେହି ଏକା ନୀତି ଗୋଷ୍ଠୀ ଭିତରୁ ଅନ୍ୟ ଗୋଟିଏ ନୀତିର ପ୍ରାଧାନ୍ୟ ଅଛି।</translation> <translation id="3518941727116570328">ଏକାଧିକ ବସ୍ତୁର ପରିଚାଳନା</translation> @@ -1233,6 +1234,7 @@ <translation id="5895138241574237353">ପୁନଃଆରମ୍ଭ</translation> <translation id="5895187275912066135">ଜାରି କରାଯାଇଥିବା ତାରିଖ</translation> <translation id="5901630391730855834">ହଳଦିଆ</translation> +<translation id="5903264686717710770">ଆଖ୍ୟା:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" />ର ମୂଳ ନୀତି ଅନୁଯାୟୀ ବ୍ଲକ୍ କରାଯାଇଛି।</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> ( ସିଙ୍କ୍ କରାଯାଇଛି)</translation> <translation id="5913377024445952699">ସ୍କ୍ରିନ୍ କ୍ୟାପଚର୍ ବିରତ କରାଯାଇଛି</translation> @@ -1428,6 +1430,7 @@ <translation id="6687335167692595844">ଅନୁରୋଧ କରାଯାଇଥିବା ଫଣ୍ଟ ଆକାର</translation> <translation id="6689249931105087298">ବ୍ଲାକ୍ ପଏଣ୍ଟ କମ୍ପ୍ରେସନ୍ ସହିତ ରିଲେଟିଭ୍</translation> <translation id="6689271823431384964">ଆପଣ ସାଇନ୍ ଇନ୍ କରିଥିବା ଯୋଗୁଁ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ଆପଣଙ୍କ କାର୍ଡଗୁଡ଼ିକ ସେଭ୍ କରିବାକୁ Chrome ଅଫର୍ ଦେଉଛି। ଆପଣ ସେଟିଂସ୍ରେ ଏହି ଆଚରଣ ପରିବର୍ତ୍ତନ କରିପାରିବେ। ଆପଣଙ୍କ ଆକାଉଣ୍ଟରୁ କାର୍ଡ ଧାରକଙ୍କ ନାମ ଆସିଛି।</translation> +<translation id="6698381487523150993">ସୃଷ୍ଟିହେଲା:</translation> <translation id="6702919718839027939">ବର୍ତ୍ତମାନ</translation> <translation id="6710213216561001401">ପୂର୍ବବର୍ତ୍ତୀ</translation> <translation id="6710594484020273272"><ସନ୍ଧାନ ପଦ ଟାଇପ୍ କରନ୍ତୁ></translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 2569e14..8ef117b 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -1429,6 +1429,7 @@ <translation id="6687335167692595844">ਫ਼ੌਂਟ ਆਕਾਰ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਗਈ</translation> <translation id="6689249931105087298">ਕਾਲੇ ਬਿੰਦੂ ਨਪੀੜਨ ਨਾਲ ਸੰਬੰਧਿਤ</translation> <translation id="6689271823431384964">ਤੁਹਾਡੇ ਸਾਈਨ-ਇਨ ਹੋਣ ਕਰਕੇ Chrome ਤੁਹਾਡੇ ਕਾਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਵਤੀਰੇ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ। ਕਾਰਡਧਾਰਕ ਦੇ ਨਾਮ ਦੀ ਜਾਣਕਾਰੀ ਤੁਹਾਡੇ ਖਾਤੇ ਤੋਂ ਮਿਲਦੀ ਹੈ।</translation> +<translation id="6698381487523150993">ਬਣਾਇਆ:</translation> <translation id="6702919718839027939">ਪੇਸ਼ਕਾਰੀ ਮੋਡ</translation> <translation id="6710213216561001401">ਪਿਛਲਾ</translation> <translation id="6710594484020273272"><ਖੋਜ ਸ਼ਬਦ ਟਾਈਪ ਕਰੋ></translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 103faaf..55bc695 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -633,6 +633,7 @@ <translation id="3487845404393360112">Taca 4</translation> <translation id="3495081129428749620">Znajdź na stronie <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nazwa pliku:</translation> <translation id="3507936815618196901">Tworzyć mapę 3D Twojego otoczenia i śledzić pozycję kamery.</translation> <translation id="3512163584740124171">Ta zasada jest ignorowana, ponieważ inna zasada z tej samej grupy zasad ma wyższy priorytet.</translation> <translation id="3518941727116570328">Obsługa wielu obiektów</translation> @@ -1238,6 +1239,7 @@ <translation id="5895138241574237353">Uruchom ponownie</translation> <translation id="5895187275912066135">Wystawiony dnia</translation> <translation id="5901630391730855834">Żółty</translation> +<translation id="5903264686717710770">Tytuł:</translation> <translation id="5905445707201418379">Zablokowano zgodnie z zasadami dotyczącymi źródła obowiązującymi w przypadku strony <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (zsynchronizowane)</translation> <translation id="5913377024445952699">Przechwytywanie ekranu zostało wstrzymane</translation> @@ -1434,6 +1436,7 @@ <translation id="6687335167692595844">Zażądano rozmiaru czcionki</translation> <translation id="6689249931105087298">Względna z kompresją punktu czerni</translation> <translation id="6689271823431384964">Chrome proponuje zalogowanym użytkownikom zapisywanie kart na koncie Google. Możesz to zmienić w ustawieniach. Imię i nazwisko posiadacza karty pochodzi z Twojego konta.</translation> +<translation id="6698381487523150993">Utworzono:</translation> <translation id="6702919718839027939">Tryb prezentacji</translation> <translation id="6710213216561001401">Poprzedni</translation> <translation id="6710594484020273272"><Wpisz wyszukiwane słowa></translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index 97073140..d0675df 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -631,6 +631,7 @@ <translation id="3487845404393360112">Bandeja 4</translation> <translation id="3495081129428749620">Encontrar na página <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nome do arquivo:</translation> <translation id="3507936815618196901">Criar um mapa 3D dos seus arredores e acompanhar a posição da câmera</translation> <translation id="3512163584740124171">Esta política é ignorada porque outra política do mesmo grupo tem uma prioridade mais alta.</translation> <translation id="3518941727116570328">Gerenciamento de vários objetos</translation> @@ -1236,6 +1237,7 @@ <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido em</translation> <translation id="5901630391730855834">Amarelo</translation> +<translation id="5903264686717710770">Título:</translation> <translation id="5905445707201418379">Bloqueado de acordo com a política de origem de <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizado)</translation> <translation id="5913377024445952699">Captura de tela pausada</translation> @@ -1432,6 +1434,7 @@ <translation id="6687335167692595844">Tamanho da fonte solicitado</translation> <translation id="6689249931105087298">Relativa com compressão de pontos pretos</translation> <translation id="6689271823431384964">A opção de salvar seus cartões na Conta do Google está disponível no Chrome porque você fez login. É possível alterar esse comportamento nas configurações. O nome do titular do cartão vem da sua conta.</translation> +<translation id="6698381487523150993">Criado em:</translation> <translation id="6702919718839027939">Apresentação</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Digitar termo de pesquisa></translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 7ebedd9..7c7e2b3 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Tabuleiro 4</translation> <translation id="3495081129428749620">Procurar na página <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nome do ficheiro:</translation> <translation id="3507936815618196901">Criar um mapa 3D do ambiente à sua volta e monitorizar a posição da câmara.</translation> <translation id="3512163584740124171">Esta política é ignorada, porque existe outra política do mesmo grupo de políticas com prioridade superior.</translation> <translation id="3518941727116570328">Processamento de vários objetos</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Reiniciar</translation> <translation id="5895187275912066135">Emitido em</translation> <translation id="5901630391730855834">Amarelo</translation> +<translation id="5903264686717710770">Título:</translation> <translation id="5905445707201418379">Bloqueado de acordo com a política de origem de <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizados)</translation> <translation id="5913377024445952699">Captura de ecrã em pausa</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Tamanho do tipo de letra solicitado</translation> <translation id="6689249931105087298">Relativa com compressão do ponto preto</translation> <translation id="6689271823431384964">O Chrome está a disponibilizar a opção de guardar os seus cartões na sua Conta Google porque tem sessão iniciada. Pode alterar este comportamento nas definições. O nome do titular do cartão vem da sua conta.</translation> +<translation id="6698381487523150993">Criado:</translation> <translation id="6702919718839027939">Apresentar</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Introduzir termo de pesquisa></translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index bb78cec..14e85429 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -635,6 +635,7 @@ <translation id="3487845404393360112">Tava 4</translation> <translation id="3495081129428749620">Caută în pagină <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Nume fișier:</translation> <translation id="3507936815618196901">să creeze o hartă 3D a lucrurilor din jurul tău și să urmărească poziția camerei video</translation> <translation id="3512163584740124171">Această politică este ignorată deoarece o altă politică din același grup de politici are prioritate ridicată.</translation> <translation id="3518941727116570328">Gestionarea mai multor obiecte</translation> @@ -1245,6 +1246,7 @@ <translation id="5895138241574237353">Reîncepe</translation> <translation id="5895187275912066135">Emis la</translation> <translation id="5901630391730855834">Galben</translation> +<translation id="5903264686717710770">Titlul:</translation> <translation id="5905445707201418379">Blocat conform politicii de origine de la <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sincronizat)</translation> <translation id="5913377024445952699">Funcție de realizare a capturilor întreruptă</translation> @@ -1441,6 +1443,7 @@ <translation id="6687335167692595844">Dimensiunea fontului solicitată</translation> <translation id="6689249931105087298">Relativă cu comprimarea punctelor negre</translation> <translation id="6689271823431384964">Chrome oferă salvarea cardurilor în Contul Google pentru că te-ai conectat. Poți schimba acest comportament în setări. Numele titularului de card vine din contul tău.</translation> +<translation id="6698381487523150993">Creat:</translation> <translation id="6702919718839027939">Prezentare</translation> <translation id="6710213216561001401">Înapoi</translation> <translation id="6710594484020273272"><Introdu termenul de căutare></translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index f1fd492..d8aa769 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -630,6 +630,7 @@ <translation id="3487845404393360112">Лоток 4</translation> <translation id="3495081129428749620">Найти на странице "<ph name="PAGE_TITLE" />"</translation> +<translation id="350069200438440499">Имя файла:</translation> <translation id="3507936815618196901">Создание 3D-карты места, в котором вы находитесь, и отслеживание положения камеры</translation> <translation id="3512163584740124171">Действует правило с более высоким приоритетом.</translation> <translation id="3518941727116570328">Обработка нескольких объектов</translation> @@ -1235,6 +1236,7 @@ <translation id="5895138241574237353">Перезапустить</translation> <translation id="5895187275912066135">Дата выдачи</translation> <translation id="5901630391730855834">Желтый</translation> +<translation id="5903264686717710770">Заголовок:</translation> <translation id="5905445707201418379">Заблокировано в соответствии с политикой в отношении источников <ph name="ORIGIN" /></translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (данные синхронизируются)</translation> <translation id="5913377024445952699">Съемка экрана приостановлена</translation> @@ -1431,6 +1433,7 @@ <translation id="6687335167692595844">Размер шрифта запрошен</translation> <translation id="6689249931105087298">Относительный со сжатием точки черного цвета</translation> <translation id="6689271823431384964">Chrome предлагает вам сохранить карты в аккаунте Google, поскольку вы вошли в систему. Этот параметр можно изменить в разделе настроек. Имя владельца карты взято из вашего аккаунта.</translation> +<translation id="6698381487523150993">Создано:</translation> <translation id="6702919718839027939">Режим презентации</translation> <translation id="6710213216561001401">Назад</translation> <translation id="6710594484020273272"><Введите поисковый запрос></translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index b6f7b2e..116c5091 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -1438,6 +1438,7 @@ <translation id="6687335167692595844">අකුරු ප්රමාණය ඉල්ලුවා</translation> <translation id="6689249931105087298">කළු ලක්ෂ්ය සම්පීඩනයට අදාළ</translation> <translation id="6689271823431384964">ඔබ පුරනය වී සිටින බැවින් Chrome ඔබට ඔබේ කාඩ්පත් ඔබේ Google ගිණුමට සුරැකීම පිරිනමයි. ඔබට මෙම හැසිරීම සැකසීම් තුළ වෙනස් කළ හැක. කාඩ්පත් හිමිකරුගේ නම ඔබේ ගිණුමෙන් ලැබේ.</translation> +<translation id="6698381487523150993">නිර්මිත:</translation> <translation id="6702919718839027939">ඉදිරිපත් කරන්න</translation> <translation id="6710213216561001401">පෙර</translation> <translation id="6710594484020273272"><සෙවීම් පදය ටයිප් කරන්න></translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index b2ff0c35..12377101 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -628,6 +628,7 @@ <translation id="3487845404393360112">Priehradka č. 4</translation> <translation id="3495081129428749620">Nájsť na stránke <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Názov súboru:</translation> <translation id="3507936815618196901">Vytvorenie 3D mapy vášho okolia a sledovanie umiestnenia kamier</translation> <translation id="3512163584740124171">Toto pravidlo sa ignoruje, pretože iné pravidlo z rovnakej skupiny má vyššiu prioritu.</translation> <translation id="3518941727116570328">Spracúvanie viacerých objektov</translation> @@ -1232,6 +1233,7 @@ <translation id="5895138241574237353">Reštartovať</translation> <translation id="5895187275912066135">Vydané dňa</translation> <translation id="5901630391730855834">Žltá</translation> +<translation id="5903264686717710770">Názov:</translation> <translation id="5905445707201418379">Blokované pravidlom pre zdroj <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synchronizované)</translation> <translation id="5913377024445952699">Snímanie obrazovky bolo pozastavené</translation> @@ -1427,6 +1429,7 @@ <translation id="6687335167692595844">Bola vyžiadaná veľkosť písma</translation> <translation id="6689249931105087298">Relatívne s kompresiou čierneho bodu</translation> <translation id="6689271823431384964">Chrome poskytuje možnosť uložiť karty v účte Google, pretože ste sa prihlásili. Toto správanie môžete zmeniť v nastaveniach. Toto meno majiteľa karty pochádza z vášho účtu.</translation> +<translation id="6698381487523150993">Vytvorené:</translation> <translation id="6702919718839027939">Prezentovať</translation> <translation id="6710213216561001401">Späť</translation> <translation id="6710594484020273272"><Zadajte hľadaný výraz></translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 23ff7da6..ff3a86e0 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Pladenj 4</translation> <translation id="3495081129428749620">Iskanje na strani <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Ime datoteke:</translation> <translation id="3507936815618196901">Ustvarjanje 3D-zemljevida vaše okolice in spremljanje položaja kamere</translation> <translation id="3512163584740124171">Ta pravilnik se prezre, ker ima drug pravilnik iz iste skupine pravilnikov prednost.</translation> <translation id="3518941727116570328">Obravnava več predmetov</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Znova zaženi</translation> <translation id="5895187275912066135">Izdano dne</translation> <translation id="5901630391730855834">Rumena</translation> +<translation id="5903264686717710770">Naslov:</translation> <translation id="5905445707201418379">Blokirano v skladu s pravilnikom izvora za <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinhronizirano)</translation> <translation id="5913377024445952699">Začasno zaustavljeno zajemanje slike zaslona</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Zahtevana je velikost besedila</translation> <translation id="6689249931105087298">Relativno s stiskanjem črnih pik</translation> <translation id="6689271823431384964">Chrome ponuja shranjevanje kartic v račun za Google, ker ste prijavljeni. To lahko spremenite v nastavitvah. Ime imetnika računa je iz vašega računa.</translation> +<translation id="6698381487523150993">Ustvarjeno:</translation> <translation id="6702919718839027939">Predstavitev</translation> <translation id="6710213216561001401">Prejšnji</translation> <translation id="6710594484020273272"><Vnesite iskalno poizvedbo></translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index f1a1bb2..471c395c 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -1437,6 +1437,7 @@ <translation id="6687335167692595844">Kërkohet madhësia e fontit</translation> <translation id="6689249931105087298">Relative me ngjeshjen e pikës së zezë</translation> <translation id="6689271823431384964">Chrome po ofron që të ruash kartat e tua në "Llogarinë tënde të Google" sepse je identifikuar. Mund ta ndryshosh këtë sjellje te cilësimet. Emri i mbajtësit të kartës vjen nga llogaria jote.</translation> +<translation id="6698381487523150993">Krijuar:</translation> <translation id="6702919718839027939">Prezantim</translation> <translation id="6710213216561001401">Prapa</translation> <translation id="6710594484020273272"><Shkruaj termin e kërkimit></translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 74db657..e3be836 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">4. fioka</translation> <translation id="3495081129428749620">Pronađite na stranici <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Ime datoteke:</translation> <translation id="3507936815618196901">Pravi 3D mapu okruženja i prati položaj kamere</translation> <translation id="3512163584740124171">Ove smernice su zanemarene jer druge smernice iz iste grupe smernica imaju prednost.</translation> <translation id="3518941727116570328">Obrada više predmeta</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Pokreni ponovo</translation> <translation id="5895187275912066135">Izdato</translation> <translation id="5901630391730855834">Žuta</translation> +<translation id="5903264686717710770">Naslov:</translation> <translation id="5905445707201418379">Blokirano je u skladu sa smernicama za poreklo (<ph name="ORIGIN" />).</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (sinhronizovano)</translation> <translation id="5913377024445952699">Snimanje ekrana je pauzirano</translation> @@ -1442,6 +1444,7 @@ <translation id="6687335167692595844">Zatražena je veličina fonta</translation> <translation id="6689249931105087298">Relativno sa kompresijom crnih tačaka</translation> <translation id="6689271823431384964">Chrome vam nudi čuvanje kartica na Google nalogu zato što ste prijavljeni. To možete da promenite u podešavanjima. Ime vlasnika kartice smo uzeli sa naloga.</translation> +<translation id="6698381487523150993">Napravljeno:</translation> <translation id="6702919718839027939">Prezentacija</translation> <translation id="6710213216561001401">Prethodno</translation> <translation id="6710594484020273272"><Unesite termin za pretragu></translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index c6f95b6..091dda2f 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">4. фиока</translation> <translation id="3495081129428749620">Пронађите на страници <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Име датотеке:</translation> <translation id="3507936815618196901">Прави 3D мапу окружења и прати положај камере</translation> <translation id="3512163584740124171">Ове смернице су занемарене јер друге смернице из исте групе смерница имају предност.</translation> <translation id="3518941727116570328">Обрада више предмета</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Покрени поново</translation> <translation id="5895187275912066135">Издато</translation> <translation id="5901630391730855834">Жута</translation> +<translation id="5903264686717710770">Наслов:</translation> <translation id="5905445707201418379">Блокирано је у складу са смерницама за порекло (<ph name="ORIGIN" />).</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (синхронизовано)</translation> <translation id="5913377024445952699">Снимање екрана је паузирано</translation> @@ -1442,6 +1444,7 @@ <translation id="6687335167692595844">Затражена је величина фонта</translation> <translation id="6689249931105087298">Релативно са компресијом црних тачака</translation> <translation id="6689271823431384964">Chrome вам нуди чување картица на Google налогу зато што сте пријављени. То можете да промените у подешавањима. Име власника картице смо узели са налога.</translation> +<translation id="6698381487523150993">Направљено:</translation> <translation id="6702919718839027939">Презентација</translation> <translation id="6710213216561001401">Претходно</translation> <translation id="6710594484020273272"><Унесите термин за претрагу></translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index fb70fd74..d73b81c 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Fack 4</translation> <translation id="3495081129428749620">Hitta på sidan <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Filnamn:</translation> <translation id="3507936815618196901">Skapa en 3D-karta över dina omgivningar och registrera kamerans position</translation> <translation id="3512163584740124171">Den här principen ignoreras eftersom en annan princip i samma principgrupp har högre prioritet.</translation> <translation id="3518941727116570328">Hantering av flera objekt</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Starta om</translation> <translation id="5895187275912066135">Utfärdat</translation> <translation id="5901630391730855834">Gul</translation> +<translation id="5903264686717710770">Namn:</translation> <translation id="5905445707201418379">Blockerad i enlighet med ursprungsprincipen på <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (synkroniserade)</translation> <translation id="5913377024445952699">Skärmbild/skärminspelning har pausats</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Teckenstorlek begärd</translation> <translation id="6689249931105087298">Relativ med svartpunktskomprimering</translation> <translation id="6689271823431384964">Chrome ger möjlighet att spara dina kort i ditt Google-konto eftersom du är inloggad. Du kan ändra detta i inställningarna. Kortinnehavarens namn hämtas från ditt konto.</translation> +<translation id="6698381487523150993">Skapad av:</translation> <translation id="6702919718839027939">Presentera</translation> <translation id="6710213216561001401">Föregående</translation> <translation id="6710594484020273272"><Ange sökterm></translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index b952b70..ebdd15b8 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -636,6 +636,7 @@ <translation id="3487845404393360112">Trei ya nne</translation> <translation id="3495081129428749620">Pata katika ukurasa wa <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Jina la faili:</translation> <translation id="3507936815618196901">Kubuni ramani ya 3D ya mazingira yako na kufuatilia mkao wa kamera</translation> <translation id="3512163584740124171">Sera hii haitumiki kwa sababu sera nyingine kutoka kundi sawa la sera inapewa kipaumbele zaidi.</translation> <translation id="3518941727116570328">Kushughulikia vipengee vingi</translation> @@ -1246,6 +1247,7 @@ <translation id="5895138241574237353">Zzima na uwashe</translation> <translation id="5895187275912066135">Kilitolewa</translation> <translation id="5901630391730855834">Manjano</translation> +<translation id="5903264686717710770">Kichwa:</translation> <translation id="5905445707201418379">Imezuiwa kulingana na sera ya asili ya <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (imesawazishwa)</translation> <translation id="5913377024445952699">Kipengele cha kupiga picha ya skrini kimesitishwa</translation> @@ -1442,6 +1444,7 @@ <translation id="6687335167692595844">Imeomba ukubwa wa fonti</translation> <translation id="6689249931105087298">Ya kiwango cha kati yenye sehemu nyeusi iliyobanwa</translation> <translation id="6689271823431384964">Chrome itakuhifadhia kadi zako katika Akaunti yako ya Google kwa sababu umeingia katika akaunti. Unaweza kubadilisha hali hii katika mipangilio. Jina la mwenye kadi linatoka kwenye akaunti yako.</translation> +<translation id="6698381487523150993">Imeundwa</translation> <translation id="6702919718839027939">Wasilisha</translation> <translation id="6710213216561001401">Iliyopita</translation> <translation id="6710594484020273272"><Andika neno unalotaka kutafuta></translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 42a7dfe..8f66ace0 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -631,6 +631,7 @@ <translation id="3484560055331845446">உங்கள் Google கணக்கிற்கான அணுகலை நீங்கள் இழக்கக்கூடும். இப்போதே உங்கள் கடவுச்சொல்லை மாற்றுமாறு Chrome பரிந்துரைக்கிறது. அதற்கு நீங்கள் உள்நுழைய வேண்டும்.</translation> <translation id="3487845404393360112">தட்டு 4</translation> <translation id="3495081129428749620"><ph name="PAGE_TITLE" /> பக்கத்தில் கண்டறிக</translation> +<translation id="350069200438440499">கோப்பு பெயர்:</translation> <translation id="3507936815618196901">உங்களைச் சுற்றியுள்ள இடங்களின் 3D மேப்பை உருவாக்கவும் கேமரா நிலையை டிராக் செய்யவும் விரும்புகிறது</translation> <translation id="3512163584740124171">அதே கொள்கை வகையைச் சார்ந்த வேறொன்று அதிக முக்கியத்துவம் வாய்ந்தது என்பதால் இந்தக் கொள்கை ஏற்றுக் கொள்ளப்படவில்லை.</translation> <translation id="3518941727116570328">பல பொருட்களைக் கையாளுதல்</translation> @@ -1241,6 +1242,7 @@ <translation id="5895138241574237353">மறுதொடக்கம்</translation> <translation id="5895187275912066135">வழங்கப்பட்டது</translation> <translation id="5901630391730855834">மஞ்சள்</translation> +<translation id="5903264686717710770">தலைப்பு:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> இன் அசல் கொள்கையின்படி தடுக்கப்பட்டுள்ளது.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (ஒத்திசைக்கப்பட்டது)</translation> <translation id="5913377024445952699">ஸ்கிரீன்ஷாட் எடுப்பது இடைநிறுத்தப்பட்டது</translation> @@ -1436,6 +1438,7 @@ <translation id="6687335167692595844">கோரப்பட்ட எழுத்துரு அளவு</translation> <translation id="6689249931105087298">கறுப்புப் புள்ளிச் சுருக்கத்துடன் சார்புடையது</translation> <translation id="6689271823431384964">நீங்கள் உள்நுழைந்துள்ளதால் Google கணக்கில் உங்கள் கார்டு விவரங்களைச் சேமிக்கும் விருப்பத்தை Chrome வழங்குகிறது. இதை நீங்கள் அமைப்புகளில் மாற்றலாம். கார்டு உரிமையாளரின் பெயர் உங்கள் கணக்கிலிருந்து பெறப்படுகிறது.</translation> +<translation id="6698381487523150993">உருவாக்கப்பட்டது:</translation> <translation id="6702919718839027939">ஸ்கிரீனைப் பகிர்</translation> <translation id="6710213216561001401">முந்தையது</translation> <translation id="6710594484020273272"><தேடல் வார்த்தையை உள்ளிடுக></translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 0ac7b69..e0832378 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">ట్రే 4</translation> <translation id="3495081129428749620">పేజీలో కనుగొను <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">ఫైల్ పేరు:</translation> <translation id="3507936815618196901">మీ పరిసరాల 3D మ్యాప్ను రూపొందించడం, అలాగే కెమెరా పొజిషన్ను ట్రాక్ చేయడం</translation> <translation id="3512163584740124171">ఈ విధానం విస్మరించబడుతుంది, ఎందుకంటే ఒకే విధాన సమూహం నుండి మరొక విధానం అధిక ప్రాధాన్యతను కలిగి ఉంది.</translation> <translation id="3518941727116570328">అనేక వస్తువులను హ్యాండిల్ చేయడం</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation> <translation id="5895187275912066135">జారీ చేయబడినది</translation> <translation id="5901630391730855834">పసుపు</translation> +<translation id="5903264686717710770">శీర్షిక:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> యొక్క ఆరిజిన్ ఎర్రర్ విధానం ప్రకారం బ్లాక్ చేయబడింది.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (సమకాలీకరించబడింది)</translation> <translation id="5913377024445952699">స్క్రీన్ను క్యాప్చర్ చేయడం పాజ్ చేయబడింది</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">అభ్యర్థించబడిన ఫాంట్ పరిమాణం</translation> <translation id="6689249931105087298">సంబంధిత బ్లాక్ పాయింట్ కంప్రెషన్</translation> <translation id="6689271823431384964">మీరు సైన్ ఇన్ చేసి ఉన్నందున, మీ కార్డ్లను మీ Google ఖాతాలో సేవ్ చేసుకోగల అవకాశాన్ని Chrome మీకు అందిస్తోంది. మీరు సెట్టింగ్లలో ఈ ప్రవర్తనను మార్చవచ్చు. కార్డుదారుడి పేరు మీ ఖాతా నుండి అందించబడింది.</translation> +<translation id="6698381487523150993">సృష్టించబడింది:</translation> <translation id="6702919718839027939">పిన్ చేయండి</translation> <translation id="6710213216561001401">మునుపటి</translation> <translation id="6710594484020273272"><శోధన పదాన్ని టైప్ చేయండి></translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 9b4f10a..df330223 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -630,6 +630,7 @@ <translation id="3484560055331845446">คุณอาจสูญเสียสิทธิ์เข้าถึงบัญชี Google ของคุณ Chrome ขอแนะนำให้เปลี่ยนรหัสผ่านทันที ระบบจะขอให้คุณลงชื่อเข้าใช้</translation> <translation id="3487845404393360112">ถาด 4</translation> <translation id="3495081129428749620">ค้นหาในหน้าเว็บ <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">ชื่อไฟล์:</translation> <translation id="3507936815618196901">สร้างแผนที่ 3 มิติของสิ่งที่อยู่รอบตัวคุณและติดตามตำแหน่งของกล้อง</translation> <translation id="3512163584740124171">ระบบจะไม่สนใจนโยบายนี้เพราะอีกนโยบายหนึ่งจากกลุ่มนโยบายเดียวกันมีลำดับความสำคัญสูงกว่า</translation> <translation id="3518941727116570328">การจัดการออบเจ็กต์หลายรายการ</translation> @@ -1235,6 +1236,7 @@ <translation id="5895138241574237353">ปิดแล้วเปิดอีกครั้ง</translation> <translation id="5895187275912066135">ออกเมื่อ</translation> <translation id="5901630391730855834">สีเหลือง</translation> +<translation id="5903264686717710770">ชื่อ:</translation> <translation id="5905445707201418379">ถูกบล็อกตามนโยบายดั้งเดิมของ <ph name="ORIGIN" /></translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (ซิงค์แล้ว)</translation> <translation id="5913377024445952699">การจับภาพหน้าจอหยุดอยู่ชั่วคราว</translation> @@ -1431,6 +1433,7 @@ <translation id="6687335167692595844">ขอขนาดแบบอักษรแล้ว</translation> <translation id="6689249931105087298">สัมพัทธ์กับการบีบจุดสีดำ</translation> <translation id="6689271823431384964">Chrome เสนอที่จะบันทึกบัตรลงในบัญชี Google ของคุณเพราะคุณลงชื่อเข้าใช้อยู่ คุณปรับเปลี่ยนลักษณะการทำงานนี้ได้ในการตั้งค่า ชื่อผู้ถือบัตรมาจากบัญชีของคุณ</translation> +<translation id="6698381487523150993">สร้าง:</translation> <translation id="6702919718839027939">การนำเสนอ</translation> <translation id="6710213216561001401">ก่อนหน้า</translation> <translation id="6710594484020273272"><พิมพ์ข้อความค้นหา></translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 005bc9d..35cb6a60 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -351,7 +351,7 @@ <translation id="2288422996159078444">Yazdığınız her şey, görüntülediğiniz her sayfa ve web'deki diğer tüm etkinlikleriniz izlenir. Sitelerdeki içerik, bilginiz dışında değiştirilebilir.</translation> <translation id="2289385804009217824">Kırp</translation> <translation id="2292556288342944218">İnternet erişiminiz engellendi</translation> -<translation id="2293443924986248631">Etkinleştirildiğinde, siteler sizi web'de takip eden çerezler kullanamaz. Bazı sitelerdeki özellikler bozulabilir.</translation> +<translation id="2293443924986248631">Etkinleştirildiğinde, siteler sizi web'de takip eden çerezler kullanamaz. Bazı sitelerdeki özellikler çalışmayabilir.</translation> <translation id="2295290966866883927">Ziyaret ettiğiniz sayfaların URL'leri analiz amacıyla Google Cloud'a veya üçüncü taraflara gönderilir. Örneğin, güvenli olmayan web sitelerini tespit etmek için taranabilirler.</translation> <translation id="2297722699537546652">B5 (Zarf)</translation> <translation id="2300306941146563769">Yüklenmeyenler</translation> @@ -632,6 +632,7 @@ <translation id="3487845404393360112">Tepsi 4</translation> <translation id="3495081129428749620">Şu sayfada bul: <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Dosya adı:</translation> <translation id="3507936815618196901">Çevrenizin 3D haritasını oluşturma ve kamera konumunu takip etme</translation> <translation id="3512163584740124171">Aynı politika grubundan farklı bir politika daha yüksek önceliği sahip olduğundan bu politika yok sayılır.</translation> <translation id="3518941727116570328">Birden çok nesne işleme</translation> @@ -1238,6 +1239,7 @@ <translation id="5895138241574237353">Yeniden başlat</translation> <translation id="5895187275912066135">Verildiği Tarih</translation> <translation id="5901630391730855834">Sarı</translation> +<translation id="5903264686717710770">Başlık:</translation> <translation id="5905445707201418379"><ph name="ORIGIN" /> sitesinin kaynak politikası uyarınca engellendi.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (senkronize edildi)</translation> <translation id="5913377024445952699">Ekran görüntüsü alma duraklatıldı</translation> @@ -1434,6 +1436,7 @@ <translation id="6687335167692595844">Yazı tipi boyutu istendi</translation> <translation id="6689249931105087298">Siyah nokta sıkıştırma ile göreli</translation> <translation id="6689271823431384964">Chrome, oturumunuz açık olduğu için kartlarınızı Google Hesabınıza kaydetmeyi öneriyor. Bu davranışı ayarlardan değiştirebilirsiniz. Kart sahibinin adı hesabınızdan gelir.</translation> +<translation id="6698381487523150993">Oluşturma tarihi:</translation> <translation id="6702919718839027939">Sunum</translation> <translation id="6710213216561001401">Önceki</translation> <translation id="6710594484020273272"><Arama terimini yazın></translation> @@ -1959,7 +1962,7 @@ <translation id="8805819170075074995">Liste girişi "<ph name="LANGUAGE_ID" />": Giriş, SpellcheckLanguage politikasında da yer aldığı için yoksayıldı.</translation> <translation id="8807160976559152894">Her sayfadan sonra kırp</translation> <translation id="8816395686387277279"><ph name="UPDATE_CHROME_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ayarlarınızdan Chrome'u güncellemek için Sekme'ye, sonra Enter'a basın</translation> -<translation id="8820817407110198400">Favoriler</translation> +<translation id="8820817407110198400">Yer işaretleri</translation> <translation id="883848425547221593">Diğer Yer İşaretleri</translation> <translation id="884264119367021077">Gönderim adresi</translation> <translation id="884923133447025588">İptal mekanizması bulunamadı.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index 1e0006fc..44f6c06b 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -635,6 +635,7 @@ <translation id="3487845404393360112">Лоток 4</translation> <translation id="3495081129428749620">Знайти на сторінці <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Ім'я файлу:</translation> <translation id="3507936815618196901">Створити 3D-карту вашого оточення та відстежувати положення камери</translation> <translation id="3512163584740124171">Це правило ігнорується, оскільки інше правило цієї групи має вищий пріоритет.</translation> <translation id="3518941727116570328">Обробка кількох об'єктів</translation> @@ -1245,6 +1246,7 @@ <translation id="5895138241574237353">Перезапустити</translation> <translation id="5895187275912066135">Дата видачі</translation> <translation id="5901630391730855834">Жовтий</translation> +<translation id="5903264686717710770">Заголовок:</translation> <translation id="5905445707201418379">Заблоковано відповідно до правила джерела <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (синхронізовано)</translation> <translation id="5913377024445952699">Зйомку екрана призупинено</translation> @@ -1441,6 +1443,7 @@ <translation id="6687335167692595844">Запит на розмір шрифту</translation> <translation id="6689249931105087298">Відносно стиснення чорної точки</translation> <translation id="6689271823431384964">Chrome пропонує вам зберегти картки в обліковому записі Google, оскільки ви ввійшли в нього. Це можна змінити в налаштуваннях. Ім'я власника картки взято з вашого облікового запису.</translation> +<translation id="6698381487523150993">Створено:</translation> <translation id="6702919718839027939">Презентація</translation> <translation id="6710213216561001401">Назад</translation> <translation id="6710594484020273272"><Введіть пошуковий термін></translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index b4b411e..2e97c0d 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -1447,6 +1447,7 @@ <translation id="6687335167692595844">فونٹ سائز کی درخواست کی گئی</translation> <translation id="6689249931105087298">سیاہ پوائنٹ کمپریشن کے ساتھ متعلقہ</translation> <translation id="6689271823431384964">آپ کے سائن ان ہونے کی وجہ سے Chrome آپ کے کارڈز کو آپ کے Google اکاؤنٹ میں محفوظ کرنے کی پیشکش کر رہا ہے۔ آپ اس برتاؤ کو ترتیبات میں تبدیل کر سکتے ہیں۔ کارڈ ہولڈر کے نام کا تعلق آپ کے اکاؤنٹ سے ہے۔</translation> +<translation id="6698381487523150993">بنا دی گئی:</translation> <translation id="6702919718839027939">پیش کریں</translation> <translation id="6710213216561001401">گزشتہ</translation> <translation id="6710594484020273272"><تلاش کی اصطلاح ٹائپ کریں></translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 0f1d01d3..bccc8a12 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1437,6 +1437,7 @@ <translation id="6687335167692595844">Shrift oʻlchami talab qilindi</translation> <translation id="6689249931105087298">Qora nuqta tejalishiga aloqador</translation> <translation id="6689271823431384964">Hisobingizga kirganingiz uchun Chrome kartalarni Google hisobingizga saqlashni taklif qilmoqda. Buni sozlamalar orqali oʻzgartirish mumkin. Karta egasining ismi hisobingizdan olinadi.</translation> +<translation id="6698381487523150993">Yaratilgan sanasi:</translation> <translation id="6702919718839027939">Taqdimot</translation> <translation id="6710213216561001401">Avvalgi</translation> <translation id="6710594484020273272"><Qidiruv so‘rovini kiriting></translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index cc0f2b86..04c89bbb 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -637,6 +637,7 @@ <translation id="3487845404393360112">Khay 4</translation> <translation id="3495081129428749620">Tìm trong trang <ph name="PAGE_TITLE" /></translation> +<translation id="350069200438440499">Tên tệp:</translation> <translation id="3507936815618196901">Tạo bản đồ 3D về các khu vực xung quanh bạn và theo dõi thông tin vị trí của máy ảnh</translation> <translation id="3512163584740124171">Chính sách này bị bỏ qua vì một chính sách khác thuộc cùng nhóm chính sách có mức ưu tiên cao hơn.</translation> <translation id="3518941727116570328">Xử lý nhiều đối tượng</translation> @@ -1247,6 +1248,7 @@ <translation id="5895138241574237353">Khởi động lại</translation> <translation id="5895187275912066135">Cấp vào</translation> <translation id="5901630391730855834">Vàng</translation> +<translation id="5903264686717710770">Tiêu đề:</translation> <translation id="5905445707201418379">Bị chặn theo chính sách nguồn gốc của <ph name="ORIGIN" />.</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (được đồng bộ hóa)</translation> <translation id="5913377024445952699">Tính năng chụp ảnh màn hình bị tạm dừng</translation> @@ -1443,6 +1445,7 @@ <translation id="6687335167692595844">Kích thước phông chữ đã yêu cầu</translation> <translation id="6689249931105087298">Tương đối có nén điểm đen</translation> <translation id="6689271823431384964">Chrome đang đề xuất lưu thẻ của bạn vào Tài khoản Google vì bạn đã đăng nhập. Bạn có thể thay đổi hoạt động này trong phần cài đặt. Tên chủ thẻ được lấy từ tài khoản của bạn.</translation> +<translation id="6698381487523150993">Tạo:</translation> <translation id="6702919718839027939">Thuyết trình</translation> <translation id="6710213216561001401">Trước</translation> <translation id="6710594484020273272"><Nhập cụm từ tìm kiếm></translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index fd6f852..93de499 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -355,7 +355,7 @@ <translation id="2297722699537546652">B5 (Envelope)</translation> <translation id="2300306941146563769">未上传</translation> <translation id="2310021320168182093">Chou2 (Envelope)</translation> -<translation id="2316887270356262533">释放了不到 1 MB。当您下次访问时,某些网站的加载速度可能会更慢。</translation> +<translation id="2316887270356262533">释放不到 1 MB 空间。当您下次访问时,某些网站的加载速度可能会更慢。</translation> <translation id="2317259163369394535"><ph name="DOMAIN" /> 要求提供用户名和密码。</translation> <translation id="2330137317877982892"><ph name="CREDIT_CARD" />,到期时间:<ph name="EXPIRATION_DATE_ABBR" /></translation> <translation id="2337852623177822836">设置由管理员控制</translation> @@ -628,6 +628,7 @@ <translation id="3484560055331845446">您可能会无法再访问自己的 Google 帐号。Chrome 建议您立即更改密码。系统会要求您登录。</translation> <translation id="3487845404393360112">纸匣 4</translation> <translation id="3495081129428749620">在网页“<ph name="PAGE_TITLE" />”中查找</translation> +<translation id="350069200438440499">文件名:</translation> <translation id="3507936815618196901">为您的周边环境创建 3D 地图并跟踪摄像头位置</translation> <translation id="3512163584740124171">此政策会被忽略,因为同一政策组中的另一个政策具有更高的优先级。</translation> <translation id="3518941727116570328">多对象处理</translation> @@ -1232,6 +1233,7 @@ <translation id="5895138241574237353">重新启动</translation> <translation id="5895187275912066135">颁发日期</translation> <translation id="5901630391730855834">黄色</translation> +<translation id="5903264686717710770">标题:</translation> <translation id="5905445707201418379">已根据 <ph name="ORIGIN" /> 的来源政策而屏蔽。</translation> <translation id="5908541034548427511"><ph name="TYPE_1" />(已同步)</translation> <translation id="5913377024445952699">屏幕截取功能已暂停</translation> @@ -1341,7 +1343,7 @@ <translation id="6328639280570009161">请尝试停用网络联想查询功能</translation> <translation id="6328784461820205019">“您的连接不是私密连接”、“<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>”、“<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>”、“<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>”、“<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>”或“SSL 证书错误”</translation> <translation id="6328786501058569169">此网站是欺骗性网站</translation> -<translation id="6337133576188860026">释放了不到 <ph name="SIZE" />。当您下次访问时,某些网站的加载速度可能会更慢。</translation> +<translation id="6337133576188860026">释放不到 <ph name="SIZE" /> 空间。当您下次访问时,某些网站的加载速度可能会更慢。</translation> <translation id="6337534724793800597">按名称过滤政策</translation> <translation id="6349101878882523185">安装“<ph name="APP_NAME" />”</translation> <translation id="6353505687280762741">{COUNT,plural, =0{无}=1{1 个密码(用于 <ph name="DOMAIN_LIST" />,已同步)}=2{2 个密码(用于 <ph name="DOMAIN_LIST" />,已同步)}other{# 个密码(用于 <ph name="DOMAIN_LIST" />,已同步)}}</translation> @@ -1427,6 +1429,7 @@ <translation id="6687335167692595844">请求的字号</translation> <translation id="6689249931105087298">相对(使用黑点压缩)</translation> <translation id="6689271823431384964">Chrome 正在询问是否要将卡保存到您的 Google 帐号中,因为您已登录。您可在“设置”中更改此行为。持卡人姓名来自您的帐号。</translation> +<translation id="6698381487523150993">创建时间:</translation> <translation id="6702919718839027939">演示</translation> <translation id="6710213216561001401">上一项</translation> <translation id="6710594484020273272"><输入搜索字词></translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 107e29819..8882b42 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -630,6 +630,7 @@ <translation id="3484560055331845446">您可能會失去 Google 帳戶存取權。Chrome 建議您立即變更密碼。系統會要求您登入。</translation> <translation id="3487845404393360112">紙匣 4</translation> <translation id="3495081129428749620">喺「<ph name="PAGE_TITLE" />」網頁度搵</translation> +<translation id="350069200438440499">檔案名稱:</translation> <translation id="3507936815618196901">建立您身處環境的 3D 地圖並追蹤攝錄機位置</translation> <translation id="3512163584740124171">由於相同政策群組中有其他政策的優先順序更高,因此系統已忽略此政策。</translation> <translation id="3518941727116570328">多物件處理</translation> @@ -1235,6 +1236,7 @@ <translation id="5895138241574237353">重新啟動</translation> <translation id="5895187275912066135">發行日期</translation> <translation id="5901630391730855834">黃色</translation> +<translation id="5903264686717710770">標題:</translation> <translation id="5905445707201418379">已根據 <ph name="ORIGIN" /> 的安全政策封鎖。</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (已同步)</translation> <translation id="5913377024445952699">已暫停擷取螢幕畫面</translation> @@ -1431,6 +1433,7 @@ <translation id="6687335167692595844">要求的字型大小</translation> <translation id="6689249931105087298">與黑點壓縮相對</translation> <translation id="6689271823431384964">由於您已登入,因此 Chrome 提議將您的付款卡儲存至 Google 帳戶。您可在設定中變更此行為。持卡人姓名來自您的帳戶。</translation> +<translation id="6698381487523150993">已建立:</translation> <translation id="6702919718839027939">簡報</translation> <translation id="6710213216561001401">上一個</translation> <translation id="6710594484020273272"><輸入搜尋字詞></translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 83ed130..962239ee 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -631,6 +631,7 @@ <translation id="3487845404393360112">紙匣 4</translation> <translation id="3495081129428749620">在 「<ph name="PAGE_TITLE" />」網頁中尋找</translation> +<translation id="350069200438440499">檔案名稱:</translation> <translation id="3507936815618196901">根據你的周遭環境建立 3D 地圖並追蹤攝影機位置</translation> <translation id="3512163584740124171">由於相同政策群組中有其他政策的優先順序更高,因此系統已忽略這項政策。</translation> <translation id="3518941727116570328">多個物件處理</translation> @@ -1236,6 +1237,7 @@ <translation id="5895138241574237353">重新啟動</translation> <translation id="5895187275912066135">發行日期</translation> <translation id="5901630391730855834">黃色</translation> +<translation id="5903264686717710770">標題:</translation> <translation id="5905445707201418379">已根據「<ph name="ORIGIN" />」的來源政策加以封鎖。</translation> <translation id="5908541034548427511"><ph name="TYPE_1" /> (已同步)</translation> <translation id="5913377024445952699">已暫停擷取螢幕畫面</translation> @@ -1432,6 +1434,7 @@ <translation id="6687335167692595844">要求的字型大小</translation> <translation id="6689249931105087298">與黑點壓縮相對</translation> <translation id="6689271823431384964">你已登入帳戶,因此 Chrome 詢問你是否要將卡片儲存至 Google 帳戶。你可以在設定中變更這項行為。持卡人姓名來自你的帳戶。</translation> +<translation id="6698381487523150993">建立於:</translation> <translation id="6702919718839027939">簡報</translation> <translation id="6710213216561001401">返回</translation> <translation id="6710594484020273272"><輸入搜尋字詞></translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 2cde8b3e..7f0c4e2 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -1440,6 +1440,7 @@ <translation id="6687335167692595844">Usayizi wefonti eceliwe</translation> <translation id="6689249931105087298">Kuhlobene nephoyinti elimnyama lokucindezela</translation> <translation id="6689271823431384964">I-Chrome inikeza ngokulondoloza amakhadi akho ku-akhawunti yakho ye-Google ngoba ungene ngemvume. Ungashintsha le mpatho kuzilungiselelo. Igama lomnikazi wekhadi livela ku-akhawunti yakho.</translation> +<translation id="6698381487523150993">Idalwe:</translation> <translation id="6702919718839027939">Okwamanje</translation> <translation id="6710213216561001401">Okwedlule</translation> <translation id="6710594484020273272"><Thayipha itemu lokusesha></translation>
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h index c03cda90..4b5da2b 100644 --- a/components/sync/protocol/proto_visitors.h +++ b/components/sync/protocol/proto_visitors.h
@@ -818,6 +818,8 @@ VISIT(navigation_time_usec); VISIT(device_name); VISIT(target_device_sync_cache_guid); + VISIT(opened); + VISIT(notification_dismissed); } VISIT_PROTO_FIELDS(const sync_pb::SessionHeader& proto) {
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_client.cc b/components/sync/trusted_vault/standalone_trusted_vault_client.cc index f49bb8c..98a8eda 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_client.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_client.cc
@@ -54,12 +54,8 @@ ~PrimaryAccountObserver() override; // signin::IdentityManager::Observer implementation. - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override; - void OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) override; - void OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& unconsented_primary_account_info) override; + void OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) override; private: void UpdatePrimaryAccountIfNeeded(); @@ -89,18 +85,8 @@ identity_manager_->RemoveObserver(this); } -void PrimaryAccountObserver::OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) { - UpdatePrimaryAccountIfNeeded(); -} - -void PrimaryAccountObserver::OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) { - UpdatePrimaryAccountIfNeeded(); -} - -void PrimaryAccountObserver::OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& unconsented_primary_account_info) { +void PrimaryAccountObserver::OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) { UpdatePrimaryAccountIfNeeded(); }
diff --git a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc index 96f7f619..3a329d8ed 100644 --- a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc +++ b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc
@@ -50,18 +50,8 @@ } } -void TrustedVaultAccessTokenFetcherFrontend::OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) { - UpdatePrimaryAccountIfNeeded(); -} - -void TrustedVaultAccessTokenFetcherFrontend::OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) { - UpdatePrimaryAccountIfNeeded(); -} - -void TrustedVaultAccessTokenFetcherFrontend::OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& unconsented_primary_account_info) { +void TrustedVaultAccessTokenFetcherFrontend::OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) { UpdatePrimaryAccountIfNeeded(); }
diff --git a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.h b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.h index b0e0b25..7f882be7 100644 --- a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.h +++ b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.h
@@ -46,12 +46,8 @@ TrustedVaultAccessTokenFetcher::TokenCallback callback); // signin::IdentityManager::Observer implementation. - void OnPrimaryAccountSet( - const CoreAccountInfo& primary_account_info) override; - void OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) override; - void OnUnconsentedPrimaryAccountChanged( - const CoreAccountInfo& unconsented_primary_account_info) override; + void OnPrimaryAccountChanged( + const signin::PrimaryAccountChangeEvent& event) override; private: // Updates |primary_account_| and runs |pending_requests_| in case
diff --git a/components/tracing/common/trace_startup_config.cc b/components/tracing/common/trace_startup_config.cc index 59c1e6e..e9d0e43 100644 --- a/components/tracing/common/trace_startup_config.cc +++ b/components/tracing/common/trace_startup_config.cc
@@ -90,11 +90,11 @@ DCHECK(IsEnabled()); DCHECK(!IsTracingStartupForDuration()); DCHECK_EQ(SessionOwner::kBackgroundTracing, session_owner_); - CHECK(!ShouldTraceToResultFile()); + CHECK(GetResultFile().empty()); } else if (EnableFromATrace()) { DCHECK(IsEnabled()); DCHECK_EQ(SessionOwner::kSystemTracing, session_owner_); - CHECK(!ShouldTraceToResultFile()); + CHECK(GetResultFile().empty()); } } @@ -128,20 +128,11 @@ return output_format_; } -bool TraceStartupConfig::ShouldTraceToResultFile() const { - return IsEnabled() && should_trace_to_result_file_; -} - base::FilePath TraceStartupConfig::GetResultFile() const { DCHECK(IsEnabled()); - DCHECK(ShouldTraceToResultFile()); return result_file_; } -void TraceStartupConfig::OnTraceToResultFileFinished() { - finished_writing_to_file_ = true; -} - void TraceStartupConfig::SetBackgroundStartupTracingEnabled(bool enabled) { #if defined(OS_ANDROID) base::android::SetBackgroundStartupTracingFlag(enabled); @@ -174,25 +165,41 @@ << "=" << startup_duration_str << " defaulting to 5 (secs)"; startup_duration_in_seconds_ = kDefaultStartupDurationInSeconds; } + } else if (command_line->HasSwitch(switches::kEnableTracing)) { + // For --enable-tracing, tracing should last until browser shutdown. + startup_duration_in_seconds_ = 0; } - if (command_line->GetSwitchValueASCII(switches::kTraceStartupFormat) == - "proto") { - // Default is "json". + if (command_line->HasSwitch(switches::kTraceStartupFormat)) { + if (command_line->GetSwitchValueASCII(switches::kTraceStartupFormat) == + "proto") { + // Default is "json". + output_format_ = OutputFormat::kProto; + } + } else if (command_line->GetSwitchValueASCII( + switches::kEnableTracingFormat) == "proto") { output_format_ = OutputFormat::kProto; } - if (!command_line->HasSwitch(switches::kTraceStartup)) + if (!command_line->HasSwitch(switches::kTraceStartup) && + !command_line->HasSwitch(switches::kEnableTracing)) { return false; + } + + std::string categories; + if (command_line->HasSwitch(switches::kTraceStartup)) { + categories = command_line->GetSwitchValueASCII(switches::kTraceStartup); + } else { + categories = command_line->GetSwitchValueASCII(switches::kEnableTracing); + } trace_config_ = base::trace_event::TraceConfig( - command_line->GetSwitchValueASCII(switches::kTraceStartup), + categories, command_line->GetSwitchValueASCII(switches::kTraceStartupRecordMode)); result_file_ = command_line->GetSwitchValuePath(switches::kTraceStartupFile); is_enabled_ = true; - should_trace_to_result_file_ = true; return true; } @@ -227,7 +234,6 @@ if (trace_config_file.empty()) { is_enabled_ = true; - should_trace_to_result_file_ = true; DLOG(WARNING) << "Use default trace config."; return true; } @@ -247,7 +253,6 @@ is_enabled_ = ParseTraceConfigFileContent(trace_config_file_content); if (!is_enabled_) DLOG(WARNING) << "Cannot parse the trace config file correctly."; - should_trace_to_result_file_ = is_enabled_; return is_enabled_; } @@ -269,7 +274,6 @@ is_enabled_ = true; session_owner_ = SessionOwner::kBackgroundTracing; - should_trace_to_result_file_ = false; // Set startup duration to 0 since background tracing config will configure // the durations later. startup_duration_in_seconds_ = 0;
diff --git a/components/tracing/common/trace_startup_config.h b/components/tracing/common/trace_startup_config.h index 8f0c3e8c..74e6f31 100644 --- a/components/tracing/common/trace_startup_config.h +++ b/components/tracing/common/trace_startup_config.h
@@ -126,21 +126,12 @@ base::trace_event::TraceConfig GetTraceConfig() const; int GetStartupDuration() const; - // Returns true while startup tracing is not finished, if trace should be - // saved to result file. - bool ShouldTraceToResultFile() const; + // Returns the name of the file to write the trace result into. base::FilePath GetResultFile() const; - void OnTraceToResultFileFinished(); // Set the background tracing config in preferences for the next session. void SetBackgroundStartupTracingEnabled(bool enabled); - // Returns when the startup tracing is finished and written to file, false on - // all other cases. - bool finished_writing_to_file_for_testing() const { - return finished_writing_to_file_; - } - SessionOwner GetSessionOwner() const; OutputFormat GetOutputFormat() const; @@ -173,9 +164,7 @@ bool enable_background_tracing_for_testing_ = false; base::trace_event::TraceConfig trace_config_; int startup_duration_in_seconds_ = kDefaultStartupDurationInSeconds; - bool should_trace_to_result_file_ = false; base::FilePath result_file_; - bool finished_writing_to_file_ = false; SessionOwner session_owner_ = SessionOwner::kTracingController; bool session_adopted_ = false; OutputFormat output_format_ = OutputFormat::kLegacyJSON;
diff --git a/components/tracing/common/tracing_switches.cc b/components/tracing/common/tracing_switches.cc index 1d545b1..6b2d8137 100644 --- a/components/tracing/common/tracing_switches.cc +++ b/components/tracing/common/tracing_switches.cc
@@ -18,14 +18,25 @@ // specify the specific trace categories to include (e.g. // --trace-startup=base,net) otherwise, all events are recorded. Setting this // flag results in the first call to BeginTracing() to receive all trace events -// since startup. In Chrome, you may find --trace-startup-file and +// since startup. +// +// Historically, --trace-startup was used for browser startup profiling and +// --enable-tracing was used for browsertest tracing. Now they are share the +// same implementation, but both are still supported to avoid disrupting +// existing workflows. The only difference between them is the default duration +// (5 seconds for trace-startup, unlimited for enable-tracing). If both are +// specified, 'trace-startup' takes precedence. +// +// In Chrome, you may find --trace-startup-file and // --trace-startup-duration to control the auto-saving of the trace (not // supported in the base-only TraceLog component). -const char kTraceStartup[] = "trace-startup"; +const char kTraceStartup[] = "trace-startup"; +const char kEnableTracing[] = "enable-tracing"; -// Sets the time in seconds until startup tracing ends. If omitted a default of -// 5 seconds is used. Has no effect without --trace-startup, or if -// --startup-trace-file=none was supplied. +// Sets the time in seconds until startup tracing ends. If omitted: +// - if --trace-startup is specified, a default of 5 seconds is used. +// - if --enable-tracing is specified, tracing lasts until the browser is +// closed. Has no effect otherwise. const char kTraceStartupDuration[] = "trace-startup-duration"; // If supplied, sets the file which startup tracing will be stored into, if @@ -35,7 +46,16 @@ // As a special case, can be set to 'none' - this disables automatically saving // the result to a file and the first manually recorded trace will then receive // all events since startup. -const char kTraceStartupFile[] = "trace-startup-file"; +const char kTraceStartupFile[] = "trace-startup-file"; + +// Similar to the flag above, with the following differences: +// - A more detailed basename will be generated. +// - If the value is empty or ends with path separator, the provided directory +// will be used (with empty standing for current directory) and a detailed +// basename file will be generated. +// +// It is ignored if --trace-startup-file is specified. +const char kEnableTracingOutput[] = "enable-tracing-output"; // Sets the output format for the trace, valid values are "json" and "proto". // If not set, the current default is "json". @@ -44,6 +64,7 @@ // unexpectedly terminates. // Ignored if "trace-startup-owner" is not "controller". const char kTraceStartupFormat[] = "trace-startup-format"; +const char kEnableTracingFormat[] = "enable-tracing-format"; // If supplied, sets the tracing record mode and options; otherwise, the default // "record-until-full" mode will be used.
diff --git a/components/tracing/common/tracing_switches.h b/components/tracing/common/tracing_switches.h index 05ee0b9..d0ae956c 100644 --- a/components/tracing/common/tracing_switches.h +++ b/components/tracing/common/tracing_switches.h
@@ -12,10 +12,13 @@ TRACING_EXPORT extern const char kEnableBackgroundTracing[]; TRACING_EXPORT extern const char kTraceConfigFile[]; TRACING_EXPORT extern const char kTraceStartup[]; +TRACING_EXPORT extern const char kEnableTracing[]; TRACING_EXPORT extern const char kTraceStartupDuration[]; TRACING_EXPORT extern const char kTraceStartupFile[]; +TRACING_EXPORT extern const char kEnableTracingOutput[]; TRACING_EXPORT extern const char kTraceStartupRecordMode[]; TRACING_EXPORT extern const char kTraceStartupFormat[]; +TRACING_EXPORT extern const char kEnableTracingFormat[]; TRACING_EXPORT extern const char kTraceStartupOwner[]; TRACING_EXPORT extern const char kTraceStartupEnablePrivacyFiltering[]; TRACING_EXPORT extern const char kPerfettoDisableInterning[];
diff --git a/components/translate/OWNERS b/components/translate/OWNERS index 420b2c6d..9be5fe7 100644 --- a/components/translate/OWNERS +++ b/components/translate/OWNERS
@@ -15,3 +15,7 @@ napper@chromium.org sclittle@chromium.org toyoshim@chromium.org + +# Specialized reviewers +# UMA and UKM translate metrics +curranmax@chromium.org
diff --git a/components/ukm/ukm_recorder_impl.cc b/components/ukm/ukm_recorder_impl.cc index 0871b25e..aaa28a3 100644 --- a/components/ukm/ukm_recorder_impl.cc +++ b/components/ukm/ukm_recorder_impl.cc
@@ -59,8 +59,9 @@ // new ones being added. size_t GetMaxSources() { constexpr size_t kDefaultMaxSources = 500; - return static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( + static auto value = static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( kUkmFeature, "MaxSources", kDefaultMaxSources)); + return value; } // Gets the maximum number of Sources we can keep in memory at the end of the @@ -68,16 +69,18 @@ // interval. size_t GetMaxKeptSources() { constexpr size_t kDefaultMaxKeptSources = 100; - return static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( + static auto value = static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( kUkmFeature, "MaxKeptSources", kDefaultMaxKeptSources)); + return value; } // Gets the maximum number of Entries we'll keep in memory before discarding any // new ones being added. size_t GetMaxEntries() { constexpr size_t kDefaultMaxEntries = 5000; - return static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( + static auto value = static_cast<size_t>(base::GetFieldTrialParamByFeatureAsInt( kUkmFeature, "MaxEntries", kDefaultMaxEntries)); + return value; } // Returns whether |url| has one of the schemes supported for logging to UKM.
diff --git a/components/webapps/webapps_client.h b/components/webapps/webapps_client.h index 9e850e1..a9b3f3f2 100644 --- a/components/webapps/webapps_client.h +++ b/components/webapps/webapps_client.h
@@ -50,6 +50,9 @@ const GURL& manifest_url) = 0; virtual bool CanShowAppBanners(content::WebContents* web_contents) = 0; + + virtual void OnWebApkInstallInitiatedFromAppMenu( + content::WebContents* web_contents) = 0; #endif };
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc index 1703a41..feea9670 100644 --- a/content/app/content_main_runner_impl.cc +++ b/content/app/content_main_runner_impl.cc
@@ -240,16 +240,19 @@ } void EnablePCScanForMallocPartitionsIfNeeded() { -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN CHECK(base::FeatureList::GetInstance()); - base::allocator::EnablePCScanIfNeeded(); + if (base::FeatureList::IsEnabled(base::features::kPartitionAllocPCScan)) { + base::allocator::EnablePCScan(); + } #endif } void EnablePCScanForMallocPartitionsInBrowserProcessIfNeeded() { -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && ALLOW_PCSCAN CHECK(base::FeatureList::GetInstance()); - if (base::features::IsPartitionAllocPCScanBrowserOnlyEnabled()) { + if (base::FeatureList::IsEnabled( + base::features::kPartitionAllocPCScanBrowserOnly)) { base::allocator::EnablePCScan(); } #endif
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc index bea492a..7438c791 100644 --- a/content/browser/accessibility/browser_accessibility_com_win.cc +++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -498,6 +498,7 @@ IFACEMETHODIMP BrowserAccessibilityComWin::get_hyperlink( LONG index, IAccessibleHyperlink** hyperlink) { + *hyperlink = nullptr; WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_HYPERLINK); AddAccessibilityModeFlags(kScreenReaderAndHTMLAccessibilityModes); if (!owner()) @@ -514,7 +515,13 @@ int32_t id = hypertext_.hyperlinks[index]; AXPlatformNode* node = AXPlatformNodeWin::GetFromUniqueId(id); if (!node) { - // Error: possibly incorrect number of hyper links reported. + // TODO(https://crbug.com/id=1164043) Fix illegal hyperlink of iframes. + // Based on information received from DumpWithoutCrashing() reports, this + // is still sometimes occurring when get_hyperlink() is called on an + // iframe, which would have exactly 1 hyperlink and no text. The + // DumpWithoutCrashing() was removed to reduced crash report noise. + // Interestingly, the top url reported was always called "empty". + // Sample report for iframe issue: go/crash/93d7fce137a15ef0 LONG num_hyperlinks = -1; get_nHyperlinks(&num_hyperlinks); std::ostringstream error; @@ -526,7 +533,11 @@ static auto* hyperlink_err = base::debug::AllocateCrashKeyString( "ax_hyperlink_err2", base::debug::CrashKeySize::Size256); base::debug::SetCrashKeyString(hyperlink_err, error.str().substr(230)); - base::debug::DumpWithoutCrashing(); + if (GetData().role != ax::mojom::Role::kIframe) { + // Only report for non-iframe situation. The iframe occurrence is known + // and was too noisy to keep reporting. + base::debug::DumpWithoutCrashing(); + } NOTREACHED() << "Hyperlink error: " << error.str(); return E_FAIL; }
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index d01bf08a..150923e3 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -357,9 +357,11 @@ return; parent->OnDataChanged(); parent->UpdatePlatformAttributes(); - parent = - RetargetForEvents(parent, RetargetEventType::RetargetEventTypeGenerated); - FireGeneratedEvent(ui::AXEventGenerator::Event::CHILDREN_CHANGED, parent); + BrowserAccessibilityManager* parent_manager = parent->manager(); + parent = parent_manager->RetargetForEvents( + parent, RetargetEventType::RetargetEventTypeGenerated); + parent_manager->FireGeneratedEvent( + ui::AXEventGenerator::Event::CHILDREN_CHANGED, parent); } BrowserAccessibility* BrowserAccessibilityManager::GetPopupRoot() const {
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index 1d97199..94817884 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -196,6 +196,9 @@ // If this tree has a parent tree, return the parent node in that tree. BrowserAccessibility* GetParentNodeFromParentTree() const; + // Refreshes a parent node in a parent tree when it needs to be informed that + // this tree is ready or being destroyed. For example, an iframe object + // in a parent tree may need to link or unlink to this manager. void ParentConnectionChanged(BrowserAccessibility* parent); // In general, there is only a single node with the role of kRootWebArea,
diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc index 5c5036f8..5d2e3a9 100644 --- a/content/browser/child_process_security_policy_impl.cc +++ b/content/browser/child_process_security_policy_impl.cc
@@ -2171,9 +2171,6 @@ const IsolationContext& isolation_context, const url::Origin& origin, bool origin_requests_isolation) { - // Note: we cannot check the feature flags and early-out here, because the - // origin trial might be active (in which case no feature flags are active). - if (!IsolatedOriginUtil::IsValidOriginForOptInIsolation(origin)) return false;
diff --git a/content/browser/conversions/conversions_browsertest.cc b/content/browser/conversions/conversions_browsertest.cc index 6df8d3c..bb519b7e 100644 --- a/content/browser/conversions/conversions_browsertest.cc +++ b/content/browser/conversions/conversions_browsertest.cc
@@ -161,6 +161,40 @@ } IN_PROC_BROWSER_TEST_F(ConversionsBrowserTest, + WindowOpenImpressionConversion_ReportSent) { + // Expected reports must be registered before the server starts. + ExpectedReportWaiter expected_report( + GURL( + "https://a.test/.well-known/" + "register-conversion?impression-data=1&conversion-data=7&credit=100"), + https_server()); + ASSERT_TRUE(https_server()->Start()); + + GURL impression_url = https_server()->GetURL( + "a.test", "/conversions/page_with_impression_creator.html"); + EXPECT_TRUE(NavigateToURL(web_contents(), impression_url)); + + // Create an anchor tag with impression attributes and click the link. By + // default the target is set to "_top". + GURL conversion_url = https_server()->GetURL( + "b.test", "/conversions/page_with_conversion_redirect.html"); + TestNavigationObserver observer(web_contents()); + EXPECT_TRUE( + ExecJs(web_contents(), + JsReplace(R"(window.open($1, '_top', '', + {impressionData: '1', conversionDestination: $2});)", + conversion_url, url::Origin::Create(conversion_url)))); + observer.Wait(); + + // Register a conversion with the original page as the reporting origin. + EXPECT_TRUE( + ExecJs(web_contents(), JsReplace("registerConversionForOrigin(7, $1)", + url::Origin::Create(impression_url)))); + + EXPECT_EQ(expected_report.expected_url, expected_report.WaitForRequestUrl()); +} + +IN_PROC_BROWSER_TEST_F(ConversionsBrowserTest, ImpressionFromCrossOriginSubframe_ReportSent) { ExpectedReportWaiter expected_report( GURL(
diff --git a/content/browser/conversions/impression_declaration_browsertest.cc b/content/browser/conversions/impression_declaration_browsertest.cc index 512f757..ca25e8f 100644 --- a/content/browser/conversions/impression_declaration_browsertest.cc +++ b/content/browser/conversions/impression_declaration_browsertest.cc
@@ -560,4 +560,47 @@ EXPECT_EQ(1UL, second_impression_observer.Wait().impression_data); } +IN_PROC_BROWSER_TEST_F(ImpressionDeclarationBrowserTest, + WindowOpenImpression_ImpressionReceived) { + ImpressionObserver impression_observer(web_contents()); + GURL page_url = + https_server()->GetURL("b.test", "/page_with_impression_creator.html"); + EXPECT_TRUE(NavigateToURL(web_contents(), page_url)); + + // Navigate the page using window.open and set an impression. + EXPECT_TRUE(ExecJs(web_contents(), R"( + window.open("https://a.com", "_top", "", + {impressionData: "1", conversionDestination: "https://a.com", + reportingOrigin: "https://report.com", impressionExpiry: 1000});)")); + + // Wait for the impression to be seen by the observer. + Impression last_impression = impression_observer.Wait(); + + // Verify the attributes of the impression are set as expected. + EXPECT_EQ(1UL, last_impression.impression_data); + EXPECT_EQ(url::Origin::Create(GURL("https://a.com")), + last_impression.conversion_destination); + EXPECT_EQ(url::Origin::Create(GURL("https://report.com")), + last_impression.reporting_origin); + EXPECT_EQ(base::TimeDelta::FromMilliseconds(1000), *last_impression.expiry); +} + +IN_PROC_BROWSER_TEST_F(ImpressionDeclarationBrowserTest, + WindowOpenNoUserGesture_NoImpression) { + ImpressionObserver impression_observer(web_contents()); + GURL page_url = + https_server()->GetURL("b.test", "/page_with_impression_creator.html"); + EXPECT_TRUE(NavigateToURL(web_contents(), page_url)); + + // Navigate the page using window.open and set an impression, but do not give + // a user gesture. + EXPECT_TRUE(ExecJs(web_contents(), R"( + window.open("https://a.com", "_top", "", + {impressionData: "1", conversionDestination: "https://a.com", + reportingOrigin: "https://report.com", impressionExpiry: 1000});)", + EXECUTE_SCRIPT_NO_USER_GESTURE)); + + EXPECT_TRUE(impression_observer.WaitForNavigationWithNoImpression()); +} + } // namespace content
diff --git a/content/browser/file_system_access/native_file_system_file_writer_impl.cc b/content/browser/file_system_access/native_file_system_file_writer_impl.cc index dc12072..251ab51 100644 --- a/content/browser/file_system_access/native_file_system_file_writer_impl.cc +++ b/content/browser/file_system_access/native_file_system_file_writer_impl.cc
@@ -160,21 +160,21 @@ } NativeFileSystemFileWriterImpl::~NativeFileSystemFileWriterImpl() { - if (can_purge()) { - DoFileSystemOperation(FROM_HERE, &FileSystemOperationRunner::RemoveFile, - base::BindOnce( - [](const storage::FileSystemURL& swap_url, - base::File::Error result) { - if (result != base::File::FILE_OK) { - DLOG(ERROR) - << "Error Deleting Swap File, status: " - << base::File::ErrorToString(result) - << " path: " << swap_url.path(); - } - }, - swap_url()), - swap_url()); - } + // Purge the swap file. The swap file should be deleted after Close(), but + // we'll try to delete it anyways in case the writer wasn't closed cleanly. + DoFileSystemOperation( + FROM_HERE, &FileSystemOperationRunner::RemoveFile, + base::BindOnce( + [](const storage::FileSystemURL& swap_url, base::File::Error result) { + if (result != base::File::FILE_OK && + result != base::File::FILE_ERROR_NOT_FOUND) { + DLOG(ERROR) << "Error Deleting Swap File, status: " + << base::File::ErrorToString(result) + << " path: " << swap_url.path(); + } + }, + swap_url()), + swap_url()); } void NativeFileSystemFileWriterImpl::Write( @@ -355,35 +355,36 @@ } // namespace // Do not call this method if |close_callback_| is not set. -void NativeFileSystemFileWriterImpl::CallCloseCallbackAndMaybeDeleteThis( +void NativeFileSystemFileWriterImpl::CallCloseCallbackAndDeleteThis( blink::mojom::FileSystemAccessErrorPtr result) { std::move(close_callback_).Run(std::move(result)); - if (!receiver_.is_bound()) { - // |this| is deleted after this call. - manager()->RemoveFileWriter(this); - } + // |this| is deleted after this call. + manager()->RemoveFileWriter(this); } void NativeFileSystemFileWriterImpl::OnDisconnect() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); receiver_.reset(); - if (!close_callback_) { - if (!is_closed() && auto_close_) { - // Close the Writer. |this| is deleted via - // CallCloseCallbackAndMaybeDeleteThis when Close finishes. - Close(base::BindOnce([](blink::mojom::FileSystemAccessErrorPtr result) { - if (result->status != blink::mojom::FileSystemAccessStatus::kOk) { - DLOG(ERROR) << "AutoClose failed with result:" - << base::File::ErrorToString(result->file_error); - } - })); - return; - } - // |this| is deleted after this call. - manager()->RemoveFileWriter(this); + if (is_close_pending()) + // Mojo connection lost while Close() in progress. + return; + + if (auto_close_) { + // Close the Writer. |this| is deleted via + // CallCloseCallbackAndDeleteThis when Close() finishes. + Close(base::BindOnce([](blink::mojom::FileSystemAccessErrorPtr result) { + if (result->status != blink::mojom::FileSystemAccessStatus::kOk) { + DLOG(ERROR) << "AutoClose failed with result:" + << base::File::ErrorToString(result->file_error); + } + })); + return; } + + // Mojo connection severed before Close() called. Destroy |this|. + manager()->RemoveFileWriter(this); } void NativeFileSystemFileWriterImpl::WriteImpl( @@ -394,11 +395,11 @@ DCHECK_EQ(GetWritePermissionStatus(), blink::mojom::PermissionStatus::GRANTED); - if (is_closed()) { + if (is_close_pending()) { std::move(callback).Run( native_file_system_error::FromStatus( FileSystemAccessStatus::kInvalidState, - "An attempt was made to write to a closed writer."), + "An attempt was made to write to a closing writer."), /*bytes_written=*/0); return; } @@ -443,11 +444,11 @@ DCHECK_EQ(GetWritePermissionStatus(), blink::mojom::PermissionStatus::GRANTED); - if (is_closed()) { + if (is_close_pending()) { std::move(callback).Run( native_file_system_error::FromStatus( FileSystemAccessStatus::kInvalidState, - "An attempt was made to write to a closed writer."), + "An attempt was made to write to a closing writer."), /*bytes_written=*/0); return; } @@ -481,10 +482,10 @@ DCHECK_EQ(GetWritePermissionStatus(), blink::mojom::PermissionStatus::GRANTED); - if (is_closed()) { + if (is_close_pending()) { std::move(callback).Run(native_file_system_error::FromStatus( FileSystemAccessStatus::kInvalidState, - "An attempt was made to write to a closed writer.")); + "An attempt was made to write to a closing writer.")); return; } @@ -503,15 +504,14 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_EQ(GetWritePermissionStatus(), blink::mojom::PermissionStatus::GRANTED); - if (is_closed()) { + if (is_close_pending()) { std::move(callback).Run(native_file_system_error::FromStatus( FileSystemAccessStatus::kInvalidState, - "An attempt was made to close an already closed writer.")); + "An attempt was made to close an already closing writer.")); return; } close_callback_ = std::move(callback); - state_ = State::kClosePending; if (!RequireSecurityChecks() || !manager()->permission_context()) { DidAfterWriteCheck( @@ -526,17 +526,19 @@ void NativeFileSystemFileWriterImpl::AbortImpl(AbortCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (is_closed()) { + if (is_close_pending()) { std::move(callback).Run(native_file_system_error::FromStatus( FileSystemAccessStatus::kInvalidState, - "An attempt was made to abort an already closed writer.")); + "An attempt was made to abort an already closing writer.")); return; } - state_ = State::kClosed; auto_close_ = false; std::move(callback).Run(native_file_system_error::Ok()); + + // |this| is deleted after this call. + manager()->RemoveFileWriter(this); } // static @@ -551,7 +553,7 @@ // callback. manager()->operation_runner().PostTaskWithThisObject( FROM_HERE, base::BindOnce(&RemoveSwapFile, swap_url())); - CallCloseCallbackAndMaybeDeleteThis(native_file_system_error::FromStatus( + CallCloseCallbackAndDeleteThis(native_file_system_error::FromStatus( FileSystemAccessStatus::kOperationAborted, "Failed to perform Safe Browsing check.")); return; @@ -579,7 +581,7 @@ // file and call the callback to report that close failed. manager()->operation_runner().PostTaskWithThisObject( FROM_HERE, base::BindOnce(&RemoveSwapFile, swap_url())); - CallCloseCallbackAndMaybeDeleteThis(native_file_system_error::FromStatus( + CallCloseCallbackAndDeleteThis(native_file_system_error::FromStatus( FileSystemAccessStatus::kOperationAborted, "Write operation blocked by Safe Browsing.")); return; @@ -616,17 +618,15 @@ base::File::Error result) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (result != base::File::FILE_OK) { - state_ = State::kCloseError; DLOG(ERROR) << "Swap file move operation failed source: " << swap_url().path() << " dest: " << url().path() << " error: " << base::File::ErrorToString(result); - CallCloseCallbackAndMaybeDeleteThis( + CallCloseCallbackAndDeleteThis( native_file_system_error::FromFileError(result)); return; } - state_ = State::kClosed; - CallCloseCallbackAndMaybeDeleteThis(native_file_system_error::Ok()); + CallCloseCallbackAndDeleteThis(native_file_system_error::Ok()); } void NativeFileSystemFileWriterImpl::DidSwapFileDoQuarantine( @@ -637,10 +637,9 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (result != base::File::FILE_OK) { - state_ = State::kCloseError; DLOG(ERROR) << "Swap file move operation failed dest: " << target_url.path() << " error: " << base::File::ErrorToString(result); - CallCloseCallbackAndMaybeDeleteThis( + CallCloseCallbackAndDeleteThis( native_file_system_error::FromFileError(result)); return; } @@ -697,7 +696,6 @@ mojo::Remote<quarantine::mojom::Quarantine> quarantine_remote, quarantine::mojom::QuarantineFileResult result) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - state_ = State::kClosed; if (result != quarantine::mojom::QuarantineFileResult::OK && result != quarantine::mojom::QuarantineFileResult::ANNOTATION_FAILED) { @@ -705,13 +703,13 @@ // file will be deleted at this point by AttachmentServices on Windows. // There is nothing to do except to return the error message to the // application. - CallCloseCallbackAndMaybeDeleteThis(native_file_system_error::FromStatus( + CallCloseCallbackAndDeleteThis(native_file_system_error::FromStatus( FileSystemAccessStatus::kOperationAborted, "Write operation aborted due to security policy.")); return; } - CallCloseCallbackAndMaybeDeleteThis(native_file_system_error::Ok()); + CallCloseCallbackAndDeleteThis(native_file_system_error::Ok()); } void NativeFileSystemFileWriterImpl::ComputeHashForSwapFile(
diff --git a/content/browser/file_system_access/native_file_system_file_writer_impl.h b/content/browser/file_system_access/native_file_system_file_writer_impl.h index 2a9e1433..23a9f89 100644 --- a/content/browser/file_system_access/native_file_system_file_writer_impl.h +++ b/content/browser/file_system_access/native_file_system_file_writer_impl.h
@@ -66,7 +66,9 @@ WriteStreamCallback callback) override; void Truncate(uint64_t length, TruncateCallback callback) override; + // The writer will be destroyed upon completion. void Close(CloseCallback callback) override; + // The writer will be destroyed upon completion. void Abort(AbortCallback callback) override; using HashCallback = base::OnceCallback< @@ -82,10 +84,13 @@ mojo::Receiver<blink::mojom::FileSystemAccessFileWriter> receiver_; + // If the mojo pipe is severed before either Close() or Abort() is invoked, + // the transaction is aborted from the OnDisconnect method. Otherwise, the + // writer will be destroyed upon completion of Close() or Abort(). void OnDisconnect(); - // Delete the FileWriter after Close if the mojo pipe is unbound. - void CallCloseCallbackAndMaybeDeleteThis( + // Destroys the file writer after calling the close callback. + void CallCloseCallbackAndDeleteThis( blink::mojom::FileSystemAccessErrorPtr result); void WriteImpl(uint64_t offset, @@ -125,44 +130,13 @@ void ComputeHashForSwapFile(HashCallback callback); - enum class State { - // The writer accepts write operations. - kOpen, - // The writer does not accept write operations and is in the process of - // closing. - kClosePending, - // The writer does not accept write operations and has entered an error - // state. A swap file may need to be purged. - kCloseError, - // The writer does not accept write operations. There should be no more swap - // file. - kClosed, - }; - bool is_closed() const { return state_ != State::kOpen; } - // Returns whether the File Writer is in a state where any files can be - // deleted. We do not want to delete the files if there are clean-up - // operations in-flight. - bool can_purge() const { - return state_ == State::kOpen || state_ == State::kCloseError; - } + bool is_close_pending() const { return !close_callback_.is_null(); } // We write using this file URL. When `Close()` is invoked, we // execute a move operation from the swap URL to the target URL at `url_`. In // most filesystems, this move operation is atomic. storage::FileSystemURL swap_url_; - // NativeFileSystemWriter lifetime management has the following cases: - // 1) The mojo pipe is severed before Close() is invoked. - // - Abort the transaction from the OnDisconnect method. - // 2) The mojo pipe is severed before Close() finishes. - // - The Close() call is allowed to finish. - // - The Writer is destroyed immediately afterwards, via the - // CallCloseCallbackAndMaybeDeleteThis method. - // 3) The mojo pipe exists when Close() finishes. - // - The Writer will exist for as long as the mojo pipe is connected. - // - The Writer is destroyed via the OnDisconnect method. - State state_ = State::kOpen; - // This callback is non-null when the State is kClosePending or kCloseError. CloseCallback close_callback_; download::QuarantineConnectionCallback quarantine_connection_callback_;
diff --git a/content/browser/file_system_access/native_file_system_file_writer_impl_unittest.cc b/content/browser/file_system_access/native_file_system_file_writer_impl_unittest.cc index b5dd989..a71bad1c 100644 --- a/content/browser/file_system_access/native_file_system_file_writer_impl_unittest.cc +++ b/content/browser/file_system_access/native_file_system_file_writer_impl_unittest.cc
@@ -549,7 +549,7 @@ EXPECT_EQ(std::string("abc\0\0", 5), ReadFile(test_file_url_)); } -TEST_F(NativeFileSystemFileWriterImplTest, CloseAfterCloseNotOK) { +TEST_F(NativeFileSystemFileWriterImplTest, WriterDestroyedAfterClose) { uint64_t bytes_written; FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); EXPECT_EQ(result, FileSystemAccessStatus::kOk); @@ -557,49 +557,13 @@ result = CloseSync(); EXPECT_EQ(result, FileSystemAccessStatus::kOk); - result = CloseSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); + EXPECT_TRUE(handle_.WasInvalidated()); + EXPECT_FALSE(storage::AsyncFileTestHelper::FileExists( + file_system_context_.get(), test_swap_url_, + storage::AsyncFileTestHelper::kDontCheckSize)); } -TEST_F(NativeFileSystemFileWriterImplTest, TruncateAfterCloseNotOK) { - uint64_t bytes_written; - FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - EXPECT_EQ(bytes_written, 3u); - - result = CloseSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - - result = TruncateSync(0); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); -} - -TEST_P(NativeFileSystemFileWriterImplWriteTest, WriteAfterCloseNotOK) { - uint64_t bytes_written; - FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - EXPECT_EQ(bytes_written, 3u); - - result = CloseSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - - result = WriteSync(0, "bcd", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); -} - -TEST_F(NativeFileSystemFileWriterImplTest, AbortAfterCloseNotOK) { - uint64_t bytes_written; - FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - EXPECT_EQ(bytes_written, 3u); - - result = CloseSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - result = AbortSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); -} - -TEST_F(NativeFileSystemFileWriterImplTest, AbortOK) { +TEST_F(NativeFileSystemFileWriterImplTest, WriterDestroyedAfterAbort) { uint64_t bytes_written; FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); EXPECT_EQ(result, FileSystemAccessStatus::kOk); @@ -608,44 +572,10 @@ result = AbortSync(); EXPECT_EQ(result, FileSystemAccessStatus::kOk); EXPECT_EQ("", ReadFile(test_file_url_)); -} - -TEST_F(NativeFileSystemFileWriterImplTest, TruncateAfterAbortNotOK) { - uint64_t bytes_written; - FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - EXPECT_EQ(bytes_written, 3u); - - result = AbortSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - - result = TruncateSync(0); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); -} - -TEST_P(NativeFileSystemFileWriterImplWriteTest, WriteAfterAbortNotOK) { - uint64_t bytes_written; - FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - EXPECT_EQ(bytes_written, 3u); - - result = AbortSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - - result = WriteSync(0, "bcd", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); -} - -TEST_F(NativeFileSystemFileWriterImplTest, CloseAfterAbortNotOK) { - uint64_t bytes_written; - FileSystemAccessStatus result = WriteSync(0, "abc", &bytes_written); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - EXPECT_EQ(bytes_written, 3u); - - result = AbortSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kOk); - result = CloseSync(); - EXPECT_EQ(result, FileSystemAccessStatus::kInvalidState); + EXPECT_TRUE(handle_.WasInvalidated()); + EXPECT_FALSE(storage::AsyncFileTestHelper::FileExists( + file_system_context_.get(), test_swap_url_, + storage::AsyncFileTestHelper::kDontCheckSize)); } // TODO(mek): More tests, particularly for error conditions.
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index c2028f2c..bb38974 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -900,12 +900,44 @@ } #endif // OS_WIN - if (!gpu_info_for_hardware_gpu_.IsInitialized()) { - if (gpu_info_for_hardware_gpu) { + bool needs_to_update_gpu_info_for_hardware_gpu = + !gpu_info_for_hardware_gpu_.IsInitialized(); + if (!needs_to_update_gpu_info_for_hardware_gpu && + !gpu_info_.UsesSwiftShader()) { + // On multi-GPU system, when switching to a different GPU, we want to reset + // GPUInfo for hardware GPU, because we want to know on which GPU Chrome + // crashes multiple times and falls back to SwiftShader. + const gpu::GPUInfo::GPUDevice& active_gpu = gpu_info_.active_gpu(); + const gpu::GPUInfo::GPUDevice& cached_active_gpu = + gpu_info_for_hardware_gpu_.active_gpu(); +#if defined(OS_WIN) + if (active_gpu.luid.HighPart != cached_active_gpu.luid.HighPart && + active_gpu.luid.LowPart != cached_active_gpu.luid.LowPart) { + needs_to_update_gpu_info_for_hardware_gpu = true; + } +#else + if (active_gpu.vendor_id != cached_active_gpu.vendor_id || + active_gpu.device_id != cached_active_gpu.device_id) { + needs_to_update_gpu_info_for_hardware_gpu = true; + } +#endif // OS_WIN + } + + if (needs_to_update_gpu_info_for_hardware_gpu) { + if (gpu_info_for_hardware_gpu.has_value()) { DCHECK(gpu_info_for_hardware_gpu->IsInitialized()); - gpu_info_for_hardware_gpu_ = gpu_info_for_hardware_gpu.value(); + bool valid_info = true; + if (gpu_info_for_hardware_gpu->UsesSwiftShader()) { + valid_info = false; + } else if (gpu_info_for_hardware_gpu->gl_renderer.empty() && + gpu_info_for_hardware_gpu->active_gpu().vendor_id == 0u) { + valid_info = false; + } + if (valid_info) + gpu_info_for_hardware_gpu_ = gpu_info_for_hardware_gpu.value(); } else { - gpu_info_for_hardware_gpu_ = gpu_info_; + if (!gpu_info_.UsesSwiftShader()) + gpu_info_for_hardware_gpu_ = gpu_info_; } }
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc index 29061c0..7d9f2da 100644 --- a/content/browser/gpu/gpu_internals_ui.cc +++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -865,28 +865,30 @@ feature_status->Set("workarounds", std::move(workarounds)); gpu_info_val->Set("featureStatus", std::move(feature_status)); if (!GpuDataManagerImpl::GetInstance()->IsGpuProcessUsingHardwareGpu()) { - auto feature_status_for_hardware_gpu = - std::make_unique<base::DictionaryValue>(); - feature_status_for_hardware_gpu->Set("featureStatus", - GetFeatureStatusForHardwareGpu()); - feature_status_for_hardware_gpu->Set("problems", - GetProblemsForHardwareGpu()); - auto workarounds_for_hardware_gpu = std::make_unique<base::ListValue>(); - for (const auto& workaround : GetDriverBugWorkaroundsForHardwareGpu()) - workarounds_for_hardware_gpu->AppendString(workaround); - feature_status_for_hardware_gpu->Set( - "workarounds", std::move(workarounds_for_hardware_gpu)); - gpu_info_val->Set("featureStatusForHardwareGpu", - std::move(feature_status_for_hardware_gpu)); const gpu::GPUInfo gpu_info_for_hardware_gpu = GpuDataManagerImpl::GetInstance()->GetGPUInfoForHardwareGpu(); - const gpu::GpuFeatureInfo gpu_feature_info_for_hardware_gpu = - GpuDataManagerImpl::GetInstance()->GetGpuFeatureInfoForHardwareGpu(); - auto gpu_info_for_hardware_gpu_val = BasicGpuInfoAsListValue( - gpu_info_for_hardware_gpu, gpu_feature_info_for_hardware_gpu, - gfx::GpuExtraInfo{}); - gpu_info_val->Set("basicInfoForHardwareGpu", - std::move(gpu_info_for_hardware_gpu_val)); + if (gpu_info_for_hardware_gpu.IsInitialized()) { + auto feature_status_for_hardware_gpu = + std::make_unique<base::DictionaryValue>(); + feature_status_for_hardware_gpu->Set("featureStatus", + GetFeatureStatusForHardwareGpu()); + feature_status_for_hardware_gpu->Set("problems", + GetProblemsForHardwareGpu()); + auto workarounds_for_hardware_gpu = std::make_unique<base::ListValue>(); + for (const auto& workaround : GetDriverBugWorkaroundsForHardwareGpu()) + workarounds_for_hardware_gpu->AppendString(workaround); + feature_status_for_hardware_gpu->Set( + "workarounds", std::move(workarounds_for_hardware_gpu)); + gpu_info_val->Set("featureStatusForHardwareGpu", + std::move(feature_status_for_hardware_gpu)); + const gpu::GpuFeatureInfo gpu_feature_info_for_hardware_gpu = + GpuDataManagerImpl::GetInstance()->GetGpuFeatureInfoForHardwareGpu(); + auto gpu_info_for_hardware_gpu_val = BasicGpuInfoAsListValue( + gpu_info_for_hardware_gpu, gpu_feature_info_for_hardware_gpu, + gfx::GpuExtraInfo{}); + gpu_info_val->Set("basicInfoForHardwareGpu", + std::move(gpu_info_for_hardware_gpu_val)); + } } gpu_info_val->Set("compositorInfo", CompositorInfo()); gpu_info_val->Set("gpuMemoryBufferInfo", GpuMemoryBufferInfo(gpu_extra_info));
diff --git a/content/browser/isolated_origin_browsertest.cc b/content/browser/isolated_origin_browsertest.cc index 88731fd4..f1f5f0b3 100644 --- a/content/browser/isolated_origin_browsertest.cc +++ b/content/browser/isolated_origin_browsertest.cc
@@ -79,6 +79,16 @@ return IsIsolatedOrigin(url::Origin::Create(url)); } + bool ShouldOriginGetOptInIsolation(const url::Origin& origin) { + auto* site_instance = static_cast<SiteInstanceImpl*>( + shell()->web_contents()->GetMainFrame()->GetSiteInstance()); + + return ChildProcessSecurityPolicyImpl::GetInstance() + ->ShouldOriginGetOptInIsolation(site_instance->GetIsolationContext(), + origin, + false /* origin_requests_isolation */); + } + ProcessLock ProcessLockFromUrl(const std::string& url) { return ProcessLock( SiteInfo(GURL(url), GURL(url), false /* is_origin_keyed */, @@ -140,13 +150,12 @@ DISALLOW_COPY_AND_ASSIGN(IsolatedOriginTest); }; -// Base class used for server-based origin isolation opt-in tests to handle the -// server responses and other common infrastructure. -class OriginIsolationOptInServerTest : public IsolatedOriginTestBase { +// Tests that verify the header can be used to opt-in to origin isolation. +class OriginIsolationOptInHeaderTest : public IsolatedOriginTestBase { public: - OriginIsolationOptInServerTest() + OriginIsolationOptInHeaderTest() : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} - ~OriginIsolationOptInServerTest() override = default; + ~OriginIsolationOptInHeaderTest() override = default; void SetUpCommandLine(base::CommandLine* command_line) override { IsolatedOriginTestBase::SetUpCommandLine(command_line); @@ -155,18 +164,31 @@ // This is needed for this test to run properly on platforms where // --site-per-process isn't the default, such as Android. IsolateAllSitesForTesting(command_line); + command_line->AppendSwitch(switches::kIgnoreCertificateErrors); - feature_list_.InitAndEnableFeature(feature_switch()); + feature_list_.InitAndEnableFeature(features::kOriginIsolationHeader); // Start the HTTPS server here so derived tests can use it if they override // SetUpCommandLine(). https_server()->AddDefaultHandlers(GetTestDataFilePath()); https_server()->RegisterRequestHandler( - base::BindRepeating(&OriginIsolationOptInServerTest::HandleResponse, + base::BindRepeating(&OriginIsolationOptInHeaderTest::HandleResponse, base::Unretained(this))); ASSERT_TRUE(https_server()->Start()); } + void SetHeaderValue(const std::string& header_value) { + header_ = header_value; + } + + // Allows specifying what content to return when an opt-in isolation header is + // intercepted. Uses a queue so that multiple requests can be handled without + // returning to the test body. If the queue is empty, the document content is + // simply "isolate me!". + void AddContentToQueue(const std::string& content_str) { + content_.push(content_str); + } + void SetUpOnMainThread() override { IsolatedOriginTestBase::SetUpOnMainThread(); @@ -179,115 +201,12 @@ IsolatedOriginTestBase::TearDownOnMainThread(); } - // Need an https server because - // OriginPolicyThrottle::ShouldRequestOriginPolicy() will return false - // otherwise. + // Need an https server because the header requires HTTPS. net::EmbeddedTestServer* https_server() { return &https_server_; } - bool ShouldOriginGetOptInIsolation(const url::Origin& origin) { - auto* site_instance = static_cast<SiteInstanceImpl*>( - shell()->web_contents()->GetMainFrame()->GetSiteInstance()); - - return ChildProcessSecurityPolicyImpl::GetInstance() - ->ShouldOriginGetOptInIsolation(site_instance->GetIsolationContext(), - origin, - false /* origin_requests_isolation */); - } - - protected: - virtual const base::Feature& feature_switch() = 0; - virtual std::unique_ptr<net::test_server::HttpResponse> HandleResponse( - const net::test_server::HttpRequest& request) = 0; - private: - net::EmbeddedTestServer https_server_; - base::test::ScopedFeatureList feature_list_; - - DISALLOW_COPY_AND_ASSIGN(OriginIsolationOptInServerTest); -}; - -// Tests of opt-in origin isolation which use origin policy as the opt-in -// mechanism. Most tests for the overall feature are in this class, but see also -// OriginIsolationOptInHeaderTest for tests that verify headers can be used as -// an opt-in mechanism as well. -class OriginIsolationOptInOriginPolicyTest - : public OriginIsolationOptInServerTest { - public: - OriginIsolationOptInOriginPolicyTest() = default; - - void SetOriginPolicyManifest(const std::string& manifest) { - origin_policy_manifest_ = manifest; - } - - // Allows specifying what content to return when an opt-in isolation header is - // intercepted. Uses a queue so that multiple requests can be handled without - // returning to the test body. If the queue is empty, the document content is - // simply "isolate me!". - void AddContentToQueue(const std::string& content_str) { - content_.push(content_str); - } - - protected: - const base::Feature& feature_switch() override { - return features::kOriginPolicy; - } - std::unique_ptr<net::test_server::HttpResponse> HandleResponse( - const net::test_server::HttpRequest& request) override { - auto response = std::make_unique<net::test_server::BasicHttpResponse>(); - - // Ensures requests to /isolate_origin request that the origin policy be - // applied. - if (request.relative_url == "/isolate_origin") { - response->set_code(net::HTTP_OK); - response->set_content_type("text/html"); - response->AddCustomHeader("Origin-Policy", "allowed=(latest)"); - if (!content_.empty()) { - response->set_content(content_.front()); - content_.pop(); - } else { - response->set_content("isolate me!"); - } - return std::move(response); - } - - // Intercepts the request to get the origin policy, and injects the policy. - // Note: this will only be activated for requests that load "isolate_origin" - // above, since only it sets the Origin-Policy header. - if (request.relative_url == "/.well-known/origin-policy") { - response->set_code(net::HTTP_OK); - response->set_content(origin_policy_manifest_); - return std::move(response); - } - - // If we return nullptr, then the server will go ahead and actually serve - // the file. - return nullptr; - } - - std::string origin_policy_manifest_; - std::queue<std::string> content_; - - DISALLOW_COPY_AND_ASSIGN(OriginIsolationOptInOriginPolicyTest); -}; - -// Tests that verify headers can be used to opt-in to origin isolation. See -// OriginIsolationOptInOriginPolicyTest for most tests of the feature. -class OriginIsolationOptInHeaderTest : public OriginIsolationOptInServerTest { - public: - OriginIsolationOptInHeaderTest() = default; - - void SetHeaderValue(const std::string& header_value) { - header_ = header_value; - } - - protected: - const base::Feature& feature_switch() override { - return features::kOriginIsolationHeader; - } - - std::unique_ptr<net::test_server::HttpResponse> HandleResponse( - const net::test_server::HttpRequest& request) override { + const net::test_server::HttpRequest& request) { if (request.relative_url == "/isolate_origin") { auto response = std::make_unique<net::test_server::BasicHttpResponse>(); response->set_code(net::HTTP_OK); @@ -297,7 +216,12 @@ response->AddCustomHeader("Origin-Agent-Cluster", *header_); } - response->set_content("isolate me!"); + if (!content_.empty()) { + response->set_content(content_.front()); + content_.pop(); + } else { + response->set_content("isolate me!"); + } return std::move(response); } @@ -306,7 +230,11 @@ return nullptr; } + net::EmbeddedTestServer https_server_; + base::test::ScopedFeatureList feature_list_; + base::Optional<std::string> header_; + std::queue<std::string> content_; DISALLOW_COPY_AND_ASSIGN(OriginIsolationOptInHeaderTest); }; @@ -336,16 +264,6 @@ embedded_test_server()->StartAcceptingConnections(); } - bool ShouldOriginGetOptInIsolation(const url::Origin& origin) { - auto* site_instance = static_cast<SiteInstanceImpl*>( - shell()->web_contents()->GetMainFrame()->GetSiteInstance()); - - return ChildProcessSecurityPolicyImpl::GetInstance() - ->ShouldOriginGetOptInIsolation(site_instance->GetIsolationContext(), - origin, - false /* origin_requests_isolation */); - } - private: std::unique_ptr<net::test_server::HttpResponse> HandleResponse( const net::test_server::HttpRequest& request) { @@ -366,13 +284,13 @@ // isolation for origins. Tests using this class will isolate foo.com and // bar.com by default using command-line isolation, but any opt-in isolation // will override this. -class OriginIsolationOptInOriginPolicyCommandLineTest - : public OriginIsolationOptInOriginPolicyTest { +class OriginIsolationOptInHeaderCommandLineTest + : public OriginIsolationOptInHeaderTest { public: - OriginIsolationOptInOriginPolicyCommandLineTest() = default; + OriginIsolationOptInHeaderCommandLineTest() = default; void SetUpCommandLine(base::CommandLine* command_line) override { - OriginIsolationOptInOriginPolicyTest::SetUpCommandLine(command_line); + OriginIsolationOptInHeaderTest::SetUpCommandLine(command_line); // The base class should already have started the HTTPS server so we can use // it here to generate origins to specify on the command line. ASSERT_TRUE(https_server()->Started()); @@ -384,7 +302,7 @@ } private: - DISALLOW_COPY_AND_ASSIGN(OriginIsolationOptInOriginPolicyCommandLineTest); + DISALLOW_COPY_AND_ASSIGN(OriginIsolationOptInHeaderCommandLineTest); }; // This test verifies that opt-in isolation takes precedence over command-line @@ -392,13 +310,13 @@ // otherwise been isolated via command-line isolation), and then loads a child // frame sub-origin which should-not be isolated (but would have been if the // base origin was command-line isolated). -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyCommandLineTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderCommandLineTest, OptInOverridesCommandLine) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); // Start off with an isolated base-origin in an a(a) configuration, then // navigate the subframe to a sub-origin not requesting isolation. // Note: this works because we serve mock headers with the base origin's html - // file, requesting loading the origin policy. + // file, which set the header. GURL isolated_base_origin_url(https_server()->GetURL( "foo.com", "/isolated_base_origin_with_subframe.html")); GURL non_isolated_sub_origin( @@ -455,19 +373,6 @@ browser_context, url::Origin::Create(non_isolated_sub_origin))); } -// This tests that origin policy opt-in causes the origin to end up in the -// isolated origins list. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, Basic) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); - - GURL url(https_server()->GetURL("isolated.foo.com", "/isolate_origin")); - url::Origin origin(url::Origin::Create(url)); - - EXPECT_FALSE(ShouldOriginGetOptInIsolation(origin)); - EXPECT_TRUE(NavigateToURL(shell(), url)); - EXPECT_TRUE(ShouldOriginGetOptInIsolation(origin)); -} - // This tests that header-based opt-in causes the origin to end up in the // isolated origins list. IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, Basic) { @@ -513,15 +418,12 @@ } // Further tests deep-dive into various scenarios for the isolation opt-ins. -// They use the origin policy mechanism, under the assumption that it will be -// the same for the header mechanism since they both trigger the same behavior -// in ChildProcessSecurityPolicyImpl. -// In this test the sub-origin is isolated because the origin policy requests -// "isolation". It will have a different site instance than the main frame. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +// In this test the sub-origin is isolated because the header requests it. It +// will have a different site instance than the main frame. +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, SimpleSubOriginIsolationTest) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); // Start off with an a(a) page, then navigate the subframe to an isolated sub // origin. GURL test_url(https_server()->GetURL("foo.com", @@ -561,11 +463,10 @@ child_frame_node->current_frame_host()->GetProcess()->GetID())); } -// In this test the sub-origin isn't isolated because the origin policy doesn't -// request "isolation". It will have the same site instance as the main frame. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +// In this test the sub-origin isn't isolated because no header is set. It will +// have the same site instance as the main frame. +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, SimpleSubOriginNonIsolationTest) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"] })"); // Start off with an a(a) page, then navigate the subframe to an isolated sub // origin. GURL test_url(https_server()->GetURL("foo.com", @@ -586,9 +487,9 @@ // This test verifies that renderer-initiated navigations to/from isolated // sub-origins works as expected. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, RendererInitiatedNavigations) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); GURL test_url(https_server()->GetURL("foo.com", "/cross_site_iframe_factory.html?" "foo.com(foo.com)")); @@ -629,9 +530,8 @@ // both for renderer-initiated and browser-initiated navigations. // Note: this test is essentially identical to // IsolatedOriginTest.MainFrameNavigation. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, - MainFrameNavigation) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, MainFrameNavigation) { + SetHeaderValue("?1"); GURL unisolated_url(https_server()->GetURL("www.foo.com", "/title1.html")); GURL isolated_url( https_server()->GetURL("isolated.foo.com", "/isolate_origin")); @@ -712,9 +612,9 @@ // This test ensures that if an origin starts off being isolated in a // BrowsingInstance, it continues that way within the BrowsingInstance, even // if a new policy is received that removes the opt-in request. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, OriginIsolationStateRetainedForBrowsingInstance) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); // Start off with an a(a,a) page, then navigate the subframe to an isolated // sub origin. GURL test_url(https_server()->GetURL("foo.com", @@ -734,9 +634,9 @@ EXPECT_NE(root->current_frame_host()->GetSiteInstance(), child_frame_node0->current_frame_host()->GetSiteInstance()); - // Change OriginPolicy manifest to stop isolating the sub-origin. It should + // Change the server's responses to stop isolating the sub-origin. It should // still be isolated, to remain consistent with the other frame. - SetOriginPolicyManifest(R"({ })"); + SetHeaderValue("?0"); WebContentsConsoleObserver console_observer(shell()->web_contents()); console_observer.SetPattern( @@ -763,11 +663,11 @@ // This test ensures that if an origin starts off not being isolated in a // BrowsingInstance, it continues that way within the BrowsingInstance, even -// if a new opt-in policy is received. +// if the header starts being sent. // Case #1 where the non-opted-in origin is currently in the frame tree. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, OriginNonIsolationStateRetainedForBrowsingInstance1) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"] })"); + SetHeaderValue("?0"); // Start off with an a(a,a) page, then navigate the subframe to an isolated // sub origin. GURL test_url(https_server()->GetURL("foo.com", @@ -787,9 +687,9 @@ EXPECT_EQ(root->current_frame_host()->GetSiteInstance(), child_frame_node0->current_frame_host()->GetSiteInstance()); - // Change OriginPolicy manifest to start isolating the sub-origin. It should + // Change the server responses to start isolating the sub-origin. It should // still be not-isolated, to remain consistent with the other frame. - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); WebContentsConsoleObserver console_observer(shell()->web_contents()); console_observer.SetPattern( @@ -812,11 +712,11 @@ // This test ensures that if an origin starts off not being isolated in a // BrowsingInstance, it continues that way within the BrowsingInstance, even -// if a new opt-in policy is received. +// if the header starts being sent. // Case #2 where the non-opted-in origin is currently not in the frame tree. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, OriginNonIsolationStateRetainedForBrowsingInstance2) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"] })"); + SetHeaderValue("?0"); // Start off with an a(a) page, then navigate the subframe to an isolated sub // origin. GURL test_url(https_server()->GetURL("foo.com", @@ -845,9 +745,9 @@ EXPECT_EQ(root->current_frame_host()->GetSiteInstance(), child_frame_node0->current_frame_host()->GetSiteInstance()); - // Change OriginPolicy manifest to start isolating the sub-origin. It should + // Change the server to start isolating the sub-origin. It should // still be not isolated, to remain consistent with the other frame. - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); EXPECT_TRUE( NavigateToURLFromRenderer(child_frame_node0, isolated_suborigin_url)); EXPECT_EQ(root->current_frame_host()->GetSiteInstance(), @@ -868,10 +768,10 @@ // This test makes sure that a different tab in the same BrowsingInstance where // an origin originally did not opt-in respects that state even if the -// OriginPolicy changes. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +// server sends a different header. +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, OriginNonIsolationStateRetainedForPopup) { - SetOriginPolicyManifest(R"({ })"); + SetHeaderValue("?0"); // Start off with an a(a,a) page, then navigate the subframe to an isolated // sub origin. GURL test_url(https_server()->GetURL("foo.com", @@ -890,9 +790,9 @@ EXPECT_EQ(root->current_frame_host()->GetSiteInstance(), child_frame_node0->current_frame_host()->GetSiteInstance()); - // Change OriginPolicy manifest to start isolating the sub-origin. It should - // still be isolated, to remain consistent with the other frame. - SetOriginPolicyManifest(R"({ "isolation": true })"); + // Change the server to start isolating the sub-origin. It should + // not be isolated, to remain consistent with the other frame. + SetHeaderValue("?1"); // Open a popup in the same browsing instance, and navigate it to the // not-opted-in origin. Even though the manifest now requests isolation, it @@ -921,9 +821,9 @@ // RenderFrameHostManager that is verifying that the second child frame was // put in a compatible renderer process. // https://crbug.com/1099718 -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, NoKillForBrowsingInstanceDifferencesInProcess) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); GURL opener_url(https_server()->GetURL("foo.com", "/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), opener_url)); @@ -1002,9 +902,9 @@ // BrowsingInstance will show sub.foo.com as isolated, then if // CanAccessDataForOrigin only checks the first BrowsingInstance it will get the // wrong result. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, NoKillForBrowsingInstanceDifferencesInProcess2) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); // Start on a page with same-site iframe. GURL opener_url(https_server()->GetURL("foo.com", "/page_with_iframe.html")); EXPECT_TRUE(NavigateToURL(shell(), opener_url)); @@ -1097,9 +997,8 @@ // value stripped. The test IsolatedBaseOriginNoPorts tests the case where // neither the isolated base origin nor the non-isolated sub-origin has a port // value. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, - IsolatedBaseOrigin) { - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, IsolatedBaseOrigin) { + SetHeaderValue("?1"); // Start off with an isolated base-origin in an a(a) configuration, then // navigate the subframe to a sub-origin no requesting isolation. GURL test_url(https_server()->GetURL( @@ -1171,7 +1070,7 @@ browser_context, url::Origin::Create(non_isolated_sub_origin2))); } -// This test is the same as OriginIsolationOptInOriginPolicyTest +// This test is the same as OriginIsolationOptInHeaderTest // .IsolatedBaseOrigin except it uses port-free URLs. This is critical since we // can have two SiteInstances with the same SiteURL as long as one is // origin-keyed and the other isn't. Site URLs used to be used as map-keys but @@ -1200,7 +1099,7 @@ // Note: this call would normally get the headers from // isolated_base_origin_with_subframe.html.mock-http-headers, // but those are meant for use with a - // OriginIsolationOptInOriginPolicyTest. and won't work here, so we + // OriginIsolationOptInHeaderTest. and won't work here, so we // override them. URLLoaderInterceptor::WriteResponse( "content/test/data/isolated_base_origin_with_subframe.html", @@ -1396,7 +1295,7 @@ // that opts-in to isolation. The opt-in triggers a walk of the session history // and the frame tree ... the session history won't pick up the first frame, but // the frame-tree walk should. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, FrameTreeTest) { +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, FrameTreeTest) { EXPECT_TRUE(NavigateToURL(shell(), https_server()->GetURL("bar.com", "/title1.html"))); // Have tab1 call window.open() to create blank tab2. @@ -1424,7 +1323,7 @@ // Do a browser-initiated navigation of tab1 to the same origin, but isolate // it this time. This should place the two frames with |isolated_origin_url| // into different BrowsingInstances. - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); EXPECT_TRUE(NavigateToURL(shell(), isolated_origin_url)); // Since the same origin exists in two tabs, but one is isolated and the other @@ -1488,7 +1387,7 @@ // isolation at the pending commit state in tab2, then verify that the FrameTree // walk has correctly registered the origin as non-isolated in tab2, but // isolated in tab1. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, FrameTreeTestPendingCommit) { GURL isolated_origin_url( https_server()->GetURL("isolated.foo.com", "/isolate_origin")); @@ -1502,7 +1401,7 @@ // Do a browser-initiated navigation of tab2 to the same origin, but isolate // it this time. This should place the two frames with |isolated_origin_url| // into different BrowsingInstances. - SetOriginPolicyManifest(R"({ "ids": ["my-policy"], "isolation": true })"); + SetHeaderValue("?1"); EXPECT_TRUE(NavigateToURL(tab2, isolated_origin_url)); // Now commit the non-isolated navigation. @@ -1546,7 +1445,7 @@ : public DidCommitNavigationInterceptor { public: InjectIsolationRequestingNavigation( - OriginIsolationOptInOriginPolicyTest* test_framework, + OriginIsolationOptInHeaderTest* test_framework, WebContents* tab1_web_contents, Shell* tab2, const GURL& url) @@ -1569,14 +1468,13 @@ // Performa a navigation of |tab2_| to |url_|. |url_| should request // isolation. - test_framework_->SetOriginPolicyManifest( - R"({ "ids": ["my-policy"], "isolation": true })"); + test_framework_->SetHeaderValue("?1"); EXPECT_TRUE(NavigateToURL(tab2_, url_)); return true; } - OriginIsolationOptInOriginPolicyTest* test_framework_; + OriginIsolationOptInHeaderTest* test_framework_; Shell* tab2_; const GURL& url_; bool was_called_ = false; @@ -1593,7 +1491,7 @@ // This test is similar to the one above, but exercises the pending navigation // when it's at a different stage, namely between the CommitNavigation and // DidCommitProvisionalLoad, rather than at WillProcessResponse. -IN_PROC_BROWSER_TEST_F(OriginIsolationOptInOriginPolicyTest, +IN_PROC_BROWSER_TEST_F(OriginIsolationOptInHeaderTest, MAYBE_FrameTreeTestBeforeDidCommit) { GURL isolated_origin_url( https_server()->GetURL("isolated.foo.com", "/isolate_origin"));
diff --git a/content/browser/prerender/prerender_browsertest.cc b/content/browser/prerender/prerender_browsertest.cc index fb3996a..2ae486f 100644 --- a/content/browser/prerender/prerender_browsertest.cc +++ b/content/browser/prerender/prerender_browsertest.cc
@@ -386,6 +386,30 @@ EXPECT_EQ(GetRequestCount(kPrerenderingUrl), 2); } +// Tests that back-forward history is preserved after activation. +IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, HistoryAfterActivation) { + // This test is only meaningful with activation. + if (IsActivationDisabled()) + return; + + const GURL kInitialUrl = GetUrl("/prerender/add_prerender.html"); + const GURL kPrerenderingUrl = GetUrl("/empty.html"); + + // Navigate to an initial page. + ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl)); + + // Make and activate a prerendered page. + AddPrerender(kPrerenderingUrl); + NavigateWithLocation(kPrerenderingUrl); + EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), kPrerenderingUrl); + + // Navigate back to the initial page. + content::TestNavigationObserver observer(shell()->web_contents()); + shell()->GoBackOrForward(-1); + observer.Wait(); + EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), kInitialUrl); +} + // TODO(https://crbug.com/1132746): Test canceling prerendering. // TODO(https://crbug.com/1132746): Test prerendering for 404 page, redirection,
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc index aad841f..a4a58cb 100644 --- a/content/browser/prerender/prerender_host.cc +++ b/content/browser/prerender/prerender_host.cc
@@ -82,6 +82,10 @@ if (!current_web_contents) return false; + // Merge browsing history. + prerendered_contents_->GetController().CopyStateFromAndPrune( + ¤t_web_contents->GetController(), /*replace_entry=*/false); + // Activate the prerendered contents. WebContentsDelegate* delegate = current_web_contents->GetDelegate(); DCHECK(delegate);
diff --git a/content/browser/prerender/prerender_host.h b/content/browser/prerender/prerender_host.h index 5e66730..8b320eed 100644 --- a/content/browser/prerender/prerender_host.h +++ b/content/browser/prerender/prerender_host.h
@@ -47,7 +47,8 @@ // Activates the prerendered contents. Returns false when activation didn't // occur for some reason. This must be called after this host gets ready for - // activation. + // activation. `current_render_frame_host` is the RenderFrameHost that will + // be swapped out and destroyed by the activation. bool ActivatePrerenderedContents( RenderFrameHostImpl& current_render_frame_host);
diff --git a/content/browser/prerender/prerender_host_unittest.cc b/content/browser/prerender/prerender_host_unittest.cc index fbbaaa8..b21b7fb 100644 --- a/content/browser/prerender/prerender_host_unittest.cc +++ b/content/browser/prerender/prerender_host_unittest.cc
@@ -6,6 +6,7 @@ #include "base/test/scoped_feature_list.h" #include "content/browser/site_instance_impl.h" +#include "content/public/test/navigation_simulator.h" #include "content/public/test/test_browser_context.h" #include "content/test/test_render_frame_host.h" #include "content/test/test_render_view_host.h" @@ -54,7 +55,7 @@ std::unique_ptr<TestWebContentsDelegate> web_contents_delegate_; }; -TEST_F(PrerenderHostTest, StartPrerendering) { +TEST_F(PrerenderHostTest, PrerenderAndActivate) { std::unique_ptr<TestWebContents> web_contents = CreateWebContents(GURL("https://example.com/")); RenderFrameHostImpl* initiator_rfh = web_contents->GetMainFrame(); @@ -67,17 +68,25 @@ std::move(attributes), initiator_rfh->GetGlobalFrameRoutingId(), initiator_rfh->GetLastCommittedOrigin()); + // Start the prerendering navigation. prerender_host->StartPrerendering(); - // Prepare a fake response so as to commit the navigation. - TestRenderFrameHost* prerendering_rfh = static_cast<TestRenderFrameHost*>( + + // Finish the prerendering navigation. Normally we could use + // EmbeddedTestServer to provide a response, but this test uses + // RenderViewHostImplTestHarness so the load goes through a + // TestNavigationURLLoader which we don't have access to in order + // to complete. Use NavigationSimulator to finish the navigation on the + // WebContents. + WebContents* prerender_contents = WebContents::FromRenderFrameHost( prerender_host->GetPrerenderedMainFrameHostForTesting()); - ASSERT_TRUE(prerendering_rfh); - prerendering_rfh->PrepareForCommit(); + ASSERT_TRUE(prerender_contents); + std::unique_ptr<NavigationSimulator> sim = + NavigationSimulator::CreateFromPending(prerender_contents); + sim->ReadyToCommit(); + sim->Commit(); + EXPECT_TRUE(prerender_host->is_ready_for_activation()); - // Artificially finish navigation to make the prerender host ready to provide - // the prerendered contents. - prerender_host->DidFinishNavigation(nullptr); - + // Activate. EXPECT_TRUE(prerender_host->ActivatePrerenderedContents(*initiator_rfh)); }
diff --git a/content/browser/renderer_host/cookie_utils.cc b/content/browser/renderer_host/cookie_utils.cc index 3c1eecc..702444e 100644 --- a/content/browser/renderer_host/cookie_utils.cc +++ b/content/browser/renderer_host/cookie_utils.cc
@@ -67,7 +67,7 @@ } } -void EmitSameSiteCookiesDeprecationWarning( +void EmitCookieWarningsAndMetrics( RenderFrameHostImpl* rfh, const network::mojom::CookieAccessDetailsPtr& cookie_details) { RenderFrameHostImpl* root_frame_host = rfh->GetMainFrame(); @@ -79,40 +79,61 @@ bool samesite_none_insecure_cookies = false; bool breaking_context_downgrade = false; - for (const net::CookieWithAccessResult& excluded_cookie : + bool same_party = false; + bool same_party_exclusion_overruled_samesite = false; + bool same_party_inclusion_overruled_samesite = false; + + for (const net::CookieWithAccessResult& cookie : cookie_details->cookie_list) { - if (excluded_cookie.access_result.status.ShouldWarn()) { + if (cookie.access_result.status.ShouldWarn()) { + const net::CookieInclusionStatus& status = cookie.access_result.status; samesite_treated_as_lax_cookies = samesite_treated_as_lax_cookies || - excluded_cookie.access_result.status.HasWarningReason( + status.HasWarningReason( net::CookieInclusionStatus:: WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT) || - excluded_cookie.access_result.status.HasWarningReason( + status.HasWarningReason( net::CookieInclusionStatus:: WARN_SAMESITE_UNSPECIFIED_LAX_ALLOW_UNSAFE); samesite_none_insecure_cookies = samesite_none_insecure_cookies || - excluded_cookie.access_result.status.HasWarningReason( + status.HasWarningReason( net::CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE); devtools_instrumentation::ReportSameSiteCookieIssue( - root_frame_host, excluded_cookie, cookie_details->url, + root_frame_host, cookie, cookie_details->url, cookie_details->site_for_cookies, cookie_details->type == CookieAccessDetails::Type::kRead ? blink::mojom::SameSiteCookieOperation::kReadCookie : blink::mojom::SameSiteCookieOperation::kSetCookie, cookie_details->devtools_request_id); + + same_party = same_party || + status.HasWarningReason( + net::CookieInclusionStatus::WARN_TREATED_AS_SAMEPARTY); + + same_party_exclusion_overruled_samesite = + same_party_exclusion_overruled_samesite || + status.HasWarningReason( + net::CookieInclusionStatus:: + WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE); + + same_party_inclusion_overruled_samesite = + same_party_inclusion_overruled_samesite || + status.HasWarningReason( + net::CookieInclusionStatus:: + WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE); } breaking_context_downgrade = breaking_context_downgrade || - excluded_cookie.access_result.status.HasDowngradeWarning(); + cookie.access_result.status.HasDowngradeWarning(); - if (excluded_cookie.access_result.status.HasDowngradeWarning()) { + if (cookie.access_result.status.HasDowngradeWarning()) { // Unlike with UMA, do not record cookies that have no downgrade warning. RecordContextDowngradeUKM(rfh, cookie_details->type, - excluded_cookie.access_result.status, + cookie.access_result.status, cookie_details->url); } } @@ -131,6 +152,23 @@ GetContentClient()->browser()->LogWebFeatureForCurrentPage( rfh, blink::mojom::WebFeature::kSchemefulSameSiteContextDowngrade); } + + if (same_party) { + GetContentClient()->browser()->LogWebFeatureForCurrentPage( + rfh, blink::mojom::WebFeature::kSamePartyCookieAttribute); + } + + if (same_party_exclusion_overruled_samesite) { + GetContentClient()->browser()->LogWebFeatureForCurrentPage( + rfh, + blink::mojom::WebFeature::kSamePartyCookieExclusionOverruledSameSite); + } + + if (same_party_inclusion_overruled_samesite) { + GetContentClient()->browser()->LogWebFeatureForCurrentPage( + rfh, + blink::mojom::WebFeature::kSamePartyCookieInclusionOverruledSameSite); + } } } // namespace content
diff --git a/content/browser/renderer_host/cookie_utils.h b/content/browser/renderer_host/cookie_utils.h index 560cce42..cf77ece 100644 --- a/content/browser/renderer_host/cookie_utils.h +++ b/content/browser/renderer_host/cookie_utils.h
@@ -22,10 +22,10 @@ CookieAccessDetails* allowed, CookieAccessDetails* blocked); -// Logs SameSite cookie warnings to DevTools Issues Panel and logs event to -// UseCounters and UKM. Does not log to the JS console. +// Logs cookie warnings to DevTools Issues Panel and logs events to UseCounters +// and UKM. Does not log to the JS console. // TODO(crbug.com/977040): Remove when no longer needed. -void EmitSameSiteCookiesDeprecationWarning( +void EmitCookieWarningsAndMetrics( RenderFrameHostImpl* rfh, const network::mojom::CookieAccessDetailsPtr& cookie_details);
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index d783bb0..6c29eb1 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -116,7 +116,6 @@ #include "services/network/public/mojom/web_sandbox_flags.mojom.h" #include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/common/client_hints/client_hints.h" -#include "third_party/blink/public/common/origin_trials/trial_token_validator.h" #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" #include "third_party/blink/public/mojom/appcache/appcache.mojom.h" @@ -2024,7 +2023,7 @@ } void NavigationRequest::CheckForIsolationOptIn(const GURL& url) { - if (IsOptInIsolationRequested(url) == OptInIsolationCheckResult::NONE) + if (!IsOptInIsolationRequested()) return; auto* policy = ChildProcessSecurityPolicyImpl::GetInstance(); @@ -2067,47 +2066,24 @@ return origin == url::Origin::Create(GetURL()); } -NavigationRequest::OptInIsolationCheckResult -NavigationRequest::IsOptInIsolationRequested(const GURL& url) { +bool NavigationRequest::IsOptInIsolationRequested() { if (!response()) - return OptInIsolationCheckResult::NONE; + return false; // Do not attempt isolation if the environment prevents us from enabling site // isolation (e.g., when we are under the memory threshold on Android). if (!SiteIsolationPolicy::IsOptInOriginIsolationEnabled()) - return OptInIsolationCheckResult::NONE; + return false; - // For now we only check for the presence of hints; we do not yet act on the - // specific hints. - const bool requests_via_origin_policy = - base::FeatureList::IsEnabled(features::kOriginPolicy) && - response()->origin_policy && - response()->origin_policy->state == network::OriginPolicyState::kLoaded && - response()->origin_policy->contents->isolation_optin_hints.has_value(); + if (base::FeatureList::IsEnabled(features::kOriginIsolationHeader) && + response_head_->parsed_headers->origin_isolation) { + return true; + } - if (requests_via_origin_policy) - return OptInIsolationCheckResult::ORIGIN_POLICY; - - // The header can be enabled via either a command-line flag or an origin - // trial. - blink::TrialTokenValidator validator; - const bool header_is_enabled = - base::FeatureList::IsEnabled(features::kOriginIsolationHeader) || - (response()->headers && validator.RequestEnablesFeature( - url, response()->headers.get(), - "OriginIsolationHeader", base::Time::Now())); - - const bool requests_via_header = - header_is_enabled && response_head_->parsed_headers->origin_isolation; - - if (requests_via_header) - return OptInIsolationCheckResult::HEADER; - - return OptInIsolationCheckResult::NONE; + return false; } -void NavigationRequest::DetermineOriginIsolationEndResult( - OptInIsolationCheckResult check_result) { +void NavigationRequest::DetermineOriginIsolationEndResult(bool is_requested) { DCHECK_EQ(state_, WILL_PROCESS_RESPONSE); auto* policy = ChildProcessSecurityPolicyImpl::GetInstance(); @@ -2115,31 +2091,17 @@ const IsolationContext& isolation_context = render_frame_host_->GetSiteInstance()->GetIsolationContext(); const bool got_isolated = policy->ShouldOriginGetOptInIsolation( - isolation_context, origin, - check_result != - OptInIsolationCheckResult::NONE /* origin_requests_isolation */); + isolation_context, origin, is_requested); - switch (check_result) { - case OptInIsolationCheckResult::NONE: - origin_isolation_end_result_ = - got_isolated - ? OptInOriginIsolationEndResult::kNotRequestedButIsolated - : OptInOriginIsolationEndResult::kNotRequestedAndNotIsolated; - break; - case OptInIsolationCheckResult::ORIGIN_POLICY: - origin_isolation_end_result_ = - got_isolated ? OptInOriginIsolationEndResult:: - kRequestedViaOriginPolicyAndIsolated - : OptInOriginIsolationEndResult:: - kRequestedViaOriginPolicyButNotIsolated; - break; - case OptInIsolationCheckResult::HEADER: - origin_isolation_end_result_ = - got_isolated - ? OptInOriginIsolationEndResult::kRequestedViaHeaderAndIsolated - : OptInOriginIsolationEndResult:: - kRequestedViaHeaderButNotIsolated; - break; + if (is_requested) { + origin_isolation_end_result_ = + got_isolated ? OptInOriginIsolationEndResult::kRequestedAndIsolated + : OptInOriginIsolationEndResult::kRequestedButNotIsolated; + } else { + origin_isolation_end_result_ = + got_isolated + ? OptInOriginIsolationEndResult::kNotRequestedButIsolated + : OptInOriginIsolationEndResult::kNotRequestedAndNotIsolated; } // This needs to be computed separately from origin.opaque() because, per @@ -2157,9 +2119,7 @@ commit_params_->origin_isolated = is_opaque_origin_because_sandbox || origin.opaque() || origin_isolation_end_result_ == - OptInOriginIsolationEndResult::kRequestedViaOriginPolicyAndIsolated || - origin_isolation_end_result_ == - OptInOriginIsolationEndResult::kRequestedViaHeaderAndIsolated || + OptInOriginIsolationEndResult::kRequestedAndIsolated || origin_isolation_end_result_ == OptInOriginIsolationEndResult::kNotRequestedButIsolated; } @@ -2169,19 +2129,16 @@ return; if (origin_isolation_end_result_ == - OptInOriginIsolationEndResult::kRequestedViaHeaderAndIsolated || + OptInOriginIsolationEndResult::kRequestedAndIsolated || origin_isolation_end_result_ == - OptInOriginIsolationEndResult::kRequestedViaHeaderButNotIsolated) + OptInOriginIsolationEndResult::kRequestedButNotIsolated) GetContentClient()->browser()->LogWebFeatureForCurrentPage( render_frame_host_, blink::mojom::WebFeature::kOriginIsolationHeader); const url::Origin origin = url::Origin::Create(GetURL()); if (origin_isolation_end_result_ == - OptInOriginIsolationEndResult::kRequestedViaHeaderButNotIsolated || - origin_isolation_end_result_ == - OptInOriginIsolationEndResult:: - kRequestedViaOriginPolicyButNotIsolated) + OptInOriginIsolationEndResult::kRequestedButNotIsolated) render_frame_host_->AddMessageToConsole( blink::mojom::ConsoleMessageLevel::kWarning, base::StringPrintf( @@ -2203,8 +2160,7 @@ } UrlInfo NavigationRequest::GetUrlInfo() { - return UrlInfo(GetURL(), IsOptInIsolationRequested(GetURL()) != - OptInIsolationCheckResult::NONE); + return UrlInfo(GetURL(), IsOptInIsolationRequested()); } void NavigationRequest::OnResponseStarted( @@ -2245,9 +2201,9 @@ ComputeSandboxFlagsToCommit(response_head_.get()); - // The navigation may have encountered an origin policy or Origin-Isolation - // header that requests isolation for the url's origin. Before we pick the - // renderer, make sure we update the origin-isolation opt-ins appropriately. + // The navigation may have encountered a header that requests isolation for + // the url's origin. Before we pick the renderer, make sure we update the + // origin-isolation opt-ins appropriately. CheckForIsolationOptIn(GetURL()); // Check if the response should be sent to a renderer. @@ -2453,7 +2409,7 @@ DCHECK(!response_should_be_rendered_); if (render_frame_host_) - DetermineOriginIsolationEndResult(IsOptInIsolationRequested(GetURL())); + DetermineOriginIsolationEndResult(IsOptInIsolationRequested()); cross_origin_embedder_policy_ = cross_origin_embedder_policy; @@ -5274,8 +5230,8 @@ // TODO(721329): We should not send information to the current frame about // (potentially unrelated) ongoing navigation, but at the moment we don't // have another way to add messages to DevTools console. - EmitSameSiteCookiesDeprecationWarning(frame_tree_node()->current_frame_host(), - details); + EmitCookieWarningsAndMetrics(frame_tree_node()->current_frame_host(), + details); CookieAccessDetails allowed; CookieAccessDetails blocked;
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index bc8c9b53..6f293b4c 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -239,14 +239,9 @@ // is at (or past) WILL_PROCESS_RESPONSE. bool HasCommittingOrigin(const url::Origin& origin); - // Returns whether and how this navigation request is requesting opt-in + // Returns whether this navigation request is requesting opt-in // origin-isolation. - enum class OptInIsolationCheckResult { - NONE, // no isolation requested - HEADER, // requested using the Origin-Isolation header - ORIGIN_POLICY // requested using origin policy - }; - OptInIsolationCheckResult IsOptInIsolationRequested(const GURL& url); + bool IsOptInIsolationRequested(); // The origin isolation end result is determined early in the lifecycle of a // NavigationRequest, but used late. In particular, we want to trigger use @@ -254,13 +249,10 @@ enum class OptInOriginIsolationEndResult { kNotRequestedAndNotIsolated, kNotRequestedButIsolated, - kRequestedViaOriginPolicyButNotIsolated, - kRequestedViaOriginPolicyAndIsolated, - kRequestedViaHeaderButNotIsolated, - kRequestedViaHeaderAndIsolated + kRequestedButNotIsolated, + kRequestedAndIsolated }; - void DetermineOriginIsolationEndResult( - OptInIsolationCheckResult check_result); + void DetermineOriginIsolationEndResult(bool is_requested); void ProcessOriginIsolationEndResult(); // NavigationHandle implementation:
diff --git a/content/browser/renderer_host/policy_container_host.cc b/content/browser/renderer_host/policy_container_host.cc index 2c39717..0dbba08b 100644 --- a/content/browser/renderer_host/policy_container_host.cc +++ b/content/browser/renderer_host/policy_container_host.cc
@@ -8,7 +8,7 @@ PolicyContainerHost::PolicyContainerHost() = default; PolicyContainerHost::PolicyContainerHost( - PolicyContainerHost::DocumentPolicies document_policies) + const PolicyContainerHost::DocumentPolicies& document_policies) : document_policies_(document_policies) {} PolicyContainerHost::~PolicyContainerHost() = default;
diff --git a/content/browser/renderer_host/policy_container_host.h b/content/browser/renderer_host/policy_container_host.h index 191ad644..36ec0238 100644 --- a/content/browser/renderer_host/policy_container_host.h +++ b/content/browser/renderer_host/policy_container_host.h
@@ -41,7 +41,7 @@ }; PolicyContainerHost(); - explicit PolicyContainerHost(DocumentPolicies document_policies); + explicit PolicyContainerHost(const DocumentPolicies& document_policies); PolicyContainerHost(const PolicyContainerHost&) = delete; PolicyContainerHost& operator=(const PolicyContainerHost&) = delete; ~PolicyContainerHost() override;
diff --git a/content/browser/renderer_host/render_frame_host_delegate.h b/content/browser/renderer_host/render_frame_host_delegate.h index 680651d3..e83f9f1 100644 --- a/content/browser/renderer_host/render_frame_host_delegate.h +++ b/content/browser/renderer_host/render_frame_host_delegate.h
@@ -666,6 +666,9 @@ int32_t pp_instance) {} virtual void OnPepperStopsPlayback(RenderFrameHostImpl* source, int32_t pp_instance) {} + virtual void OnPepperPluginCrashed(RenderFrameHostImpl* source, + const base::FilePath& plugin_path, + base::ProcessId plugin_pid) {} #endif protected:
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 552ba42..931162f 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -887,6 +887,12 @@ frame_host_->delegate()->OnPepperStopsPlayback(frame_host_, instance_id_); } + void InstanceCrashed(const base::FilePath& plugin_path, + base::ProcessId plugin_pid) override { + frame_host_->delegate()->OnPepperPluginCrashed(frame_host_, plugin_path, + plugin_pid); + } + void SetVolume(double volume) { remote_->SetVolume(volume); } private: @@ -2477,6 +2483,12 @@ } void RenderFrameHostImpl::RenderFrameCreated() { + // In https://crbug.com/1146573 a WebContentsObserver was causing the frame to + // be reinitialized during deletion. It is not valid to re-enter navigation + // code like that and it led to an invalid state. This is not a DCHECK because + // the corruption will not be visible until later, making the bug very + // difficult to understand. + CHECK_NE(render_frame_state_, RenderFrameState::kDeleting); // We should not create new RenderFrames while our delegate is being destroyed // (e.g., via a WebContentsObserver during WebContents shutdown). This seems // to have caused crashes in https://crbug.com/717650. @@ -2522,17 +2534,25 @@ } void RenderFrameHostImpl::RenderFrameDeleted() { + // In https://crbug.com/1146573 a WebContentsObserver was causing the frame to + // be reinitialized during deletion. It is not valid to re-enter navigation + // code like that and it led to an invalid state. This is not a DCHECK because + // the corruption will cause a crash but later, making the bug very + // difficult to understand. + CHECK_NE(render_frame_state_, RenderFrameState::kDeleting); bool was_created = is_render_frame_created(); - render_frame_state_ = RenderFrameState::kDeleted; + render_frame_state_ = RenderFrameState::kDeleting; // If the current status is different than the new status, the delegate // needs to be notified. if (was_created) { delegate_->RenderFrameDeleted(this); } + if (web_ui_) { web_ui_->InvalidateMojoConnection(); } + render_frame_state_ = RenderFrameState::kDeleted; } void RenderFrameHostImpl::SwapIn() { @@ -10287,7 +10307,7 @@ void RenderFrameHostImpl::OnCookiesAccessed( network::mojom::CookieAccessDetailsPtr details) { - EmitSameSiteCookiesDeprecationWarning(this, details); + EmitCookieWarningsAndMetrics(this, details); CookieAccessDetails allowed; CookieAccessDetails blocked;
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 49dad88f..1221c604 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -2737,11 +2737,21 @@ // state will be kCreated or kDeleted. kNeverCreated = 0, // A RenderFrame has been created in the renderer and is still in that - // state. The next state will be kDeleted. + // state. The next state will be kDeleting. kCreated, - // A RenderFrame has either been cleanly deleted or its renderer process has - // exited or crashed. The next state may be kCreated or the RenderFrameHost - // may be destroyed. + // A RenderFrame has either + // - been cleanly deleted + // - its renderer process has exited or crashed + // We will call observers of RenderFrameDeleted in this state and this + // allows us to CHECK if an observer causes us to attempt to change state + // during deletion. See https://crbug.com/1146573. The next state will + // be kDeleted and we will move to that before exiting RenderFrameDeleted. + kDeleting, + // A RenderFrame has either + // - been cleanly deleted + // - its renderer process has exited or crashed + // The next state may be kCreated if the RenderFrameHost is being reused + // after a crash or the RenderFrameHost may be destroyed. kDeleted, }; RenderFrameState render_frame_state_ = RenderFrameState::kNeverCreated;
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc index 9d562c24..49546be 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.cc +++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -166,7 +166,7 @@ // This can be removed once we don't have a swapped out state on // RenderFrame. See https://crbug.com/357747 if (!frame_tree_node_->IsMainFrame()) - Send(new UnfreezableFrameMsg_DeleteProxy(routing_id_)); + GetAssociatedRemoteFrame()->DetachAndDispose(); } // TODO(arthursonzogni): There are no known reason for removing the
diff --git a/content/browser/screen_orientation/screen_orientation_delegate_android.cc b/content/browser/screen_orientation/screen_orientation_delegate_android.cc index 640b536d..409e232e 100644 --- a/content/browser/screen_orientation/screen_orientation_delegate_android.cc +++ b/content/browser/screen_orientation/screen_orientation_delegate_android.cc
@@ -6,9 +6,8 @@ #include "base/android/scoped_java_ref.h" #include "content/browser/screen_orientation/screen_orientation_provider.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/public/android/content_jni_headers/ScreenOrientationProviderImpl_jni.h" -#include "ui/android/window_android.h" -#include "ui/gfx/native_widget_types.h" namespace content { @@ -31,10 +30,9 @@ base::android::ScopedJavaLocalRef<jobject> java_instance = Java_ScreenOrientationProviderImpl_getInstance( base::android::AttachCurrentThread()); - gfx::NativeWindow window = web_contents->GetTopLevelNativeWindow(); - Java_ScreenOrientationProviderImpl_lockOrientation( + Java_ScreenOrientationProviderImpl_lockOrientationForWebContents( base::android::AttachCurrentThread(), java_instance, - window ? window->GetJavaObject() : nullptr, + static_cast<WebContentsImpl*>(web_contents)->GetJavaWebContents(), static_cast<jbyte>(lock_orientation)); } @@ -53,10 +51,9 @@ base::android::ScopedJavaLocalRef<jobject> java_instance = Java_ScreenOrientationProviderImpl_getInstance( base::android::AttachCurrentThread()); - gfx::NativeWindow window = web_contents->GetTopLevelNativeWindow(); - Java_ScreenOrientationProviderImpl_unlockOrientation( + Java_ScreenOrientationProviderImpl_unlockOrientationForWebContents( base::android::AttachCurrentThread(), java_instance, - window ? window->GetJavaObject() : nullptr); + static_cast<WebContentsImpl*>(web_contents)->GetJavaWebContents()); } } // namespace content
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index a7281479..fe24c5ce 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -813,23 +813,6 @@ } }; -// SitePerProcessEmbedderCSPEnforcementBrowserTest - -class SitePerProcessEmbedderCSPEnforcementBrowserTest - : public SitePerProcessBrowserTest { - public: - SitePerProcessEmbedderCSPEnforcementBrowserTest() {} - - protected: - void SetUpCommandLine(base::CommandLine* command_line) override { - SitePerProcessBrowserTestBase::SetUpCommandLine(command_line); - // TODO(amalika): Remove this switch when the EmbedderCSPEnforcement becomes - // stable - command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, - "EmbedderCSPEnforcement"); - } -}; - // SitePerProcessProgrammaticScrollTest. class SitePerProcessProgrammaticScrollTest : public SitePerProcessBrowserTest { @@ -4173,7 +4156,7 @@ // Verify that "csp" property on frame elements propagates to child frames // correctly. See https://crbug.com/647588 -IN_PROC_BROWSER_TEST_P(SitePerProcessEmbedderCSPEnforcementBrowserTest, +IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTest, FrameOwnerPropertiesPropagationCSP) { GURL main_url(embedded_test_server()->GetURL( "a.com", "/frame_owner_properties_csp.html")); @@ -16678,9 +16661,6 @@ SitePerProcessBrowserTouchActionTest, testing::ValuesIn(RenderDocumentFeatureLevelValues())); INSTANTIATE_TEST_SUITE_P(All, - SitePerProcessEmbedderCSPEnforcementBrowserTest, - testing::ValuesIn(RenderDocumentFeatureLevelValues())); -INSTANTIATE_TEST_SUITE_P(All, SitePerProcessHighDPIBrowserTest, testing::ValuesIn(RenderDocumentFeatureLevelValues())); INSTANTIATE_TEST_SUITE_P(All,
diff --git a/content/browser/tracing/startup_tracing_browsertest.cc b/content/browser/tracing/startup_tracing_browsertest.cc index eac323c2..7511abb1 100644 --- a/content/browser/tracing/startup_tracing_browsertest.cc +++ b/content/browser/tracing/startup_tracing_browsertest.cc
@@ -5,13 +5,16 @@ #include "base/files/file_util.h" #include "base/json/json_reader.h" #include "base/run_loop.h" +#include "base/test/bind.h" #include "base/test/scoped_feature_list.h" +#include "base/test/scoped_run_loop_timeout.h" #include "base/test/test_timeouts.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "components/tracing/common/trace_startup_config.h" #include "components/tracing/common/tracing_switches.h" +#include "content/browser/tracing/startup_tracing_controller.h" #include "content/browser/tracing/tracing_controller_impl.h" #include "content/public/test/browser_test.h" #include "content/public/test/content_browser_test.h" @@ -25,69 +28,33 @@ namespace { +void CheckForConditionAndWaitMoreIfNeeded( + base::RepeatingCallback<bool()> condition, + base::OnceClosure quit_closure) { + if (condition.Run()) { + std::move(quit_closure).Run(); + return; + } + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&CheckForConditionAndWaitMoreIfNeeded, + std::move(condition), std::move(quit_closure)), + TestTimeouts::tiny_timeout()); +} + // Wait until |condition| returns true. void WaitForCondition(base::RepeatingCallback<bool()> condition, const std::string& description) { - const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(30); - const base::TimeTicks start_time = base::TimeTicks::Now(); - while (!condition.Run() && (base::TimeTicks::Now() - start_time < kTimeout)) { - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout()); - run_loop.Run(); - } + base::RunLoop run_loop; + CheckForConditionAndWaitMoreIfNeeded(condition, run_loop.QuitClosure()); + run_loop.Run(); + ASSERT_TRUE(condition.Run()) << "Timeout waiting for condition: " << description; } } // namespace -class CommandlineStartupTracingTest : public ContentBrowserTest { - public: - CommandlineStartupTracingTest() = default; - - void SetUpCommandLine(base::CommandLine* command_line) override { - base::CreateTemporaryFile(&temp_file_path_); - command_line->AppendSwitch(switches::kTraceStartup); - command_line->AppendSwitchASCII(switches::kTraceStartupDuration, "3"); - command_line->AppendSwitchASCII(switches::kTraceStartupFile, - temp_file_path_.AsUTF8Unsafe()); - } - - protected: - base::FilePath temp_file_path_; - - private: - DISALLOW_COPY_AND_ASSIGN(CommandlineStartupTracingTest); -}; - -// Failing on Android/Win ASAN, Linux TSAN. crbug.com/1041392 -#if (defined(OS_ANDROID) && defined(ADDRESS_SANITIZER)) || \ - (defined(OS_WIN) && defined(ADDRESS_SANITIZER)) || \ - ((defined(OS_LINUX) || defined(OS_CHROMEOS)) && defined(THREAD_SANITIZER)) -#define MAYBE_TestStartupTracing DISABLED_TestStartupTracing -#else -#define MAYBE_TestStartupTracing TestStartupTracing -#endif -IN_PROC_BROWSER_TEST_F(CommandlineStartupTracingTest, - MAYBE_TestStartupTracing) { - EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl("", "title1.html"))); - WaitForCondition(base::BindRepeating([]() { - return tracing::TraceStartupConfig::GetInstance() - ->finished_writing_to_file_for_testing(); - }), - "finish file write"); - - std::string trace; - base::ScopedAllowBlockingForTesting allow_blocking; - ASSERT_TRUE(base::ReadFileToString(temp_file_path_, &trace)); - EXPECT_TRUE(base::JSONReader::Read(trace)); - EXPECT_TRUE(trace.find("StartupTracingController::Start") != - std::string::npos); -} - -#undef MAYBE_TestStartupTracing - class StartupTracingInProcessTest : public ContentBrowserTest { public: StartupTracingInProcessTest() { @@ -154,4 +121,263 @@ wait_for_stop.Run(); } +namespace { + +enum class FinishType { + kWaitForTimeout, + kStopExplicitly, +}; + +std::ostream& operator<<(std::ostream& o, FinishType type) { + switch (type) { + case FinishType::kStopExplicitly: + o << "Stop"; + return o; + case FinishType::kWaitForTimeout: + o << "Wait"; + return o; + } +} + +enum class OutputType { + kProto, + kJSON, +}; + +std::ostream& operator<<(std::ostream& o, OutputType type) { + switch (type) { + case OutputType::kJSON: + o << "json"; + return o; + case OutputType::kProto: + o << "proto"; + return o; + } +} + +enum class OutputLocation { + // Write trace to a given file. + kGivenFile, + // Write trace into a given directory (basename will be set to trace1 before + // starting). + kDirectoryWithDefaultBasename, + // Write trace into a given directory (basename will be set to trace1 before + // starting, and updated to trace2 before calling Stop()). + kDirectoryWithBasenameUpdatedBeforeStop, +}; + +std::ostream& operator<<(std::ostream& o, OutputLocation type) { + switch (type) { + case OutputLocation::kGivenFile: + o << "file"; + return o; + case OutputLocation::kDirectoryWithDefaultBasename: + o << "dir/trace1"; + return o; + case OutputLocation::kDirectoryWithBasenameUpdatedBeforeStop: + o << "dir/trace2"; + return o; + } +} + +} // namespace + +class StartupTracingTest + : public ContentBrowserTest, + public testing::WithParamInterface< + std::tuple<FinishType, OutputType, OutputLocation>> { + public: + StartupTracingTest() = default; + + void SetUpCommandLine(base::CommandLine* command_line) override { + command_line->AppendSwitch(switches::kTraceStartup); + if (GetFinishType() == FinishType::kWaitForTimeout) { + command_line->AppendSwitchASCII(switches::kTraceStartupDuration, "3"); + } else { + command_line->AppendSwitchASCII(switches::kTraceStartupDuration, "0"); + } + command_line->AppendSwitchASCII(switches::kTraceStartupFormat, + GetOutputTypeAsString()); + + if (GetOutputLocation() == OutputLocation::kGivenFile) { + base::CreateTemporaryFile(&temp_file_path_); + } else { + base::CreateNewTempDirectory(base::FilePath::StringType(), + &temp_file_path_); + temp_file_path_ = temp_file_path_.AsEndingWithSeparator(); + } + + command_line->AppendSwitchASCII(switches::kEnableTracingOutput, + temp_file_path_.AsUTF8Unsafe()); + + if (GetOutputLocation() != OutputLocation::kGivenFile) { + // --enable-tracing-format switch should be initialised before + // calling SetDefaultBasenameForTest, which forces the creation of + // TraceStartupConfig, which queries the command line flags and + // stores the snapshot. + StartupTracingController::GetInstance().SetDefaultBasenameForTest( + "trace1", + StartupTracingController::ExtensionType::kAppendAppropriate); + } + } + + FinishType GetFinishType() { return std::get<0>(GetParam()); } + + OutputType GetOutputType() { return std::get<1>(GetParam()); } + + std::string GetOutputTypeAsString() { + switch (GetOutputType()) { + case OutputType::kJSON: + return "json"; + case OutputType::kProto: + return "proto"; + } + } + + OutputLocation GetOutputLocation() { return std::get<2>(GetParam()); } + + base::FilePath GetExpectedPath() { + std::string filename; + + switch (GetOutputLocation()) { + case OutputLocation::kGivenFile: + return temp_file_path_; + case OutputLocation::kDirectoryWithDefaultBasename: + filename = "trace1"; + break; + case OutputLocation::kDirectoryWithBasenameUpdatedBeforeStop: + filename = "trace2"; + break; + } + + // Renames are not supported together with timeouts. + if (GetFinishType() == FinishType::kWaitForTimeout) + filename = "trace1"; + + return temp_file_path_.AppendASCII(filename + "." + + GetOutputTypeAsString()); + } + + static void CheckOutput(base::FilePath path, OutputType output_type) { + std::string trace; + base::ScopedAllowBlockingForTesting allow_blocking; + ASSERT_TRUE(base::ReadFileToString(path, &trace)) + << "Failed to read file " << path; + + if (output_type == OutputType::kJSON) { + EXPECT_TRUE(base::JSONReader::Read(trace)); + } + + // Both proto and json should have the trace event name recorded somewhere + // as a substring. + EXPECT_TRUE(trace.find("StartupTracingController::Start") != + std::string::npos); + } + + void Wait() { + if (GetFinishType() == FinishType::kWaitForTimeout) { + WaitForCondition(base::BindRepeating([]() { + return StartupTracingController::GetInstance() + .is_finished_for_testing(); + }), + "finish file write"); + } else { + StartupTracingController::GetInstance().WaitUntilStopped(); + } + } + + protected: + base::FilePath temp_file_path_; + + private: + base::test::ScopedRunLoopTimeout increased_timeout_{ + FROM_HERE, TestTimeouts::test_launcher_timeout()}; + + DISALLOW_COPY_AND_ASSIGN(StartupTracingTest); +}; + +INSTANTIATE_TEST_SUITE_P( + All, + StartupTracingTest, + testing::Combine( + testing::Values(FinishType::kStopExplicitly, + FinishType::kWaitForTimeout), + testing::Values(OutputType::kJSON, OutputType::kProto), + testing::Values( + OutputLocation::kGivenFile, + OutputLocation::kDirectoryWithDefaultBasename, + OutputLocation::kDirectoryWithBasenameUpdatedBeforeStop))); + +IN_PROC_BROWSER_TEST_P(StartupTracingTest, TestEnableTracing) { + EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl("", "title1.html"))); + + if (GetOutputLocation() == + OutputLocation::kDirectoryWithBasenameUpdatedBeforeStop) { + StartupTracingController::GetInstance().SetDefaultBasenameForTest( + "trace2", StartupTracingController::ExtensionType::kAppendAppropriate); + } + + Wait(); + + CheckOutput(GetExpectedPath(), GetOutputType()); +} + +class EmergencyStopTracingTest : public StartupTracingTest {}; + +INSTANTIATE_TEST_SUITE_P( + All, + EmergencyStopTracingTest, + testing::Combine( + testing::Values(FinishType::kStopExplicitly), + testing::Values(OutputType::kJSON, OutputType::kProto), + testing::Values(OutputLocation::kDirectoryWithDefaultBasename))); + +IN_PROC_BROWSER_TEST_P(EmergencyStopTracingTest, StopOnUIThread) { + EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl("", "title1.html"))); + + StartupTracingController::EmergencyStop(); + CheckOutput(GetExpectedPath(), GetOutputType()); +} + +IN_PROC_BROWSER_TEST_P(EmergencyStopTracingTest, StopOnThreadPool) { + EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl("", "title1.html"))); + + auto expected_path = GetExpectedPath(); + auto output_type = GetOutputType(); + + base::RunLoop run_loop; + + base::ThreadPool::PostTask(FROM_HERE, base::BindLambdaForTesting([&]() { + StartupTracingController::EmergencyStop(); + CheckOutput(expected_path, output_type); + run_loop.Quit(); + })); + + run_loop.Run(); +} + +IN_PROC_BROWSER_TEST_P(EmergencyStopTracingTest, StopOnThreadPoolTwice) { + EXPECT_TRUE(NavigateToURL(shell(), GetTestUrl("", "title1.html"))); + + auto expected_path = GetExpectedPath(); + auto output_type = GetOutputType(); + + base::RunLoop run_loop1; + base::RunLoop run_loop2; + + base::ThreadPool::PostTask(FROM_HERE, base::BindLambdaForTesting([&]() { + StartupTracingController::EmergencyStop(); + CheckOutput(expected_path, output_type); + run_loop1.Quit(); + })); + base::ThreadPool::PostTask(FROM_HERE, base::BindLambdaForTesting([&]() { + StartupTracingController::EmergencyStop(); + CheckOutput(expected_path, output_type); + run_loop2.Quit(); + })); + + run_loop1.Run(); + run_loop2.Run(); +} + } // namespace content
diff --git a/content/browser/tracing/startup_tracing_controller.cc b/content/browser/tracing/startup_tracing_controller.cc index f745fd2..a9adf2e1 100644 --- a/content/browser/tracing/startup_tracing_controller.cc +++ b/content/browser/tracing/startup_tracing_controller.cc
@@ -3,14 +3,19 @@ // found in the LICENSE file. #include "content/browser/tracing/startup_tracing_controller.h" +#include "base/bind_post_task.h" #include "base/command_line.h" #include "base/files/file.h" #include "base/files/file_util.h" #include "base/logging.h" #include "base/no_destructor.h" #include "base/run_loop.h" +#include "base/synchronization/waitable_event.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" +#include "base/thread_annotations.h" +#include "base/threading/thread_restrictions.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/typed_macros.h" #include "build/build_config.h" #include "components/tracing/common/trace_startup_config.h" @@ -29,17 +34,87 @@ namespace content { +// A helper class responsible for coordinating emergency trace finalisation +// (e.g. when the process is about to be killed), which can be initiated from +// any thread. +class EmergencyTraceFinalisationCoordinator { + public: + static EmergencyTraceFinalisationCoordinator& GetInstance() { + static base::NoDestructor<EmergencyTraceFinalisationCoordinator> g_instance; + return *g_instance; + } + + void OnTracingStarted(scoped_refptr<base::SequencedTaskRunner> task_runner, + base::OnceClosure stop_tracing) { + tracing_started_.Set(); + base::AutoLock lock(lock_); + startup_tracing_controller_task_runner_ = std::move(task_runner); + stop_tracing_ = std::move(stop_tracing); + } + + void OnTracingStopped() { finalisation_.Signal(); } + + // May be called multiple times per session, e.g. if a second thread + // encounters a crash after the first. + void StopAndBlockUntilStopped() { + // If DCHECK fires before tracing has started, there isn't much for us to + // do. + if (!tracing_started_.IsSet()) + return; + + base::trace_event::TraceLog::GetInstance() + ->SetCurrentThreadBlocksMessageLoop(); + + base::OnceClosure stop_tracing; + scoped_refptr<base::SequencedTaskRunner> task_runner; + { + base::AutoLock lock(lock_); + task_runner = startup_tracing_controller_task_runner_; + stop_tracing = std::move(stop_tracing_); + } + + if (task_runner->RunsTasksInCurrentSequence()) { + VLOG(0) << "Ignored an emergency tracing stop request from the " + "StartupTracingController sequence"; + return; + } + + if (stop_tracing) + task_runner->PostTask(FROM_HERE, std::move(stop_tracing)); + + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope allow_wait; + + // Wait for the tracing to be finished before processing. + // Note that we should wait even if |stop_tracing| is null — if a second + // thread hits DCHECK while the first has posted a task and waits for the + // trace to be written, the second one should wait as well to avoid crashing + // the process. + finalisation_.Wait(); + } + + private: + base::WaitableEvent finalisation_; + base::AtomicFlag tracing_started_; + + base::Lock lock_; + scoped_refptr<base::SequencedTaskRunner> + startup_tracing_controller_task_runner_ GUARDED_BY(lock_); + base::OnceClosure stop_tracing_ GUARDED_BY(lock_); +}; + class StartupTracingController::BackgroundTracer { public: enum class WriteMode { kAfterStopping, kStreaming }; BackgroundTracer(WriteMode write_mode, + TempFilePolicy temp_file_policy, base::FilePath output_file, tracing::TraceStartupConfig::OutputFormat output_format, perfetto::TraceConfig trace_config, base::OnceClosure on_tracing_finished) : state_(State::kTracing), write_mode_(write_mode), + temp_file_policy_(temp_file_policy), task_runner_(base::SequencedTaskRunnerHandle::Get()), output_file_(output_file), output_format_(output_format), @@ -57,17 +132,33 @@ tracing_session_->Setup(trace_config); } - tracing_session_->StartBlocking(); + // |StartBlocking| can take a non-trivial amount of time, so + // EmergencyTraceFinalisationController should be set up before it to catch + // DCHECKs early. + EmergencyTraceFinalisationCoordinator::GetInstance().OnTracingStarted( + task_runner_, + base::BindOnce(&BackgroundTracer::Stop, weak_ptr_factory_.GetWeakPtr(), + base::nullopt)); + tracing_session_->SetOnStopCallback([&]() { OnTracingStopped(); }); + tracing_session_->StartBlocking(); TRACE_EVENT("startup", "StartupTracingController::Start"); } - void Stop() { + void Stop(base::Optional<base::FilePath> output_file) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (state_ != State::kTracing) - return; + // Tracing might have already been finished due to a timeout. + if (state_ != State::kTracing) { + // Note: updating output files is not supported together with + // timeout-based tracing. + return; + } + state_ = State::kStopping; + + if (output_file) + output_file_ = output_file.value(); tracing_session_->StopBlocking(); } @@ -82,11 +173,13 @@ } DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK_EQ(state_, State::kTracing); + // State will be kStopping if Stop() is called and kTracing if tracing + // finishes due to a timeout. + DCHECK(state_ == State::kStopping || state_ == State::kTracing); if (write_mode_ == WriteMode::kStreaming) { // No need to explicitly call ReadTrace as Perfetto has already written // the file. - Finalise(output_file_); + Finalise(); return; } state_ = State::kWritingToFile; @@ -102,7 +195,7 @@ if (args.has_more) return; - Finalise(output_file_); + Finalise(); }); } @@ -138,15 +231,15 @@ // In order to atomically commit the trace file, create a temporary file first // which then will be subsequently renamed. void OpenFile(const base::FilePath& path) { - file_ = base::CreateAndOpenTemporaryFileInDir(path.DirName(), - &written_to_file_); - if (file_.IsValid()) { - LOG(ERROR) << "Created valid file"; - return; - } + if (temp_file_policy_ == TempFilePolicy::kUseTemporaryFile) { + file_ = base::CreateAndOpenTemporaryFileInDir(path.DirName(), + &written_to_file_); + if (file_.IsValid()) + return; - VLOG(1) << "Failed to create temporary file, using file '" << path - << "' directly instead"; + VLOG(1) << "Failed to create temporary file, using file '" << path + << "' directly instead"; + } // On Android, it might not be possible to create a temporary file. // In that case, we should use the file directly. @@ -159,38 +252,48 @@ } // Close the file and rename if needed. - void Finalise(const base::FilePath& path) { + void Finalise() { DCHECK_NE(state_, State::kFinished); file_.Close(); - if (written_to_file_ != path) { + if (written_to_file_ != output_file_) { base::File::Error error; if (!base::ReplaceFile(written_to_file_, output_file_, &error)) { LOG(ERROR) << "Cannot move file '" << written_to_file_ << "' to '" << output_file_ << "' : " << base::File::ErrorToString(error); + } else { + written_to_file_ = output_file_; } } + VLOG(0) << "Completed startup tracing to " << written_to_file_; + EmergencyTraceFinalisationCoordinator::GetInstance().OnTracingStopped(); + state_ = State::kFinished; std::move(on_tracing_finished_).Run(); - - VLOG(0) << "Completed startup tracing to " << path; } enum class State { kTracing, + kStopping, kWritingToFile, kFinished, }; State state_; const WriteMode write_mode_; + const TempFilePolicy temp_file_policy_; scoped_refptr<base::SequencedTaskRunner> task_runner_; + // Output file might be customised during the execution (e.g. test result + // becomes available), which means that if Perfetto has already started + // streaming the trace, the trace file should be renamed after trace + // completes. base::FilePath output_file_; base::FilePath written_to_file_; + base::File file_; const tracing::TraceStartupConfig::OutputFormat output_format_; @@ -200,27 +303,32 @@ std::unique_ptr<tracing::TracePacketTokenizer> trace_packet_tokenizer_; base::OnceClosure on_tracing_finished_; + std::unique_ptr<perfetto::TracingSession> tracing_session_; SEQUENCE_CHECKER(sequence_checker_); + + base::WeakPtrFactory<BackgroundTracer> weak_ptr_factory_{this}; }; +// static +StartupTracingController& StartupTracingController::GetInstance() { + // Note: no DCHECK_CURRENTLY_ON, as it can be called prior to initialisation + // of BrowserThreads. + + static base::NoDestructor<StartupTracingController> g_instance; + return *g_instance; +} + namespace { -base::FilePath GetStartupTraceFileName() { - base::FilePath trace_file; - - trace_file = tracing::TraceStartupConfig::GetInstance()->GetResultFile(); - if (trace_file.empty()) { +base::FilePath BasenameToPath(std::string basename) { #if defined(OS_ANDROID) - trace_file = TracingControllerAndroid::GenerateTracingFilePath(""); + return TracingControllerAndroid::GenerateTracingFilePath(basename); #else - // Default to saving the startup trace into the current dir. - trace_file = base::FilePath().AppendASCII("chrometrace.log"); + // Default to saving the startup trace into the current dir. + return base::FilePath().AppendASCII(basename); #endif - } - - return trace_file; } } // namespace @@ -228,12 +336,46 @@ StartupTracingController::StartupTracingController() = default; StartupTracingController::~StartupTracingController() = default; -// static -StartupTracingController& StartupTracingController::GetInstance() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); +base::FilePath StartupTracingController::GetOutputPath() { + auto* command_line = base::CommandLine::ForCurrentProcess(); - static base::NoDestructor<StartupTracingController> g_instance; - return *g_instance; + base::FilePath path_from_config = + tracing::TraceStartupConfig::GetInstance()->GetResultFile(); + if (!path_from_config.empty()) + return path_from_config; + + // If --trace-startup-file is specified, use it. + if (command_line->HasSwitch(switches::kTraceStartupFile)) { + base::FilePath result = + command_line->GetSwitchValuePath(switches::kTraceStartupFile); + if (result.empty()) + return BasenameToPath("chrometrace.log"); + return result; + } + + base::FilePath result = + command_line->GetSwitchValuePath(switches::kEnableTracingOutput); + if (result.empty() && command_line->HasSwitch(switches::kTraceStartup)) { + // If --trace-startup is present, return chrometrace.log for backwards + // compatibility. + return BasenameToPath("chrometrace.log"); + } + + // If a non-directory path is specified, use it. + if (!result.empty() && !result.EndsWithSeparator()) + return result; + + std::string basename = default_basename_; + if (basename.empty()) + basename = "chrometrace.log"; + + // If a non-empty directory is specified, use it. + if (!result.empty()) + return result.AppendASCII(basename); + + // If the directory is empty, go through BasenameToPath to generate a valid + // path on Android. + return BasenameToPath(basename); } void StartupTracingController::StartIfNeeded() { @@ -283,12 +425,9 @@ tracing::TraceStartupConfig::GetInstance()->GetStartupDuration(); perfetto_config.set_duration_ms(duration_in_seconds * 1000); - if (output_file_.empty()) - output_file_ = GetStartupTraceFileName(); - background_tracer_ = base::SequenceBound<BackgroundTracer>( - std::move(background_task_runner), write_mode, output_file_, - output_format, perfetto_config, + std::move(background_task_runner), write_mode, temp_file_policy_, + GetOutputPath(), output_format, perfetto_config, base::BindOnce( [](StartupTracingController* controller) { GetUIThreadTaskRunner({})->PostTask( @@ -302,7 +441,8 @@ void StartupTracingController::Stop(base::OnceClosure on_tracing_finished) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (state_ == State::kNotRunning) { + if (state_ != State::kRunning) { + // Both kStopped and kNotRunning are valid states. std::move(on_tracing_finished).Run(); return; } @@ -310,22 +450,58 @@ DCHECK(!on_tracing_finished_) << "Stop() should be called only once."; on_tracing_finished_ = std::move(on_tracing_finished); - background_tracer_.AsyncCall(&BackgroundTracer::Stop); + background_tracer_.AsyncCall(&BackgroundTracer::Stop) + .WithArgs(GetOutputPath()); } void StartupTracingController::OnStoppedOnUIThread() { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_EQ(state_, State::kRunning); - state_ = State::kNotRunning; + state_ = State::kStopped; background_tracer_.Reset(); if (on_tracing_finished_) std::move(on_tracing_finished_).Run(); - tracing::TraceStartupConfig::GetInstance()->OnTraceToResultFileFinished(); tracing::TraceStartupConfig::GetInstance()->SetDisabled(); } +void StartupTracingController::SetUsingTemporaryFile( + StartupTracingController::TempFilePolicy temp_file_policy) { + DCHECK_EQ(state_, State::kNotEnabled) << "Should be called before Start()"; + temp_file_policy_ = temp_file_policy; +} + +void StartupTracingController::SetDefaultBasename( + std::string basename, + ExtensionType extension_type) { + if (!tracing::TraceStartupConfig::GetInstance()->IsEnabled()) + return; + + if (basename_for_test_set_) + return; + + if (extension_type == ExtensionType::kAppendAppropriate) { + switch (tracing::TraceStartupConfig::GetInstance()->GetOutputFormat()) { + case tracing::TraceStartupConfig::OutputFormat::kLegacyJSON: + basename += ".json"; + break; + case tracing::TraceStartupConfig::OutputFormat::kProto: + basename += ".proto"; + break; + } + } + default_basename_ = basename; +} + +void StartupTracingController::SetDefaultBasenameForTest( + std::string basename, + ExtensionType extension_type) { + basename_for_test_set_ = false; + SetDefaultBasename(basename, extension_type); + basename_for_test_set_ = true; +} + void StartupTracingController::WaitUntilStopped() { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -334,4 +510,16 @@ run_loop.Run(); } +// static +void StartupTracingController::EmergencyStop() { + if (GetIOThreadTaskRunner({})->RunsTasksInCurrentSequence()) { + VLOG(0) << "Emergency tracing stop request from IO thread is ignored - not " + "possible to finalise trace without running tasks on IO thread"; + return; + } + + EmergencyTraceFinalisationCoordinator::GetInstance() + .StopAndBlockUntilStopped(); +} + } // namespace content
diff --git a/content/browser/tracing/startup_tracing_controller.h b/content/browser/tracing/startup_tracing_controller.h index 744a14b..d7d69f6 100644 --- a/content/browser/tracing/startup_tracing_controller.h +++ b/content/browser/tracing/startup_tracing_controller.h
@@ -6,32 +6,80 @@ #define CONTENT_BROWSER_TRACING_STARTUP_TRACING_CONTROLLER_H_ #include "base/threading/sequence_bound.h" +#include "content/common/content_export.h" namespace content { // Class responsible for starting and stopping startup tracing as configured by // StartupTracingConfig. All interactions with it are limited to UI thread, but // the actual logic lives on a background ThreadPool sequence. -class StartupTracingController { +class CONTENT_EXPORT StartupTracingController { public: StartupTracingController(); ~StartupTracingController(); static StartupTracingController& GetInstance(); + // Stop the trace recording, write the trace to disk and block until complete. + // Intended to be used in the situation when the browser process is going to + // crash (e.g. DCHECK failure) and we want to avoid losing the trace data. Can + // be called from any thread. + // May not succeed if called from a sequence that is required to be responsive + // during trace finalisation. + static void EmergencyStop(); + void StartIfNeeded(); void WaitUntilStopped(); + // By default, a trace is written into a temporary file which then is renamed, + // however this can lead to data loss when the browser process crashes. + // Embedders can disable this (especially if a name provided to + // SetDefaultBasename makes it clear that the trace is incomplete and final + // name will be provided via SetDefaultBasename call before calling Stop). + enum class TempFilePolicy { + kUseTemporaryFile, + kWriteDirectly, + }; + void SetUsingTemporaryFile(TempFilePolicy temp_file_policy); + + // Set default basename for the trace output file to allow //content embedders + // to customise it using some metadata (like test names). + // + // If --enable-trace-output is a directory (default value, empty, designated + // "current directory"), then the startup trace will be written in a file with + // the given basename in this directory. Depending on the |extension_type|, + // an appropriate extension (.json or .proto) will be added. + // + // Note that embedders can call it even after tracing has started and Perfetto + // started streaming the trace into it — in that case, + // StartupTracingController will rename the file after finishing. However, + // this is guaranteed to work only when tracing lasts until Stop() (not with + // duration-based tracing). + enum class ExtensionType { + kAppendAppropriate, + kNone, + }; + void SetDefaultBasename(std::string basename, ExtensionType extension_type); + // As the test harness calls SetDefaultBasename, expose ForTest() version for + // the tests checking the StartupTracingController logic itself. + void SetDefaultBasenameForTest(std::string basename, + ExtensionType extension_type); + + bool is_finished_for_testing() const { return state_ == State::kStopped; } + private: void Stop(base::OnceClosure on_finished_callback); void OnStoppedOnUIThread(); + base::FilePath GetOutputPath(); + enum class State { + kNotEnabled, kRunning, - kNotRunning, + kStopped, }; - State state_ = State::kNotRunning; + State state_ = State::kNotEnabled; // All actual interactions with the tracing service and the process of writing // files happens on a background thread. @@ -40,6 +88,11 @@ base::OnceClosure on_tracing_finished_; base::FilePath output_file_; + + std::string default_basename_; + bool basename_for_test_set_ = false; + + TempFilePolicy temp_file_policy_ = TempFilePolicy::kUseTemporaryFile; }; } // namespace content
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index d89656fa..65d404c0 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1147,7 +1147,6 @@ #if BUILDFLAG(ENABLE_PLUGINS) IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(WebContentsImpl, message, render_frame_host) IPC_MESSAGE_HANDLER(FrameHostMsg_PepperPluginHung, OnPepperPluginHung) - IPC_MESSAGE_HANDLER(FrameHostMsg_PluginCrashed, OnPluginCrashed) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() #else @@ -6050,10 +6049,10 @@ pepper_playback_observer_->PepperStopsPlayback(source, pp_instance); } -void WebContentsImpl::OnPluginCrashed(RenderFrameHostImpl* source, - const base::FilePath& plugin_path, - base::ProcessId plugin_pid) { - OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::OnPluginCrashed", +void WebContentsImpl::OnPepperPluginCrashed(RenderFrameHostImpl* source, + const base::FilePath& plugin_path, + base::ProcessId plugin_pid) { + OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::OnPepperPluginCrashed", "render_frame_host", base::trace_event::ToTracedValue(source)); // TODO(nick): Eliminate the |plugin_pid| parameter, which can't be trusted, @@ -8009,6 +8008,12 @@ #endif // !defined(OS_MAC) +void WebContentsImpl::UpdateWindowControlsOverlay( + const gfx::Rect& bounding_rect) { + GetMainFrame()->GetAssociatedLocalMainFrame()->UpdateWindowControlsOverlay( + bounding_rect); +} + BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { return browser_plugin_embedder_.get(); }
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 00ab358b..bd4c845c 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -531,6 +531,7 @@ const std::vector<blink::mojom::FaviconURLPtr>& GetFaviconURLs() override; void Resize(const gfx::Rect& new_bounds) override; gfx::Size GetSize() override; + void UpdateWindowControlsOverlay(const gfx::Rect& bounding_rect) override; #if defined(OS_ANDROID) base::android::ScopedJavaLocalRef<jobject> GetJavaWebContents() override; @@ -782,6 +783,9 @@ int32_t pp_instance) override; void OnPepperStopsPlayback(RenderFrameHostImpl* source, int32_t pp_instance) override; + void OnPepperPluginCrashed(RenderFrameHostImpl* source, + const base::FilePath& plugin_path, + base::ProcessId plugin_pid) override; #endif // RenderViewHostDelegate ---------------------------------------------------- @@ -1518,9 +1522,6 @@ int plugin_child_id, const base::FilePath& path, bool is_hung); - void OnPluginCrashed(RenderFrameHostImpl* source, - const base::FilePath& plugin_path, - base::ProcessId plugin_pid); #endif // BUILDFLAG(ENABLE_PLUGINS) void OnShowValidationMessage(RenderViewHostImpl* source, const gfx::Rect& anchor_in_root_view,
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index 6ab89de..cd99fb5 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -4555,4 +4555,87 @@ EXPECT_TRUE(browser_td >= renderer_td); } +class WebContentsImplBrowserTestWindowControlsOverlay + : public WebContentsImplBrowserTest { + public: + void SetUp() override { + scoped_feature_list_.InitAndEnableFeature( + features::kWebAppWindowControlsOverlay); + WebContentsImplBrowserTest::SetUp(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTestWindowControlsOverlay, + UpdateWindowControlsOverlay) { + ASSERT_TRUE(embedded_test_server()->Start()); + auto* web_contents = shell()->web_contents(); + + GURL url("about:blank"); + EXPECT_TRUE(NavigateToURL(shell(), url)); + + WaitForLoadStop(web_contents); + + // initial state with no visible bounds and empty rect + int empty_rect_value = 0; + + EXPECT_EQ(false, + EvalJs(web_contents, "navigator.windowControlsOverlay.visible")); + + EXPECT_EQ( + empty_rect_value, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().x")); + + EXPECT_EQ( + empty_rect_value, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().y")); + + EXPECT_EQ( + empty_rect_value, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().width")); + + EXPECT_EQ( + empty_rect_value, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().height")); + + gfx::Rect bounding_client_rect = + gfx::Rect(2 /*x*/, 2 /*y*/, 2 /*width*/, 2 /*height*/); + + web_contents->UpdateWindowControlsOverlay(bounding_client_rect); + + // information about the bounds should be updated + int new_x = 2; + int new_y = 2; + int new_width = 2; + int new_height = 2; + + EXPECT_EQ(true, + EvalJs(web_contents, "navigator.windowControlsOverlay.visible")); + + EXPECT_EQ( + new_x, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().x")); + + EXPECT_EQ( + new_y, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().y")); + + EXPECT_EQ( + new_width, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().width")); + + EXPECT_EQ( + new_height, + EvalJs(web_contents, + "navigator.windowControlsOverlay.getBoundingClientRect().height")); +} } // namespace content
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index beb9d019..74cc582 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -257,15 +257,6 @@ base::FilePath /* path */, bool /* is_hung */) -// Sent by the renderer process to indicate that a plugin instance has crashed. -// Note: |plugin_pid| should not be trusted. The corresponding process has -// probably died. Moreover, the ID may have been reused by a new process. Any -// usage other than displaying it in a prompt to the user is very likely to be -// wrong. -IPC_MESSAGE_ROUTED2(FrameHostMsg_PluginCrashed, - base::FilePath /* plugin_path */, - base::ProcessId /* plugin_pid */) - // Return information about a plugin for the given URL and MIME // type. If there is no matching plugin, |found| is false. // |actual_mime_type| is the actual mime type supported by the
diff --git a/content/common/pepper_plugin.mojom b/content/common/pepper_plugin.mojom index bcd7ac3..288db52 100644 --- a/content/common/pepper_plugin.mojom +++ b/content/common/pepper_plugin.mojom
@@ -4,6 +4,9 @@ module content.mojom; +import "mojo/public/mojom/base/file_path.mojom"; +import "mojo/public/mojom/base/process_id.mojom"; + // Generic Pepper messages. Implemented by the browser. interface PepperHost { // Notification that a Pepper plugin instance is created in the DOM. @@ -19,6 +22,14 @@ // Notification a plugin instance has stopped playback. StopsPlayback(); + + // Notification that a plugin instance has crashed. + // Note: |plugin_pid| should not be trusted. The corresponding process has + // probably died. Moreover, the ID may have been reused by a new process. Any + // usage other than displaying it in a prompt to the user is very likely to be + // wrong. + InstanceCrashed(mojo_base.mojom.FilePath plugin_path, + mojo_base.mojom.ProcessId plugin_pid); }; // Plugin instance specific messages. Implemented by the renderer.
diff --git a/content/common/unfreezable_frame_messages.h b/content/common/unfreezable_frame_messages.h index 3fae66da..86efcf5 100644 --- a/content/common/unfreezable_frame_messages.h +++ b/content/common/unfreezable_frame_messages.h
@@ -23,8 +23,4 @@ // Instructs the renderer to delete the RenderFrame. IPC_MESSAGE_ROUTED1(UnfreezableFrameMsg_Delete, content::FrameDeleteIntention) -// Requests the corresponding RenderFrameProxy to be deleted and removed from -// the frame tree. -IPC_MESSAGE_ROUTED0(UnfreezableFrameMsg_DeleteProxy) - #endif // CONTENT_COMMON_UNFREEZABLE_FRAME_MESSAGES_H_
diff --git a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java index df41d81..8ac3442 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java
@@ -21,6 +21,7 @@ import org.chromium.base.annotations.JNINamespace; import org.chromium.content_public.browser.ScreenOrientationDelegate; import org.chromium.content_public.browser.ScreenOrientationProvider; +import org.chromium.content_public.browser.WebContents; import org.chromium.device.mojom.ScreenOrientationLockType; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.display.DisplayAndroid; @@ -41,6 +42,10 @@ private static final String TAG = "ScreenOrientation"; + // More readable constants to be passed to |addPendingRequest|. + private static final boolean LOCK = true; + private static final boolean UNLOCK = false; + private ScreenOrientationDelegate mDelegate; /** @@ -60,6 +65,45 @@ */ private Map<Activity, Pair<Boolean, Integer>> mDelayedRequests = new WeakHashMap<>(); + private static final class PendingRequest implements WindowEventObserver { + private final ScreenOrientationProviderImpl mProvider; + private final WindowEventObserverManager mWindowEventManager; + private final boolean mLockOrUnlock; + private final byte mWebScreenOrientation; + private boolean mObserverRemoved; + + public PendingRequest(ScreenOrientationProviderImpl provider, + WindowEventObserverManager windowEventManager, boolean lockOrUnlock, + byte webScreenOrientation) { + mProvider = provider; + mWindowEventManager = windowEventManager; + mLockOrUnlock = lockOrUnlock; + mWebScreenOrientation = webScreenOrientation; + mWindowEventManager.addObserver(this); + } + + public void cancel() { + if (mObserverRemoved) return; + mWindowEventManager.removeObserver(this); + mObserverRemoved = true; + } + + @Override + public void onWindowAndroidChanged(WindowAndroid newWindowAndroid) { + if (newWindowAndroid == null) return; + + if (mLockOrUnlock) { + mProvider.lockOrientation(newWindowAndroid, mWebScreenOrientation); + } else { + mProvider.unlockOrientation(newWindowAndroid); + } + mWindowEventManager.removeObserver(this); + mObserverRemoved = true; + } + } + + private final Map<WebContents, PendingRequest> mPendingRequests = new WeakHashMap<>(); + @CalledByNative public static ScreenOrientationProviderImpl getInstance() { return Holder.sInstance; @@ -114,7 +158,26 @@ } } + private void addPendingRequest( + WebContents webContents, boolean lockOrUnlock, byte webScreenOrientation) { + WindowEventObserverManager windowEventManager = + WindowEventObserverManager.from(webContents); + PendingRequest existingRequest = mPendingRequests.get(webContents); + if (existingRequest != null) existingRequest.cancel(); + mPendingRequests.put(webContents, + new PendingRequest(this, windowEventManager, lockOrUnlock, webScreenOrientation)); + } + @CalledByNative + private void lockOrientationForWebContents(WebContents webContents, byte webScreenOrientation) { + WindowAndroid window = webContents.getTopLevelNativeWindow(); + if (window == null) { + addPendingRequest(webContents, LOCK, webScreenOrientation); + } else { + lockOrientation(window, webScreenOrientation); + } + } + @Override public void lockOrientation(@Nullable WindowAndroid window, byte webScreenOrientation) { // WindowAndroid may be null if the tab is being reparented. @@ -136,6 +199,15 @@ } @CalledByNative + private void unlockOrientationForWebContents(WebContents webContents) { + WindowAndroid window = webContents.getTopLevelNativeWindow(); + if (window == null) { + addPendingRequest(webContents, UNLOCK, (byte) 0); + } else { + unlockOrientation(window); + } + } + @Override public void unlockOrientation(@Nullable WindowAndroid window) { // WindowAndroid may be null if the tab is being reparented.
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java b/content/public/android/java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java index ac1df74..2fecdee 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/ScreenOrientationProvider.java
@@ -11,6 +11,8 @@ /** * Interface providing the access to C++ ScreenOrientationProvider. + * TODO(boliu): This interface working with WindowAndroid does not support the use case + * when an Activity (and WindowAndroid) is recreated on rotation. */ public interface ScreenOrientationProvider { static ScreenOrientationProvider getInstance() {
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index c912ce5f..a67421e 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h
@@ -1167,6 +1167,10 @@ // reliable favicon-related state. virtual const std::vector<blink::mojom::FaviconURLPtr>& GetFaviconURLs() = 0; + // Intended for desktop pwas with manifest entry of window-controls-overlay, + // This sends the available title bar area bounds to the renderer process. + virtual void UpdateWindowControlsOverlay(const gfx::Rect& bounding_rect) = 0; + private: // This interface should only be implemented inside content. friend class WebContentsImpl;
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 3139a07..4d26731 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -402,14 +402,6 @@ // Enabled threaded compositing for web tests. const char kEnableThreadedCompositing[] = "enable-threaded-compositing"; -// Enable tracing during the execution of browser tests. -const char kEnableTracing[] = "enable-tracing"; - -// The filename to write the output of the test tracing to. If it is empty -// or it ends in a directory separator then an auto-generated filename will be -// appended. -const char kEnableTracingOutput[] = "enable-tracing-output"; - // Enable screen capturing support for MediaStream API. const char kEnableUserMediaScreenCapturing[] = "enable-usermedia-screen-capturing";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index a48873f..ae35cec5 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -123,8 +123,6 @@ CONTENT_EXPORT extern const char kEnableStrictMixedContentChecking[]; CONTENT_EXPORT extern const char kEnableStrictPowerfulFeatureRestrictions[]; CONTENT_EXPORT extern const char kEnableThreadedCompositing[]; -CONTENT_EXPORT extern const char kEnableTracing[]; -CONTENT_EXPORT extern const char kEnableTracingOutput[]; CONTENT_EXPORT extern const char kEnableUserMediaScreenCapturing[]; CONTENT_EXPORT extern const char kEnableUseZoomForDSF[]; CONTENT_EXPORT extern const char kEnableViewport[];
diff --git a/content/public/test/DEPS b/content/public/test/DEPS index 2dc6203..a9f5558 100644 --- a/content/public/test/DEPS +++ b/content/public/test/DEPS
@@ -33,6 +33,7 @@ ".*\.(cc|mm)": [ # Testing utilities can access anything in content/ "+content", + "+components/tracing/common", "+gin/v8_initializer.h", "+services/network/network_context.h", "+third_party/iaccessible2",
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index eb959bf2..6bc7162 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -21,6 +21,7 @@ #include "base/files/scoped_file.h" #include "base/i18n/icu_util.h" #include "base/location.h" +#include "base/logging.h" #include "base/macros.h" #include "base/rand_util.h" #include "base/run_loop.h" @@ -37,6 +38,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "components/tracing/common/tracing_switches.h" #include "content/browser/browser_main_loop.h" #include "content/browser/browser_thread_impl.h" #include "content/browser/network_service_instance_impl.h" @@ -46,6 +48,7 @@ #include "content/browser/startup_helper.h" #include "content/browser/storage_partition_impl.h" #include "content/browser/tracing/memory_instrumentation_util.h" +#include "content/browser/tracing/startup_tracing_controller.h" #include "content/browser/tracing/tracing_controller_impl.h" #include "content/public/app/content_main.h" #include "content/public/browser/browser_task_traits.h" @@ -166,10 +169,47 @@ GetUIThreadTaskRunner({})->PostTask(FROM_HERE, std::move(quit_task)); } -void TraceStopTracingComplete(base::OnceClosure quit, - const base::FilePath& file_path) { - LOG(ERROR) << "Tracing written to: " << file_path.value(); - std::move(quit).Run(); +enum class TraceBasenameType { + kWithoutTestStatus, + kWithTestStatus, +}; + +std::string GetDefaultTraceBasename(TraceBasenameType type) { + std::string test_suite_name = ::testing::UnitTest::GetInstance() + ->current_test_info() + ->test_suite_name(); + std::string test_name = + ::testing::UnitTest::GetInstance()->current_test_info()->name(); + // Parameterised tests might have slashes in their full name — replace them + // before using it as a file name to avoid trying to write to an incorrect + // location. + base::ReplaceChars(test_suite_name, "/", "_", &test_suite_name); + base::ReplaceChars(test_name, "/", "_", &test_name); + // Add random number to the trace file to distinguish traces from different + // test runs. We don't use timestamp here to avoid collisions with parallel + // runs of the same test. Browser test runner runs one test per browser + // process instantiation, so saving the seed here is appopriate. + // GetDefaultTraceBasename() is going to be called twice: + // - for the first time, before the test starts to get the name of the file to + // stream the results (to avoid losing them if test crashes). + // - the second time, if test execution finishes normally, to calculate the + // resulting name of the file, including test result. + static std::string random_seed = + base::NumberToString(base::RandInt(1e7, 1e8 - 1)); + std::string status; + if (type == TraceBasenameType::kWithTestStatus) { + status = ::testing::UnitTest::GetInstance() + ->current_test_info() + ->result() + ->Passed() + ? "OK" + : "FAIL"; + } else { + // In order to be able to stream the test to the file, + status = "NOT_FINISHED"; + } + return "trace_test_" + test_suite_name + "_" + test_name + "_" + random_seed + + "_" + status; } // See SetInitialWebContents comment for more information. @@ -483,6 +523,32 @@ std::make_unique<CreatedMainPartsClosure>(base::BindOnce( &BrowserTestBase::CreatedBrowserMainParts, base::Unretained(this))); + // If tracing is enabled, customise the output filename based on the name of + // the test. + StartupTracingController::GetInstance().SetDefaultBasename( + GetDefaultTraceBasename(TraceBasenameType::kWithoutTestStatus), + StartupTracingController::ExtensionType::kAppendAppropriate); + // Write to the provided file directly to recover at least some data when the + // test crashes or times out. + StartupTracingController::GetInstance().SetUsingTemporaryFile( + StartupTracingController::TempFilePolicy::kWriteDirectly); + // Set a logging handler to flush a trace before crashing the test when + // hitting a DCHECK / LOG(FATAL). + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableTracing)) { + DCHECK(!logging::GetLogMessageHandler()); + logging::SetLogMessageHandler([](int severity, const char* file, int line, + size_t message_start, + const std::string& str) { + // TODO(crbug.com/1157954): Print the message to the console before + // calling this to ensure that the message is still printed if something + // goes wrong. + if (severity == logging::LOGGING_FATAL) + StartupTracingController::EmergencyStop(); + return false; + }); + } + #if defined(OS_ANDROID) // For all other platforms, we call ContentMain for browser tests which goes // through the normal browser initialization paths. For Android, we must set @@ -670,36 +736,6 @@ } #endif -namespace { - -std::string GetDefaultTraceFilename() { - std::string test_suite_name = ::testing::UnitTest::GetInstance() - ->current_test_info() - ->test_suite_name(); - std::string test_name = - ::testing::UnitTest::GetInstance()->current_test_info()->name(); - // Parameterised tests might have slashes in their full name — replace them - // before using it as a file name to avoid trying to write to an incorrect - // location. - base::ReplaceChars(test_suite_name, "/", "_", &test_suite_name); - base::ReplaceChars(test_name, "/", "_", &test_name); - // Add random number to the trace file to distinguish traces from different - // test runs. - // We don't use timestamp here to avoid collisions with parallel runs of the - // same test. - std::string random_seed = base::NumberToString(base::RandInt(1e7, 1e8 - 1)); - std::string status = ::testing::UnitTest::GetInstance() - ->current_test_info() - ->result() - ->Passed() - ? "OK" - : "FAIL"; - return "trace_test_" + test_suite_name + "_" + test_name + "_" + random_seed + - "_" + status + ".json"; -} - -} // namespace - void BrowserTestBase::ProxyRunTestOnMainThreadLoop() { #if !defined(OS_ANDROID) // All FeatureList overrides should have been registered prior to browser test @@ -728,17 +764,6 @@ signal(SIGTERM, DumpStackTraceSignalHandler); #endif // defined(OS_POSIX) - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableTracing)) { - base::trace_event::TraceConfig trace_config( - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kEnableTracing), - base::trace_event::RECORD_CONTINUOUSLY); - TracingController::GetInstance()->StartTracing( - trace_config, - TracingController::StartTracingDoneCallback()); - } - { // This can be called from a posted task. Allow nested tasks here, because // otherwise the test body will have to do it in order to use RunLoop for @@ -782,31 +807,23 @@ TearDownOnMainThread(); } - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kEnableTracing)) { - base::FilePath trace_file = - base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( - switches::kEnableTracingOutput); - // If |trace_file| ends in a directory separator or is empty use a generated - // name in that directory (empty means current directory). - if (trace_file.empty() || trace_file.EndsWithSeparator()) - trace_file = trace_file.AppendASCII(GetDefaultTraceFilename()); - - // Wait for tracing to collect results from the renderers. - base::RunLoop run_loop; - TracingController::GetInstance()->StopTracing( - TracingControllerImpl::CreateFileEndpoint( - trace_file, base::BindOnce(&TraceStopTracingComplete, - run_loop.QuitClosure(), trace_file))); - run_loop.Run(); - } - PostRunTestOnMainThread(); // Sometimes tests initialize a storage partition and the initialization // schedules some tasks which need to be executed before finishing tests. // Run these tasks. content::RunAllPendingInMessageLoop(); + + // Update the trace output filename to include the test result. + StartupTracingController::GetInstance().SetDefaultBasename( + GetDefaultTraceBasename(TraceBasenameType::kWithTestStatus), + StartupTracingController::ExtensionType::kAppendAppropriate); + +#if defined(OS_ANDROID) + // On Android, browser main runner is not shut down, so stop trace recording + // here. + StartupTracingController::GetInstance().WaitUntilStopped(); +#endif } void BrowserTestBase::SetAllowNetworkAccessToHostResolutions() {
diff --git a/content/public/test/content_mock_cert_verifier.cc b/content/public/test/content_mock_cert_verifier.cc index 1aaf9087..6ce3e3a 100644 --- a/content/public/test/content_mock_cert_verifier.cc +++ b/content/public/test/content_mock_cert_verifier.cc
@@ -5,6 +5,7 @@ #include "content/public/test/content_mock_cert_verifier.h" #include "base/command_line.h" +#include "base/feature_list.h" #include "content/public/browser/network_service_instance.h" #include "content/public/common/content_switches.h" #include "content/public/common/network_service_util.h" @@ -26,12 +27,18 @@ int default_result) { verifier_->set_default_result(default_result); - // Set the default result as a flag in case the FeatureList has not been - // initialized yet and we don't know if network service will run out of - // process. - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kMockCertVerifierDefaultResultForTesting, - base::NumberToString(default_result)); + // If set_default_result is called before the FeatureList is available, add + // the command line flag since the network service may be running out of + // process. We don't want to set the command line flag otherwise since it can + // cause TSan errors. + if (base::FeatureList::GetInstance() == nullptr) { + // Set the default result as a flag in case the FeatureList has not been + // initialized yet and we don't know if network service will run out of + // process. + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kMockCertVerifierDefaultResultForTesting, + base::NumberToString(default_result)); + } if (IsInProcessNetworkService()) return;
diff --git a/content/public/test/fake_remote_frame.cc b/content/public/test/fake_remote_frame.cc index d4d61765..205a76a 100644 --- a/content/public/test/fake_remote_frame.cc +++ b/content/public/test/fake_remote_frame.cc
@@ -93,4 +93,6 @@ std::move(handle))); } +void FakeRemoteFrame::DetachAndDispose() {} + } // namespace content
diff --git a/content/public/test/fake_remote_frame.h b/content/public/test/fake_remote_frame.h index d886ef9a..a9b8a3e 100644 --- a/content/public/test/fake_remote_frame.h +++ b/content/public/test/fake_remote_frame.h
@@ -87,6 +87,7 @@ void DidUpdateFramePolicy(const blink::FramePolicy& frame_policy) override {} void UpdateOpener(const base::Optional<base::UnguessableToken>& opener_frame_token) override; + void DetachAndDispose() override; private: void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle);
diff --git a/content/public/test/test_renderer_host.cc b/content/public/test/test_renderer_host.cc index 6a4624d..c960d924 100644 --- a/content/public/test/test_renderer_host.cc +++ b/content/public/test/test_renderer_host.cc
@@ -169,6 +169,7 @@ // RenderViewHostTestHarness -------------------------------------------------- RenderViewHostTestHarness::~RenderViewHostTestHarness() { + DCHECK(!task_environment_) << "TearDown() was not called."; } NavigationController& RenderViewHostTestHarness::controller() {
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index e230aafc..4737f70a 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -787,8 +787,8 @@ BindGraphics(pp_instance(), 0); InvalidateRect(gfx::Rect()); - if (render_frame_) - render_frame_->PluginCrashed(module_->path(), module_->GetPeerProcessId()); + if (auto* host = GetPepperPluginInstanceHost()) + host->InstanceCrashed(module_->path(), module_->GetPeerProcessId()); } bool PepperPluginInstanceImpl::Initialize(
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 5393f991..b42f671 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -2138,13 +2138,6 @@ SyncSelectionIfRequired(); } -void RenderFrameImpl::PluginCrashed(const base::FilePath& plugin_path, - base::ProcessId plugin_pid) { - // TODO(jam): dispatch this IPC in RenderFrameHost and switch to use - // routing_id_ as a result. - Send(new FrameHostMsg_PluginCrashed(routing_id_, plugin_path, plugin_pid)); -} - #endif // BUILDFLAG(ENABLE_PLUGINS) void RenderFrameImpl::ScriptedPrint(bool user_initiated) {
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 96127a4..f55598f 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -332,10 +332,6 @@ // Informs the render view that a PPAPI plugin has changed selection. void PepperSelectionChanged(PepperPluginInstanceImpl* instance); - // Notification that the given plugin has crashed. - void PluginCrashed(const base::FilePath& plugin_path, - base::ProcessId plugin_pid); - #endif // BUILDFLAG(ENABLE_PLUGINS) void ScriptedPrint(bool user_initiated);
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index 8f12db28..9fb5c49c 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc
@@ -409,14 +409,7 @@ } bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) - IPC_MESSAGE_HANDLER(UnfreezableFrameMsg_DeleteProxy, OnDeleteProxy) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - - // Note: If |handled| is true, |this| may have been deleted. - return handled; + return false; } void RenderFrameProxy::OnAssociatedInterfaceRequest( @@ -437,11 +430,6 @@ return agent_scheduling_group_.Send(message); } -void RenderFrameProxy::OnDeleteProxy() { - DCHECK(web_frame_); - web_frame_->Detach(); -} - void RenderFrameProxy::ChildProcessGone() { crashed_ = true; compositing_helper_->ChildFrameGone(local_frame_size(),
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h index fd91c411..5e8323d5 100644 --- a/content/renderer/render_frame_proxy.h +++ b/content/renderer/render_frame_proxy.h
@@ -216,12 +216,6 @@ mojom::RenderFrameProxyHost* GetFrameProxyHost(); - // IPC handlers - void OnDeleteProxy(); - void OnCompositorFrameSwapped(const IPC::Message& message); - void OnEnforceInsecureRequestPolicy( - blink::mojom::InsecureRequestPolicy policy); - // mojom::RenderFrameProxy implementation: void EnableAutoResize(const gfx::Size& min_size, const gfx::Size& max_size) override; @@ -246,10 +240,6 @@ // The routing ID by which this RenderFrameProxy is known. const int routing_id_; - // The routing ID of the provisional RenderFrame (if any) that is meant to - // replace this RenderFrameProxy in the frame tree. - int provisional_frame_routing_id_; - // Stores the WebRemoteFrame we are associated with. blink::WebRemoteFrame* web_frame_ = nullptr;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 4a53c9a..903703fe 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -963,11 +963,18 @@ return render_thread->GetGpuFactories(); } -media::DecoderFactory* RendererBlinkPlatformImpl::GetMediaDecoderFactory() { +scoped_refptr<base::SingleThreadTaskRunner> +RendererBlinkPlatformImpl::MediaThreadTaskRunner() { auto* render_thread = RenderThreadImpl::current(); if (!render_thread) return nullptr; + return render_thread->GetMediaThreadTaskRunner(); +} + +media::DecoderFactory* RendererBlinkPlatformImpl::GetMediaDecoderFactory() { + auto* render_thread = RenderThreadImpl::current(); + DCHECK(!!render_thread); return render_thread->GetMediaDecoderFactory(); }
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h index 8f83462..b854f5b 100644 --- a/content/renderer/renderer_blink_platform_impl.h +++ b/content/renderer/renderer_blink_platform_impl.h
@@ -210,6 +210,7 @@ blink::MediaInspectorContext* inspector_context, scoped_refptr<base::SingleThreadTaskRunner> owner_task_runner) override; media::GpuVideoAcceleratorFactories* GetGpuFactories() override; + scoped_refptr<base::SingleThreadTaskRunner> MediaThreadTaskRunner() override; media::DecoderFactory* GetMediaDecoderFactory() override; void SetRenderingColorSpace(const gfx::ColorSpace& color_space) override; void SetActiveURL(const blink::WebURL& url,
diff --git a/content/test/data/dynamic1.html b/content/test/data/dynamic1.html index 07ff3365..52b7b8f 100644 --- a/content/test/data/dynamic1.html +++ b/content/test/data/dynamic1.html
@@ -4,7 +4,7 @@ <script type="text/javascript"> function OpenPopup() { // Create a new popup window - var oWnd = window.open('','MyPopupName','width=350,height=300',false); + var oWnd = window.open('','MyPopupName','width=350,height=300'); // Dynamically generate the HTML content for popup window var sHtml =
diff --git a/content/test/data/dynamic2.html b/content/test/data/dynamic2.html index 297c534..a2d069c0f 100644 --- a/content/test/data/dynamic2.html +++ b/content/test/data/dynamic2.html
@@ -4,7 +4,7 @@ <script type="text/javascript"> function OpenPopup() { // Create a new popup window - var oWnd = window.open('','MyPopupName','width=350,height=300',false); + var oWnd = window.open('','MyPopupName','width=350,height=300'); // Dynamically generate the HTML content for popup window var sHtml =
diff --git a/content/test/data/gpu/functional_files/context.js b/content/test/data/gpu/functional_files/context.js index 3e96f2d..17a8083 100644 --- a/content/test/data/gpu/functional_files/context.js +++ b/content/test/data/gpu/functional_files/context.js
@@ -28,7 +28,7 @@ // Only continue if WebGL is available and working. if (gl_context) { - gl_context.clearColor(0.0, 0.0, 0.0, 1.0); + gl_context.clearColor(0.0, 1.0, 0.0, 1.0); gl_context.enable(gl_context.DEPTH_TEST); gl_context.depthFunc(gl_context.LEQUAL); gl_context.clearDepth(1);
diff --git a/content/test/data/gpu/webgl-high-perf.html b/content/test/data/gpu/webgl-high-perf.html new file mode 100644 index 0000000..f7eab33 --- /dev/null +++ b/content/test/data/gpu/webgl-high-perf.html
@@ -0,0 +1,44 @@ +<html> +<head> +<script type="text/javascript"> +var gl_canvas; +var gl; + +function onLoad() { + gl_canvas = document.getElementById("glcanvas"); + gl_canvas.addEventListener("webglcontextlost", function(event) { + event.preventDefault(); + }, false); + gl_canvas.addEventListener("webglcontextrestored", setupWebGL, false); + + setupWebGL(); + + window.domAutomationController.reset = function() { + window.domAutomationController._loaded = false; + window.domAutomationController._succeeded = false; + window.domAutomationController._finished = false; + window.requestAnimationFrame(succeed); + }; + window.domAutomationController.send("LOADED"); +} + +function setupWebGL() { + // Initialize the GL context. + gl = gl_canvas.getContext("webgl", {powerPreference: "high-performance"}); + if (gl) { + gl.clearColor(0.0, 1.0, 0.0, 1.0); + gl.clearDepth(1); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + } +} + +function succeed() { + if (gl) + window.domAutomationController.send("SUCCESS"); +} +</script> +</head> +<body onload="onLoad()"> + <canvas id="glcanvas" width="640" height="480"></canvas> +</body> +</html>
diff --git a/content/test/data/isolated_base_origin_with_subframe.html.mock-http-headers b/content/test/data/isolated_base_origin_with_subframe.html.mock-http-headers index 5bc8f85..cb32287 100644 --- a/content/test/data/isolated_base_origin_with_subframe.html.mock-http-headers +++ b/content/test/data/isolated_base_origin_with_subframe.html.mock-http-headers
@@ -1,3 +1,3 @@ HTTP/1.1 200 OK Content-Type: text/html -Origin-Policy: allowed=(latest) +Origin-Agent-Cluster: ?1
diff --git a/content/test/gpu/gpu_tests/context_lost_integration_test.py b/content/test/gpu/gpu_tests/context_lost_integration_test.py index dc18720..6a3d471 100644 --- a/content/test/gpu/gpu_tests/context_lost_integration_test.py +++ b/content/test/gpu/gpu_tests/context_lost_integration_test.py
@@ -60,7 +60,7 @@ } else { query_result = document.querySelector('.feature-status-list'); } - for (let i=0; i < query_result.childElementCount; i++) { + for (let i = 0; i < query_result.childElementCount; i++) { let feature_status = query_result.children[i].textContent.split(': '); if (feature_status.length == 2 && feature_status[0] == feature_name) return feature_status[1]; @@ -69,6 +69,41 @@ } """ +vendor_id_query_script = """ + function GetActiveVendorId(for_hardware_gpu) { + let div; + if (for_hardware_gpu) { + div = document.querySelector('.basic-info-for-hardware-gpu-div'); + } else { + div = document.querySelector('#basic-info'); + } + let trs = div.getElementsByTagName('tr'); + let vendor_id = 0; + // The first four rows are "Initialization time", "In-process GPU", + // "Passthrough Command Decoder", and "Sandboxed". + for (let i = 4; i < trs.length; i++) { + let tds = trs[i].getElementsByTagName('td'); + let token = tds[0].textContent.trim(); + if (!token.startsWith('GPU')) + break; + if (i == 4 && token != 'GPU0') + break; + let gpu_string = tds[1].textContent.trim(); + let vendor_info = gpu_string.split(', ')[0].split('= '); + if (vendor_info.length != 2 || vendor_info[0] != 'VENDOR') + break; + let id = parseInt(vendor_info[1]); + if (vendor_id == 0) + vendor_id = id; + if (gpu_string.endsWith('*ACTIVE*')) { + vendor_id = id; + break; + } + } + return vendor_id; + } +""" + class ContextLostIntegrationTest(gpu_integration_test.GpuIntegrationTest): @@ -140,7 +175,9 @@ 'webgl2-multisampling-high-power-switch-loses-context.html'), ('ContextLost_MacWebGLPreserveDBHighPowerSwitchLosesContext', 'webgl2-preserve-db-high-power-switch-loses-context.html'), - ('GpuCrash_InfoForHardwareGpu', 'simple.html')) + ('GpuCrash_InfoForHardwareGpu', 'simple.html'), + ('GpuCrash_InfoForDualHardwareGpus', 'webgl-high-perf.html')) + for t in tests: yield (t[0], t[1], ('_' + t[0])) @@ -255,6 +292,16 @@ tab.Close() return status + def _GetActiveVendorId(self, for_hardware_gpu): + tab = self.tab.browser.tabs.New() + tab.Navigate('chrome:gpu', + script_to_evaluate_on_commit=vendor_id_query_script) + tab.WaitForJavaScriptCondition('window.gpuPagePopulated', timeout=10) + vid = (tab.EvaluateJavaScript('GetActiveVendorId(%s)' % + ('true' if for_hardware_gpu else 'false'))) + tab.Close() + return vid + def _WaitForTabAndCheckCompletion(self): tab = self.tab completed = _WaitForPageToFinish(tab) @@ -501,6 +548,33 @@ 'but got %s' % webgl_status_for_hardware_gpu) self._RestartBrowser('must restart after tests that kill the GPU process') + def _GpuCrash_InfoForDualHardwareGpus(self, test_path): + # Ensure that info displayed in chrome:gpu for hardware gpu is from + # the latest active GPU before the crash, after gpu process crashes three + # times and falls back to SwiftShader. + # Currently the test only works on Mac dual GPU bots. + if not self._IsDualGPUMacLaptop(): + logging.info('Skipping test because not running on dual-GPU Mac laptop') + return + self.RestartBrowserIfNecessaryWithArgs( + [cba.DISABLE_DOMAIN_BLOCKING_FOR_3D_APIS]) + active_vendor_id = self._GetActiveVendorId(False) + # Load WebGL content and switch to discrete GPU. + self._NavigateAndWaitForLoad(test_path) + new_active_vendor_id = self._GetActiveVendorId(False) + if not active_vendor_id or not new_active_vendor_id: + self.fail('Fail to query the active GPU vendor id from about:gpu') + # After three GPU crashes, check if the active vendor id for hardware GPU + # is the new_active_vendor_id. + self._KillGPUProcess(3, True) + active_vendor_id_for_hardware_gpu = self._GetActiveVendorId(True) + if not active_vendor_id_for_hardware_gpu: + self.fail('Fail to query the active GPU vendor id for hardware GPU') + if active_vendor_id_for_hardware_gpu != new_active_vendor_id: + self.fail('vendor id for hw GPU should be 0x%04x, got 0x%04x' % + (new_active_vendor_id, active_vendor_id_for_hardware_gpu)) + self._RestartBrowser('must restart after tests that kill the GPU process') + @classmethod def GetPlatformTags(cls, browser): tags = super(ContextLostIntegrationTest, cls).GetPlatformTags(browser)
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt index 175cbe943..e54ba223 100644 --- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -136,3 +136,4 @@ # Flaky hangs on Mac Debug NVIDIA, stalling the test suite for 40 minutes crbug.com/1161570 [ mac nvidia debug ] GpuCrash_InfoForHardwareGpu [ Skip ] +crbug.com/1161570 [ mac nvidia debug ] GpuCrash_InfoForDualHardwareGpus [ Skip ]
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn index a6507725..f595b21 100644 --- a/device/bluetooth/BUILD.gn +++ b/device/bluetooth/BUILD.gn
@@ -49,6 +49,13 @@ "socket.h", ] + if (is_chromeos || is_linux) { + sources += [ + "bluez/metrics_recorder.cc", + "bluez/metrics_recorder.h", + ] + } + deps = [ ":bluetooth", "//device/bluetooth/public/mojom:deprecated_experimental_interfaces",
diff --git a/device/bluetooth/adapter.cc b/device/bluetooth/adapter.cc index 0d204e93..50d07da9 100644 --- a/device/bluetooth/adapter.cc +++ b/device/bluetooth/adapter.cc
@@ -24,7 +24,20 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" +#if defined(OS_CHROMEOS) || defined(OS_LINUX) +#include "device/bluetooth/bluez/metrics_recorder.h" +#endif + namespace bluetooth { +namespace { + +const char kMojoReceivingPipeError[] = "Failed to create receiving DataPipe."; +const char kMojoSendingPipeError[] = "Failed to create sending DataPipe."; +#if defined(OS_CHROMEOS) || defined(OS_LINUX) +const char kCannotConnectToDeviceError[] = "Cannot connect to device."; +#endif + +} // namespace Adapter::Adapter(scoped_refptr<device::BluetoothAdapter> adapter) : adapter_(std::move(adapter)) { @@ -198,7 +211,7 @@ copyable_callback), base::BindOnce(&Adapter::OnConnectToServiceError, weak_ptr_factory_.GetWeakPtr(), copyable_callback, - "Cannot connect to device.")); + kCannotConnectToDeviceError)); #else OnConnectToServiceError(std::move(callback), "Device does not exist."); #endif @@ -400,7 +413,7 @@ if (result != MOJO_RESULT_OK) { socket->Disconnect(base::BindOnce( &Adapter::OnConnectToServiceError, weak_ptr_factory_.GetWeakPtr(), - std::move(callback), "Failed to create receiving DataPipe.")); + std::move(callback), kMojoReceivingPipeError)); return; } @@ -411,7 +424,7 @@ if (result != MOJO_RESULT_OK) { socket->Disconnect(base::BindOnce( &Adapter::OnConnectToServiceError, weak_ptr_factory_.GetWeakPtr(), - std::move(callback), "Failed to create sending DataPipe.")); + std::move(callback), kMojoSendingPipeError)); return; } @@ -429,6 +442,11 @@ std::move(receive_pipe_consumer_handle); connect_to_service_result->send_stream = std::move(send_pipe_producer_handle); std::move(callback).Run(std::move(connect_to_service_result)); + +#if defined(OS_CHROMEOS) || defined(OS_LINUX) + RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult::kSuccess); +#endif } void Adapter::OnConnectToServiceError( @@ -436,6 +454,26 @@ const std::string& message) { DLOG(ERROR) << "Failed to connect to service: '" << message << "'"; std::move(callback).Run(/*result=*/nullptr); + +#if defined(OS_CHROMEOS) || defined(OS_LINUX) + base::Optional<ConnectToServiceInsecurelyResult> result = + ExtractResultFromErrorString(message); + if (result) { + RecordConnectToServiceInsecurelyResult(*result); + } else if (message == kMojoSendingPipeError) { + RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult::kMojoSendingPipeError); + } else if (message == kMojoReceivingPipeError) { + RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult::kMojoReceivingPipeError); + } else if (message == kCannotConnectToDeviceError) { + RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult::kCouldNotConnectError); + } else { + RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult::kUnknownError); + } +#endif } void Adapter::OnCreateRfcommServiceInsecurely(
diff --git a/device/bluetooth/bluez/bluetooth_socket_bluez.cc b/device/bluetooth/bluez/bluetooth_socket_bluez.cc index 97b8cba..b3e404a 100644 --- a/device/bluetooth/bluez/bluetooth_socket_bluez.cc +++ b/device/bluetooth/bluez/bluetooth_socket_bluez.cc
@@ -18,6 +18,7 @@ #include "base/memory/ref_counted.h" #include "base/sequenced_task_runner.h" #include "base/single_thread_task_runner.h" +#include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/task_runner_util.h" #include "base/threading/scoped_blocking_call.h" @@ -301,11 +302,11 @@ DCHECK(ui_task_runner()->RunsTasksInCurrentSequence()); DCHECK(profile_); + const std::string error = base::StrCat({error_name, ": ", error_message}); LOG(WARNING) << profile_->object_path().value() - << ": Failed to connect profile: " << error_name << ": " - << error_message; + << ": Failed to connect profile: " << error; UnregisterProfile(); - std::move(error_callback).Run(error_message); + std::move(error_callback).Run(error); } void BluetoothSocketBlueZ::AdapterPresentChanged(BluetoothAdapter* adapter,
diff --git a/device/bluetooth/bluez/metrics_recorder.cc b/device/bluetooth/bluez/metrics_recorder.cc new file mode 100644 index 0000000..b5f04010 --- /dev/null +++ b/device/bluetooth/bluez/metrics_recorder.cc
@@ -0,0 +1,84 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/bluetooth/bluez/metrics_recorder.h" + +#include "base/metrics/histogram_functions.h" +#include "base/stl_util.h" + +namespace bluetooth { +namespace { + +// Note: These values must stay in sync with BlueZ's error.c file. +const char kBlueZInvalidArgumentsError[] = "org.bluez.Error.InvalidArguments"; +const char kBlueZInProgressError[] = "org.bluez.Error.InProgress"; +const char kBlueZAlreadyExistsError[] = "org.bluez.Error.AlreadyExists"; +const char kBlueZNotSupportedError[] = "org.bluez.Error.NotSupported"; +const char kBlueZNotConnectedError[] = "org.bluez.Error.NotConnected"; +const char kBlueZAlreadyConnectedError[] = "org.bluez.Error.AlreadyConnected"; +const char kBlueZNotAvailableError[] = "org.bluez.Error.NotAvailable"; +const char kBlueZDoesNotExistError[] = "org.bluez.Error.DoesNotExist"; +const char kBlueZNotAuthorizedError[] = "org.bluez.Error.NotAuthorized"; +const char kBlueZNotPermittedError[] = "org.bluez.Error.NotPermitted"; +const char kBlueZNoSuchAdapterError[] = "org.bluez.Error.NoSuchAdapter"; +const char kBlueZAgentNotAvailableError[] = "org.bluez.Error.AgentNotAvailable"; +const char kBlueZNotReadyError[] = "org.bluez.Error.NotReady"; +const char kBlueZFailedError[] = "org.bluez.Error.Failed"; + +} // namespace + +base::Optional<ConnectToServiceInsecurelyResult> ExtractResultFromErrorString( + const std::string& error_string) { + if (base::Contains(error_string, kBlueZInvalidArgumentsError)) + return ConnectToServiceInsecurelyResult::kInvalidArgumentsError; + + if (base::Contains(error_string, kBlueZInProgressError)) + return ConnectToServiceInsecurelyResult::kInProgressError; + + if (base::Contains(error_string, kBlueZAlreadyExistsError)) + return ConnectToServiceInsecurelyResult::kAlreadyExistsError; + + if (base::Contains(error_string, kBlueZNotSupportedError)) + return ConnectToServiceInsecurelyResult::kNotSupportedError; + + if (base::Contains(error_string, kBlueZNotConnectedError)) + return ConnectToServiceInsecurelyResult::kNotConnectedError; + + if (base::Contains(error_string, kBlueZAlreadyConnectedError)) + return ConnectToServiceInsecurelyResult::kAlreadyConnectedError; + + if (base::Contains(error_string, kBlueZNotAvailableError)) + return ConnectToServiceInsecurelyResult::kNotAvailableError; + + if (base::Contains(error_string, kBlueZDoesNotExistError)) + return ConnectToServiceInsecurelyResult::kDoesNotExistError; + + if (base::Contains(error_string, kBlueZNotAuthorizedError)) + return ConnectToServiceInsecurelyResult::kNotAuthorizedError; + + if (base::Contains(error_string, kBlueZNotPermittedError)) + return ConnectToServiceInsecurelyResult::kNotPermittedError; + + if (base::Contains(error_string, kBlueZNoSuchAdapterError)) + return ConnectToServiceInsecurelyResult::kNoSuchAdapterError; + + if (base::Contains(error_string, kBlueZAgentNotAvailableError)) + return ConnectToServiceInsecurelyResult::kAgentNotAvailableError; + + if (base::Contains(error_string, kBlueZNotReadyError)) + return ConnectToServiceInsecurelyResult::kNotReadyError; + + if (base::Contains(error_string, kBlueZFailedError)) + return ConnectToServiceInsecurelyResult::kFailedError; + + return base::nullopt; +} + +void RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult result) { + base::UmaHistogramEnumeration( + "Bluetooth.Linux.ConnectToServiceInsecurelyResult", result); +} + +} // namespace bluetooth
diff --git a/device/bluetooth/bluez/metrics_recorder.h b/device/bluetooth/bluez/metrics_recorder.h new file mode 100644 index 0000000..9eee01c --- /dev/null +++ b/device/bluetooth/bluez/metrics_recorder.h
@@ -0,0 +1,47 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef DEVICE_BLUETOOTH_BLUEZ_METRICS_RECORDER_H_ +#define DEVICE_BLUETOOTH_BLUEZ_METRICS_RECORDER_H_ + +#include "base/optional.h" + +namespace bluetooth { + +// Result types for ConnectToServiceInsecurely(). Numerical values are used for +// metrics and should not be changed or reused. +enum class ConnectToServiceInsecurelyResult { + kSuccess = 0, + kInvalidArgumentsError = 1, + kInProgressError = 2, + kAlreadyExistsError = 3, + kNotSupportedError = 4, + kNotConnectedError = 5, + kAlreadyConnectedError = 6, + kNotAvailableError = 7, + kDoesNotExistError = 8, + kNotAuthorizedError = 9, + kNotPermittedError = 10, + kNoSuchAdapterError = 11, + kAgentNotAvailableError = 12, + kNotReadyError = 13, + kFailedError = 14, + kMojoReceivingPipeError = 15, + kMojoSendingPipeError = 16, + kCouldNotConnectError = 17, + kUnknownError = 18, + kMaxValue = kUnknownError +}; + +// Returns the ConnectToServiceInsecurelyResult type associated with +// |error_string|, or null if no result could be found. +base::Optional<ConnectToServiceInsecurelyResult> ExtractResultFromErrorString( + const std::string& error_string); + +void RecordConnectToServiceInsecurelyResult( + ConnectToServiceInsecurelyResult result); + +} // namespace bluetooth + +#endif // DEVICE_BLUETOOTH_BLUEZ_METRICS_RECORDER_H_
diff --git a/docs/testing/regression-test-selection.md b/docs/testing/regression_test_selection.md similarity index 75% rename from docs/testing/regression-test-selection.md rename to docs/testing/regression_test_selection.md index 4f1417b..1ceb7e0 100644 --- a/docs/testing/regression-test-selection.md +++ b/docs/testing/regression_test_selection.md
@@ -25,11 +25,16 @@ [source_set](/build/config/BUILDCONFIG.gn) and [test](/testing/test.gni) GN targets. -## Known failure mode +## Known failure modes -Consider a test file A that contains unit tests, as well as some variables +There are not known to be many instances of these failure modes in the codebase. +Those that are known are never excluded by our model. + +- **Shared state in test files**: Consider a test file A that contains unit tests, as well as some variables used in another file B. When our RTS strategy excludes A, but not B, a compilation error will occur. +- **main() defined in test files**: A test file contains tests and the `main()` function for the entire suite. +When it is excluded, the whole suite fails to compile. ## Design Docs
diff --git a/docs/webui_explainer.md b/docs/webui_explainer.md index f62e208..cc01a79 100644 --- a/docs/webui_explainer.md +++ b/docs/webui_explainer.md
@@ -883,28 +883,34 @@ Chrome's sandbox. To make sure that the special powers granted to WebUI pages are safe, WebUI pages are restricted in what they can do: -* WebUI pages cannot embed http/https resources or frames +* WebUI pages cannot embed http/https resources * WebUI pages cannot issue http/https fetches In the rare case that a WebUI page really needs to include web content, the safe -way to do this is by using a `<webview>` tag. Using a `<webview>` tag is more -secure than using an iframe for multiple reasons, even if Site Isolation and -out-of-process iframes keep the web content out of the privileged WebUI process. +way to do this is by using an `<iframe>` tag. Chrome's security model gives +process isolation between the WebUI and the web content. However, some extra +precautions need to be taken, because there are properties of the page that are +accessible cross-origin and malicious code can take advantage of such data to +attack the WebUI. Here are some things to keep in mind: -First, the content inside the `<webview>` tag has a much reduced attack surface, -since it does not have a window reference to its embedder or any other frames. -Only postMessage channel is supported, and this needs to be initiated by the -embedder, not the guest. +* The WebUI page can receive postMessage payloads from the web and should + ensure it verifies any messages as they are not trustworthy. +* The entire frame tree is visible to the embedded web content, including + ancestor origins. +* The web content runs in the same StoragePartition and Profile as the WebUI, + which reflect where the WebUI page was loaded (e.g., the default profile, + Incognito, etc). The corresponding user credentials will thus be available to + the web content inside the WebUI, possibly showing the user as signed in. -Second, the content inside the `<webview>` tag is hosted in a separate -StoragePartition. Thus, cookies and other persistent storage for both the WebUI -page and other browser tabs are inaccessible to it. +Note: WebUIs have a default Content Security Policy which disallows embedding +any frames. If you want to include any web content in an <iframe> you will need +to update the policy for your WebUI. When doing so, allow only known origins and +avoid making the policy more permissive than strictly necessary. -This greater level of isolation makes it safer to load possibly untrustworthy or -compromised web content, reducing the risk of sandbox escapes. - -For an example of switching from iframe to webview tag see -https://crrev.com/c/710738. +Alternatively, a `<webview>` tag can be used, which runs in a separate +StoragePartition, a separate frame tree, and restricts postMessage communication +by default. However, `<webview>` does not support Site Isolation and +therefore it is not advisable to use for any sensitive content. ## See also
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn index 85f6363..21b0b3ae 100644 --- a/extensions/browser/api/BUILD.gn +++ b/extensions/browser/api/BUILD.gn
@@ -136,9 +136,7 @@ # TODO(crbug/1158984): as above, remove these deps. public_deps += [ - "//extensions/browser/api/cec_private", "//extensions/browser/api/diagnostics", - "//extensions/browser/api/virtual_keyboard", "//extensions/browser/api/vpn_provider", "//extensions/browser/api/webcam_private", ] @@ -209,7 +207,11 @@ ] if (is_chromeos_ash) { - public_deps += [ "//extensions/browser/api/clipboard" ] + public_deps += [ + "//extensions/browser/api/cec_private", + "//extensions/browser/api/clipboard", + "//extensions/browser/api/virtual_keyboard", + ] } }
diff --git a/extensions/browser/api/cec_private/BUILD.gn b/extensions/browser/api/cec_private/BUILD.gn index 7b549fb..ff36c3e 100644 --- a/extensions/browser/api/cec_private/BUILD.gn +++ b/extensions/browser/api/cec_private/BUILD.gn
@@ -13,7 +13,11 @@ "cec_private_api.h", ] - deps = [ "//extensions/common/api" ] + deps = [ + "//chromeos/dbus", + "//extensions/common", + "//extensions/common/api", + ] public_deps = [ "//extensions/browser:browser_sources" ] }
diff --git a/extensions/browser/api/virtual_keyboard/BUILD.gn b/extensions/browser/api/virtual_keyboard/BUILD.gn index 0c3a216..c66ebcf 100644 --- a/extensions/browser/api/virtual_keyboard/BUILD.gn +++ b/extensions/browser/api/virtual_keyboard/BUILD.gn
@@ -17,6 +17,7 @@ "//build:chromeos_buildflags", "//extensions/browser/api/virtual_keyboard_private", "//extensions/common/api", + "//ui/base/ime/chromeos", ] public_deps = [ "//extensions/browser:browser_sources" ]
diff --git a/extensions/browser/extension_service_workers.md b/extensions/browser/extension_service_workers.md new file mode 100644 index 0000000..f919a19 --- /dev/null +++ b/extensions/browser/extension_service_workers.md
@@ -0,0 +1,111 @@ +# Extension layer/service worker interactions +An extension background is the context that an extension runs on. It allows +extensions to react to events or messages with specified instructions. Up until +Manifest V2, there were two types of extension background pages, persistent +background pages and non-persistent background pages. As part of Manifest V3, we +are migrating extensions from the persistent/non-persistent background pages to +service workers. Service worker is a web platform feature that forms the basis +of app-like capabilities such as offline support, push notifications, and +background sync. A service worker is an event-driven JavaScript program that +runs in a worker thread. For a more detailed +explanation, see the [Service Workers documentation](https://chromium.googlesource.com/chromium/src/+/HEAD/content/browser/service_worker/README.md). + +This document describes the assumptions the //extensions layer makes when +relying on the service worker layer for registering/unregistering/startinga +service worker or ensuring the service worker’s liveness. + +## Registration +When adding/loading an extension, `ExtensionRegistrar::ActivateExtension` is +called which results in calling `ServiceWorkerTaskQueue::ActivateExtension` +which calls `ServiceWorkerContext::RegisterServiceWorker`. During registration, +[`script_url`](https://source.chromium.org/chromium/chromium/src/+/77dcc35a2a0b98d3913148149496b8dd0d3464cc:content/public/browser/service_worker_context.h;l=125) is set to the URL corresponding to the relative path from +manifest.json's "background.service_worker" and scope is set to the extension +root, i.e., chrome-extension://<extension_id>/. + +When registering the service worker, the //extensions layer relies on the +content layer’s guarantee that the registration is completed. +`OnRegistrationStored` is the first observer function that can guarantee +`StartWorkerForScope` can find the registration. After +`ServiceWorkerContextObserver::OnRegistrationStored`, +`ServiceWorkerContext::StartWorkerForScope` should be able to find the +registration. + +## Unregistration +When an extension is removed/disabled/terminated, +`ExtensionRegistrar::DeactivateExtension` is called which will call +`ServiceWorkerTaskQueue::DeactivateExtension`. This will result in unregistering +the service worker, by calling `ServiceWorkerContext::UnregisterServiceWorker`. + +## Registration/Unregistration failure +`DidRegisterServiceWorker` might fail, due to a few reasons: bad disk state, +invalid service worker script. The recovery steps would depend on the use case. + +`DidUnregisterServiceWorker` failure is rare because it does not involve any +user-provided JS code. + +When `DidRegisterServiceWorker/DidUnregisterServiceWorker` fails due to a disk +error, the SW layer will try to wipe the whole SW database as the current +implementation considers it a critical error. + +## Starting the service worker +A service worker is started when a pending task (e.g. an event dispatch) is run. +A pending task is run only when all of the following conditions are met: +- Service worker registration has completed. +- Call to `ServiceWorkerContext::StartWorkerForScope` has returned. +- Worker thread (in the renderer) has seen +`DidStartServiceWorkerContextOnWorkerThread`. + +ServiceWorkerTaskQueue starts a service worker via `StartWorkerForScope`. +We note that, in the current code, `StartWorkerForScope` should be called every +time before asking the worker to do something instead of relying on +`ServiceWorkerContextObserver::OnVersionStoppedRunning`. +The reason is that `OnVersionStoppedRunning` is called after the worker thread +is actually terminated. As a result, we can not rely on `OnVersionStoppedRunning` +to determine worker liveness. There are more fine-grained running status in the +content layer: RUNNING, STOPPING and STOPPED. The listener is called when the +worker’s state becomes STOPPED. When an event is dispatched to the worker, it +should not be done when the worker is in STOPPPING state. + +The flow of dispatching an event to a service worker is + +1- Calling `StartWorkerForScope` regardless of its running status, + +2- Dispatching an event to a service worker inside of the callback triggered +from `StartWorkerForScope` synchronously. + +In this way, we do not have to track whether the worker is running or not. + +There are several possible reasons for `StartWorkerForScope` failure, such as +process allocation failure, timeout of the script evaluation, and disk +corruption. + + +## Notifications +When starting a service worker, the //extensions layer wait for readiness +notification from both the browser process and the renderer process. In the +current code, after receiving both notifications and before +`OnVersionStoppedRunning`, the //extensions layer assume that the SW is alive +and can dispatch events to an extension service worker. As explained above, we +should call `StartWorkerForScope` every time before asking the worker to do +something instead of relying on `OnVersionStoppedRunning`. We plan to fix this +in our code. Bug [1162193](https://bugs.chromium.org/p/chromium/issues/detail?id=1162193) tracks this fix. + +## Service worker’s liveness +The //extensions layer rely on the service worker layer to ensure the service +worker’s liveness. We use EventAck IPC to ensure +that the service worker is alive while an event is dispatched. This is performed +in two steps: + +1- An event is dispatched from the browser process to the renderer. + +2- Renderer responds with EventAck to the browser process. + +We ensure that between step 1 and step 2, we do not consider the service worker +as "inactive". We achieve this with workers, i.e., we call +`ServiceWorkerContext::StartingExternalRequest` on step 1, and then we call +`ServiceWorkerContext::FinishedExternalRequest` after step 2. + +It is guaranteed that the worker will not be stopped between step 1 and step 2, +as long as we use `ServiceWorkerContext::StartingExternalRequest` and +`ServiceWorkerContext::FinishedExternalRequest`. The external request is a +mechanism to keep the worker alive.
diff --git a/gin/function_template.h b/gin/function_template.h index 3f6a1dd..2c13d41 100644 --- a/gin/function_template.h +++ b/gin/function_template.h
@@ -248,9 +248,8 @@ v8::Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New( isolate, &internal::Dispatcher<Sig>::DispatchToCallback, - ConvertToV8<v8::Local<v8::External>>(isolate, - holder->GetHandle(isolate))); - tmpl->RemovePrototype(); + ConvertToV8<v8::Local<v8::External>>(isolate, holder->GetHandle(isolate)), + v8::Local<v8::Signature>(), 0, v8::ConstructorBehavior::kThrow); return tmpl; }
diff --git a/gin/gin_features.cc b/gin/gin_features.cc index b200a04..570eaef1 100644 --- a/gin/gin_features.cc +++ b/gin/gin_features.cc
@@ -50,4 +50,8 @@ const base::Feature kV8TurboDirectHeapAccess{"V8TurboDirectHeapAccess", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enables fallback to a breadth-first regexp engine on excessive backtracking. +const base::Feature kV8ExperimentalRegexpEngine{ + "V8ExperimentalRegexpEngine", base::FEATURE_ENABLED_BY_DEFAULT}; + } // namespace features
diff --git a/gin/gin_features.h b/gin/gin_features.h index 0e2b51c8..69bc3b90 100644 --- a/gin/gin_features.h +++ b/gin/gin_features.h
@@ -21,6 +21,7 @@ GIN_EXPORT extern const base::Feature kV8NoReclaimUnmodifiedWrappers; GIN_EXPORT extern const base::Feature kV8LocalHeaps; GIN_EXPORT extern const base::Feature kV8TurboDirectHeapAccess; +GIN_EXPORT extern const base::Feature kV8ExperimentalRegexpEngine; } // namespace features
diff --git a/gin/modules/console.cc b/gin/modules/console.cc index 8786392b..7e3087f 100644 --- a/gin/modules/console.cc +++ b/gin/modules/console.cc
@@ -29,9 +29,9 @@ // static void Console::Register(v8::Isolate* isolate, v8::Local<v8::ObjectTemplate> templ) { - v8::Local<v8::FunctionTemplate> log_templ = - v8::FunctionTemplate::New(isolate, Log); - log_templ->RemovePrototype(); + v8::Local<v8::FunctionTemplate> log_templ = v8::FunctionTemplate::New( + isolate, Log, v8::Local<v8::Value>(), v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); templ->Set(StringToSymbol(isolate, "log"), log_templ); }
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc index 4174fd9..3967c18d 100644 --- a/gin/v8_initializer.cc +++ b/gin/v8_initializer.cc
@@ -288,6 +288,16 @@ v8::V8::SetFlagsFromString(no_direct_access, sizeof(no_direct_access) - 1); } + if (!base::FeatureList::IsEnabled(features::kV8ExperimentalRegexpEngine)) { + // The --enable-experimental-regexp-engine-on-excessive-backtracks flag is + // enabled by default, so we need to explicitly disable it if + // kV8ExperimentalRegexpEngine is disabled. + static constexpr char no_experimental_regexp_engine[] = + "--no-enable-experimental-regexp-engine-on-excessive-backtracks"; + v8::V8::SetFlagsFromString(no_experimental_regexp_engine, + sizeof(no_experimental_regexp_engine) - 1); + } + if (IsolateHolder::kStrictMode == mode) { static const char use_strict[] = "--use_strict"; v8::V8::SetFlagsFromString(use_strict, sizeof(use_strict) - 1);
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index 37c61d0..94d05ec 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -3675,6 +3675,18 @@ "features": [ "disable_accelerated_vp9_decode" ] + }, + { + "id": 364, + "cr_bugs": [1161215, 1160217], + "description": "Software overlays fail to work reliably on AMD devices", + "os": { + "type": "win" + }, + "vendor_id": "0x1002", + "features": [ + "disable_direct_composition_sw_video_overlays" + ] } ] }
diff --git a/gpu/config/gpu_info.cc b/gpu/config/gpu_info.cc index e989baa..9a55d9b 100644 --- a/gpu/config/gpu_info.cc +++ b/gpu/config/gpu_info.cc
@@ -238,6 +238,10 @@ return gpu.vendor_id != 0 || !gl_vendor.empty(); } +bool GPUInfo::UsesSwiftShader() const { + return gl_renderer.find("SwiftShader") != std::string::npos; +} + void GPUInfo::EnumerateFields(Enumerator* enumerator) const { struct GPUInfoKnownFields { base::TimeDelta initialization_time;
diff --git a/gpu/config/gpu_info.h b/gpu/config/gpu_info.h index 1589fee9..6b69e32 100644 --- a/gpu/config/gpu_info.h +++ b/gpu/config/gpu_info.h
@@ -283,6 +283,8 @@ bool IsInitialized() const; + bool UsesSwiftShader() const; + // The amount of time taken to get from the process starting to the message // loop being pumped. base::TimeDelta initialization_time;
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt index a88885a..551650c2 100644 --- a/gpu/config/gpu_workaround_list.txt +++ b/gpu/config/gpu_workaround_list.txt
@@ -27,6 +27,7 @@ disable_delayed_copy_nv12 disable_depth_texture disable_direct_composition +disable_direct_composition_sw_video_overlays disable_direct_composition_video_overlays disable_discard_framebuffer disable_dual_source_blending_support
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc index 78580cd..7db47ff 100644 --- a/gpu/ipc/service/gpu_init.cc +++ b/gpu/ipc/service/gpu_init.cc
@@ -608,6 +608,10 @@ #if defined(OS_WIN) if (gpu_feature_info_.IsWorkaroundEnabled(DISABLE_DECODE_SWAP_CHAIN)) gl::DirectCompositionSurfaceWin::DisableDecodeSwapChain(); + if (gpu_feature_info_.IsWorkaroundEnabled( + DISABLE_DIRECT_COMPOSITION_SW_VIDEO_OVERLAYS)) { + gl::DirectCompositionSurfaceWin::DisableSoftwareOverlays(); + } #endif return true;
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc index 1eb384ea..af6718c 100644 --- a/headless/lib/browser/headless_web_contents_impl.cc +++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -177,6 +177,13 @@ ->block_new_web_contents(); } + void RequestToLockMouse(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) override { + web_contents->GotResponseToLockMouseRequest( + blink::mojom::PointerLockResult::kSuccess); + } + private: HeadlessBrowserImpl* browser() { return headless_web_contents_->browser(); }
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index fba85473..fd8f7c2 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -887,6 +887,10 @@ includable_only: true } builders { + name: "chromium/try/ios-angle-try-intel" + includable_only: true + } + builders { name: "chromium/try/ios-device" includable_only: true }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index d8d94921..1218a18 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -42,6 +42,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -93,6 +97,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -144,6 +152,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -195,6 +207,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -246,6 +262,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -297,6 +317,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -348,6 +372,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -399,6 +427,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -450,6 +482,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -501,6 +537,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -552,6 +592,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -603,6 +647,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -654,6 +702,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -705,6 +757,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -756,6 +812,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -807,6 +867,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -858,6 +922,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -909,6 +977,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -960,6 +1032,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1011,6 +1087,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1062,6 +1142,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1113,6 +1197,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1164,6 +1252,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1215,6 +1307,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1266,6 +1362,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1317,6 +1417,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1368,6 +1472,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1419,6 +1527,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1470,6 +1582,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1521,6 +1637,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1572,6 +1692,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1623,6 +1747,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1674,6 +1802,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1725,6 +1857,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1776,6 +1912,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1827,6 +1967,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1878,6 +2022,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1929,6 +2077,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -1980,6 +2132,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2031,6 +2187,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2082,6 +2242,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2133,6 +2297,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2184,6 +2352,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2235,6 +2407,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2286,6 +2462,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2337,6 +2517,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2388,6 +2572,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2439,6 +2627,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2490,6 +2682,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2541,6 +2737,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2590,6 +2790,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2639,6 +2843,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2690,6 +2898,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2741,6 +2953,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2792,6 +3008,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2843,6 +3063,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2894,6 +3118,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2945,6 +3173,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -2996,6 +3228,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3047,6 +3283,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3098,6 +3338,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3149,6 +3393,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3200,6 +3448,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3251,6 +3503,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3302,6 +3558,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3353,6 +3613,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3404,6 +3668,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3455,6 +3723,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3506,6 +3778,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3557,6 +3833,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3608,6 +3888,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3659,6 +3943,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3710,6 +3998,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3761,6 +4053,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3812,6 +4108,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3863,6 +4163,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3914,6 +4218,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -3965,6 +4273,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4016,6 +4328,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4067,6 +4383,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4116,6 +4436,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4165,6 +4489,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4214,6 +4542,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4265,6 +4597,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4316,6 +4652,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4367,6 +4707,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4418,6 +4762,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4469,6 +4817,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4520,6 +4872,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4571,6 +4927,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4622,6 +4982,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4673,6 +5037,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4724,6 +5092,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4775,6 +5147,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4826,6 +5202,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4875,6 +5255,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4924,6 +5308,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -4975,6 +5363,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5026,6 +5418,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5077,6 +5473,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5128,6 +5528,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5179,6 +5583,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5230,6 +5638,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5281,6 +5693,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5331,6 +5747,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5382,6 +5802,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5433,6 +5857,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5484,6 +5912,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5535,6 +5967,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5586,6 +6022,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5637,6 +6077,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5687,6 +6131,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5737,6 +6185,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5788,6 +6240,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5839,6 +6295,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5890,6 +6350,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5941,6 +6405,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -5992,6 +6460,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6043,6 +6515,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6094,6 +6570,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6145,6 +6625,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6196,6 +6680,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6247,6 +6735,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6298,6 +6790,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6349,6 +6845,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6400,6 +6900,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6451,6 +6955,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6502,6 +7010,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6553,6 +7065,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6604,6 +7120,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6655,6 +7175,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6706,6 +7230,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6757,6 +7285,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6808,6 +7340,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6859,6 +7395,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6910,6 +7450,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -6961,6 +7505,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7012,6 +7560,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7063,6 +7615,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7114,6 +7670,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7165,6 +7725,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7216,6 +7780,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7267,6 +7835,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7318,6 +7890,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7369,6 +7945,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7420,6 +8000,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7471,6 +8055,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7522,6 +8110,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7573,6 +8165,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7624,6 +8220,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7675,6 +8275,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7726,6 +8330,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7777,6 +8385,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7828,6 +8440,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -7880,7 +8496,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -7935,7 +8551,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -7990,7 +8606,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -8044,6 +8660,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8095,6 +8715,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8146,6 +8770,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8197,6 +8825,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8247,6 +8879,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8297,6 +8933,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8346,6 +8986,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8396,6 +9040,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8445,6 +9093,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8494,6 +9146,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8543,7 +9199,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -8597,6 +9253,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8648,6 +9308,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8699,6 +9363,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8750,6 +9418,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8801,6 +9473,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8850,6 +9526,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8901,6 +9581,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -8952,6 +9636,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9003,6 +9691,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9054,6 +9746,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9105,6 +9801,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9156,6 +9856,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9205,6 +9909,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9256,6 +9964,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9307,6 +10019,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9358,6 +10074,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9409,6 +10129,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9460,6 +10184,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9511,6 +10239,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9561,7 +10293,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -9614,7 +10346,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -9668,6 +10400,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9719,6 +10455,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9770,6 +10510,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9821,6 +10565,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9872,6 +10620,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9923,6 +10675,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -9974,6 +10730,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10025,6 +10785,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10076,6 +10840,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10127,6 +10895,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10178,6 +10950,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10229,6 +11005,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10279,6 +11059,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10330,6 +11114,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10381,6 +11169,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10432,6 +11224,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10484,7 +11280,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -10538,6 +11334,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10589,6 +11389,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10640,6 +11444,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10691,6 +11499,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10742,6 +11554,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10793,6 +11609,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10844,6 +11664,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10895,6 +11719,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10946,6 +11774,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -10997,6 +11829,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11048,6 +11884,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11099,6 +11939,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11149,6 +11993,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11200,6 +12048,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11251,6 +12103,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11302,6 +12158,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11353,6 +12213,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11404,6 +12268,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11455,6 +12323,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11506,6 +12378,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11557,6 +12433,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11608,6 +12488,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11659,6 +12543,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11710,6 +12598,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11761,6 +12653,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11812,6 +12708,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11863,6 +12763,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11914,6 +12818,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -11965,6 +12873,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12016,6 +12928,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12070,6 +12986,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12124,6 +13044,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12175,6 +13099,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12226,6 +13154,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12277,6 +13209,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12329,7 +13265,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -12383,6 +13319,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12434,6 +13374,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12485,6 +13429,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12535,6 +13483,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12586,7 +13538,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -12639,6 +13591,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12689,6 +13645,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12739,6 +13699,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12789,6 +13753,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12839,6 +13807,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12889,6 +13861,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12940,6 +13916,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -12991,6 +13971,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13042,6 +14026,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13093,6 +14081,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13144,6 +14136,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13195,6 +14191,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13246,6 +14246,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13297,6 +14301,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13348,6 +14356,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13399,6 +14411,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13450,6 +14466,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13501,6 +14521,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13552,6 +14576,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13603,6 +14631,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13654,6 +14686,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13704,6 +14740,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13754,6 +14794,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13805,7 +14849,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -13859,7 +14903,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -13913,6 +14957,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -13964,6 +15012,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14014,6 +15066,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14065,6 +15121,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14116,6 +15176,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14167,6 +15231,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14218,6 +15286,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14269,6 +15341,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14320,6 +15396,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14370,6 +15450,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14420,6 +15504,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14470,6 +15558,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14521,6 +15613,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14572,6 +15668,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14623,6 +15723,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14674,6 +15778,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14725,6 +15833,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14776,6 +15888,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14827,6 +15943,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14878,6 +15998,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14929,6 +16053,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -14980,6 +16108,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15031,6 +16163,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15082,6 +16218,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15133,6 +16273,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15184,6 +16328,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15235,6 +16383,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15286,6 +16438,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15337,6 +16493,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15388,6 +16548,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15439,6 +16603,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15490,6 +16658,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15542,7 +16714,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -15597,7 +16769,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -15651,6 +16823,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15702,6 +16878,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15753,6 +16933,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15804,6 +16988,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15855,6 +17043,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15906,6 +17098,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -15957,6 +17153,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16008,6 +17208,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16056,6 +17260,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16107,6 +17315,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16158,6 +17370,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16209,6 +17425,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16260,6 +17480,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16311,6 +17535,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16362,6 +17590,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16413,6 +17645,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16464,6 +17700,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16515,6 +17755,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16565,6 +17809,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16617,7 +17865,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -16672,7 +17920,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -16727,7 +17975,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -16782,7 +18030,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -16836,6 +18084,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16887,6 +18139,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16938,6 +18194,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -16989,6 +18249,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17040,6 +18304,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17091,6 +18359,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17142,6 +18414,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17193,6 +18469,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17244,6 +18524,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17295,6 +18579,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17346,6 +18634,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17397,6 +18689,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17448,6 +18744,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17499,6 +18799,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17550,6 +18854,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17602,7 +18910,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -17656,6 +18964,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17707,6 +19019,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17758,6 +19074,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17809,6 +19129,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17860,6 +19184,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17911,6 +19239,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -17963,7 +19295,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18018,7 +19350,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18073,7 +19405,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18128,7 +19460,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18183,7 +19515,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18238,7 +19570,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18292,6 +19624,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18343,6 +19679,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18394,6 +19734,122 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { + name: "ios-angle-builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:ios-angle-builder" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.ci" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.angle\",\"perf_dashboard_machine_group\":\"ChromiumANGLE\",\"recipe\":\"angle_chromium\",\"xcode_build_version\":\"12a7209\"}" + execution_timeout_secs: 10800 + caches { + name: "xcode_ios_12a7209" + path: "xcode_ios_12a7209.app" + } + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { + name: "ios-angle-intel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.angle\",\"perf_dashboard_machine_group\":\"ChromiumANGLE\",\"recipe\":\"angle_chromium\"}" + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18448,7 +19904,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18504,6 +19960,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18557,6 +20017,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18612,7 +20076,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18669,7 +20133,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18725,6 +20189,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18779,7 +20247,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18835,6 +20303,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -18889,7 +20361,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -18946,7 +20418,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19003,7 +20475,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19060,7 +20532,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19117,7 +20589,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19174,7 +20646,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19228,6 +20700,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19279,6 +20755,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19330,6 +20810,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19381,6 +20865,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19432,6 +20920,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19483,6 +20975,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19535,7 +21031,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19589,6 +21085,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19640,6 +21140,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19692,7 +21196,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19746,6 +21250,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -19798,7 +21306,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19853,7 +21361,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19908,7 +21416,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -19963,7 +21471,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20017,6 +21525,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20069,7 +21581,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20123,6 +21635,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20175,7 +21691,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20230,7 +21746,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20285,7 +21801,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20340,7 +21856,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20395,7 +21911,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20449,6 +21965,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20501,7 +22021,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20555,6 +22075,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20607,7 +22131,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20661,6 +22185,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20711,6 +22239,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20762,6 +22294,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20813,6 +22349,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20864,6 +22404,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -20916,7 +22460,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -20971,7 +22515,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -21026,7 +22570,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -21080,6 +22624,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21131,6 +22679,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21182,6 +22734,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21233,6 +22789,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21284,6 +22844,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21335,6 +22899,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21386,6 +22954,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21437,6 +23009,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21488,6 +23064,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21540,7 +23120,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -21594,6 +23174,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21647,7 +23231,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -21703,7 +23287,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -21759,7 +23343,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -21813,6 +23397,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21862,6 +23450,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21913,6 +23505,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -21962,6 +23558,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22013,6 +23613,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22064,6 +23668,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22115,6 +23723,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22165,6 +23777,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22215,6 +23831,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22264,6 +23884,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22315,6 +23939,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22366,6 +23994,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22418,7 +24050,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -22472,7 +24104,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -22525,6 +24157,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22574,6 +24210,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22626,7 +24266,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -22680,7 +24320,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -22734,7 +24374,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -22786,6 +24426,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22835,6 +24479,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22884,6 +24532,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -22935,7 +24587,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -22989,6 +24641,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23040,6 +24696,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23091,6 +24751,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23142,6 +24806,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23193,6 +24861,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23244,6 +24916,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23295,6 +24971,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23346,6 +25026,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23397,7 +25081,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -23451,6 +25135,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23502,6 +25190,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23553,6 +25245,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23604,6 +25300,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23656,7 +25356,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -23709,6 +25409,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23759,6 +25463,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23810,6 +25518,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23860,6 +25572,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23910,6 +25626,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -23960,6 +25680,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24012,7 +25736,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24067,7 +25791,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24122,7 +25846,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24177,7 +25901,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24231,7 +25955,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24284,7 +26008,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24338,6 +26062,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24389,6 +26117,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24440,6 +26172,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24491,6 +26227,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24542,6 +26282,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24593,6 +26337,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24644,6 +26392,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24695,6 +26447,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24746,6 +26502,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24798,7 +26558,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -24852,6 +26612,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24903,6 +26667,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -24954,6 +26722,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25005,6 +26777,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25057,7 +26833,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -25111,6 +26887,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25162,6 +26942,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25212,6 +26996,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25262,6 +27050,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25313,7 +27105,7 @@ } experiments { key: "chromium.resultdb.result_sink.gtests_local" - value: 30 + value: 100 } experiments { key: "chromium.resultdb.result_sink.junit_tests" @@ -25366,6 +27158,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25417,6 +27213,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25468,6 +27268,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25519,6 +27323,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25570,6 +27378,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25621,6 +27433,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25672,6 +27488,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25723,6 +27543,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25774,6 +27598,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -25825,6 +27653,10 @@ value: 100 } experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { key: "chromium.resultdb.result_sink.junit_tests" value: 100 } @@ -27321,110 +29153,6 @@ } } builders { - name: "Win7 Builder (dbg) Goma Canary" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win7 Builder (dbg) Goma Canary" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-7" - dimensions: "pool:luci.chromium.ci" - exe { - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - cmd: "recipes" - } - properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.goma.fyi\",\"recipe\":\"chromium\"}" - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.use_realms" - value: 100 - } - resultdb { - enable: true - } - } - builders { - name: "Win7 Builder (dbg) Goma Latest Client" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win7 Builder (dbg) Goma Latest Client" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-7" - dimensions: "pool:luci.chromium.ci" - exe { - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - cmd: "recipes" - } - properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.goma.fyi\",\"recipe\":\"chromium\"}" - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.use_realms" - value: 100 - } - resultdb { - enable: true - } - } - builders { - name: "Win7 Builder Goma Canary" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win7 Builder Goma Canary" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-7" - dimensions: "pool:luci.chromium.ci" - exe { - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - cmd: "recipes" - } - properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.goma.fyi\",\"recipe\":\"chromium\"}" - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.use_realms" - value: 100 - } - resultdb { - enable: true - } - } - builders { - name: "Win7 Builder Goma Latest Client" - swarming_host: "chromium-swarm.appspot.com" - swarming_tags: "vpython:native-python-wrapper" - dimensions: "builder:Win7 Builder Goma Latest Client" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Windows-7" - dimensions: "pool:luci.chromium.ci" - exe { - cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" - cipd_version: "refs/heads/master" - cmd: "recipes" - } - properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.goma.fyi\",\"recipe\":\"chromium\"}" - execution_timeout_secs: 36000 - build_numbers: YES - service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "luci.use_realms" - value: 100 - } - resultdb { - enable: true - } - } - builders { name: "android-archive-dbg-goma-canary" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -36603,6 +38331,67 @@ } } builders { + name: "ios-angle-try-intel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cpu:x86-64" + dimensions: "os:Mac" + dimensions: "pool:luci.chromium.gpu.mac.mini.intel.uhd630.try" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"angle_chromium_trybot\",\"xcode_build_version\":\"12a7209\"}" + execution_timeout_secs: 7200 + expiration_secs: 7200 + caches { + name: "win_toolchain" + path: "win_toolchain" + } + caches { + name: "xcode_ios_12a7209" + path: "xcode_ios_12a7209.app" + } + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + } + } + builders { name: "ios-device" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index 5ac10ba..2764aaef 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -3615,6 +3615,16 @@ short_name: "x64" } builders { + name: "buildbucket/luci.chromium.ci/ios-angle-builder" + category: "iOS|Builder|ANGLE" + short_name: "x64" + } + builders { + name: "buildbucket/luci.chromium.ci/ios-angle-intel" + category: "iOS|Intel|ANGLE" + short_name: "x64" + } + builders { name: "buildbucket/luci.chromium.ci/win-angle-x64-builder" category: "Windows|Builder|ANGLE" short_name: "x64" @@ -6731,14 +6741,6 @@ short_name: "loc" } builders { - name: "buildbucket/luci.chromium.goma/Win7 Builder Goma Canary" - category: "win7|rel" - } - builders { - name: "buildbucket/luci.chromium.goma/Win7 Builder (dbg) Goma Canary" - category: "win7|dbg" - } - builders { name: "buildbucket/luci.chromium.goma/Mac Builder Goma Canary" category: "mac|rel" } @@ -11458,14 +11460,6 @@ short_name: "loc" } builders { - name: "buildbucket/luci.chromium.goma/Win7 Builder Goma Latest Client" - category: "win7|rel" - } - builders { - name: "buildbucket/luci.chromium.goma/Win7 Builder (dbg) Goma Latest Client" - category: "win7|dbg" - } - builders { name: "buildbucket/luci.chromium.goma/Mac Builder Goma Latest Client" category: "mac|rel" } @@ -12593,6 +12587,9 @@ name: "buildbucket/luci.chromium.try/gpu-try-win10-nvidia-rel" } builders { + name: "buildbucket/luci.chromium.try/ios-angle-try-intel" + } + builders { name: "buildbucket/luci.chromium.try/ios-device" } builders { @@ -13322,6 +13319,9 @@ name: "buildbucket/luci.chromium.try/fuchsia-angle-rel" } builders { + name: "buildbucket/luci.chromium.try/ios-angle-try-intel" + } + builders { name: "buildbucket/luci.chromium.try/linux-angle-rel" } builders {
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index b49f2fb..8365c1b 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -4011,46 +4011,6 @@ } } job { - id: "Win7 Builder (dbg) Goma Canary" - realm: "goma" - acl_sets: "goma" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.goma" - builder: "Win7 Builder (dbg) Goma Canary" - } -} -job { - id: "Win7 Builder (dbg) Goma Latest Client" - realm: "goma" - acl_sets: "goma" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.goma" - builder: "Win7 Builder (dbg) Goma Latest Client" - } -} -job { - id: "Win7 Builder Goma Canary" - realm: "goma" - acl_sets: "goma" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.goma" - builder: "Win7 Builder Goma Canary" - } -} -job { - id: "Win7 Builder Goma Latest Client" - realm: "goma" - acl_sets: "goma" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "luci.chromium.goma" - builder: "Win7 Builder Goma Latest Client" - } -} -job { id: "Win7 FYI Debug (AMD)" realm: "ci" acls { @@ -5111,6 +5071,30 @@ } } job { + id: "ios-angle-builder" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "ios-angle-builder" + } +} +job { + id: "ios-angle-intel" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "ios-angle-intel" + } +} +job { id: "ios-asan" realm: "ci" acl_sets: "ci" @@ -7126,6 +7110,7 @@ triggers: "fuchsia-official" triggers: "fuchsia-x64-cast" triggers: "fuchsia-x64-dbg" + triggers: "ios-angle-builder" triggers: "ios-asan" triggers: "ios-device" triggers: "ios-simulator" @@ -7257,10 +7242,6 @@ triggers: "Win Builder Goma Canary" triggers: "Win Builder Goma Latest Client" triggers: "Win Builder Goma RBE Latest Client" - triggers: "Win7 Builder (dbg) Goma Canary" - triggers: "Win7 Builder (dbg) Goma Latest Client" - triggers: "Win7 Builder Goma Canary" - triggers: "Win7 Builder Goma Latest Client" triggers: "android-archive-dbg-goma-canary" triggers: "android-archive-dbg-goma-latest" triggers: "android-archive-dbg-goma-rbe-ats-canary"
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index f73965fa..431a631 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -96,6 +96,7 @@ experiments = experiments or {} experiments.setdefault("chromium.resultdb.result_sink", 100) experiments.setdefault("chromium.resultdb.result_sink.junit_tests", 100) + experiments.setdefault("chromium.resultdb.result_sink.gtests_local", 100) # Define the builder first so that any validation of luci.builder arguments # (e.g. bucket) occurs before we try to use it @@ -368,9 +369,6 @@ builder_group = "chromium.fyi", execution_timeout = execution_timeout, goma_backend = goma_backend, - experiments = { - "chromium.resultdb.result_sink.gtests_local": 30, - }, **kwargs )
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star index b08b142..046bc0f 100644 --- a/infra/config/lib/try.star +++ b/infra/config/lib/try.star
@@ -235,6 +235,33 @@ **kwargs ) +def chromium_angle_pinned_builder(*, name, **kwargs): + return try_builder( + name = name, + builder_group = "tryserver.chromium.angle", + builderless = True, + executable = "recipe:angle_chromium_trybot", + goma_backend = builders.goma.backend.RBE_PROD, + service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", + **kwargs + ) + +def chromium_angle_mac_builder(*, name, **kwargs): + return chromium_angle_pinned_builder( + name = name, + cores = None, + ssd = None, + os = builders.os.MAC_ANY, + **kwargs + ) + +def chromium_angle_ios_builder(*, name, **kwargs): + return chromium_angle_mac_builder( + name = name, + xcode = builders.xcode.x12a7209, + **kwargs + ) + def chromium_chromiumos_builder(*, name, **kwargs): return try_builder( name = name, @@ -445,6 +472,8 @@ chromium_builder = chromium_builder, chromium_android_builder = chromium_android_builder, chromium_angle_builder = chromium_angle_builder, + chromium_angle_ios_builder = chromium_angle_ios_builder, + chromium_angle_mac_builder = chromium_angle_mac_builder, chromium_chromiumos_builder = chromium_chromiumos_builder, chromium_dawn_builder = chromium_dawn_builder, chromium_linux_builder = chromium_linux_builder,
diff --git a/infra/config/subprojects/chromium/angle.try.star b/infra/config/subprojects/chromium/angle.try.star new file mode 100644 index 0000000..1fced20cd --- /dev/null +++ b/infra/config/subprojects/chromium/angle.try.star
@@ -0,0 +1,37 @@ +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +load("//lib/builders.star", "cpu", "os") +load("//lib/try.star", "try_") + +try_.defaults.set( + bucket = "try", + build_numbers = True, + caches = [ + swarming.cache( + name = "win_toolchain", + path = "win_toolchain", + ), + ], + configure_kitchen = True, + cores = 8, + cpu = cpu.X86_64, + cq_group = "cq", + executable = "recipe:chromium_trybot", + execution_timeout = 2 * time.hour, + # Max. pending time for builds. CQ considers builds pending >2h as timed + # out: http://shortn/_8PaHsdYmlq. Keep this in sync. + expiration_timeout = 2 * time.hour, + os = os.LINUX_DEFAULT, + pool = "luci.chromium.try", + service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com", + subproject_list_view = "luci.chromium.try", + swarming_tags = ["vpython:native-python-wrapper"], + task_template_canary_percentage = 5, +) + +try_.chromium_angle_ios_builder( + name = "ios-angle-try-intel", + pool = "luci.chromium.gpu.mac.mini.intel.uhd630.try", +)
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index 5166586..ff34b32 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -134,7 +134,7 @@ consoles.console_view( name = "chromium.angle", ordering = { - None: ["Android", "AndroidVk", "Fuchsia", "Linux", "LinuxOzone", "Mac", "Windows", "Perf"], + None: ["Android", "AndroidVk", "Fuchsia", "Linux", "LinuxOzone", "Mac", "iOS", "Windows", "Perf"], "*builder*": ["Builder"], "Android": "*builder*", "AndroidVk": "*builder*", @@ -142,6 +142,7 @@ "Linux": "*builder*", "LinuxOzone": "*builder*", "Mac": "*builder*", + "iOS": "*builder*", "Windows": "*builder*", "Perf": "*builder*", }, @@ -1328,6 +1329,24 @@ triggered_by = ["mac-angle-chromium-builder"], ) +ci.angle_mac_builder( + name = "ios-angle-builder", + xcode = xcode.x12a7209, + console_view_entry = consoles.console_view_entry( + category = "iOS|Builder|ANGLE", + short_name = "x64", + ), +) + +ci.angle_thin_tester( + name = "ios-angle-intel", + console_view_entry = consoles.console_view_entry( + category = "iOS|Intel|ANGLE", + short_name = "x64", + ), + triggered_by = ["ios-angle-builder"], +) + ci.angle_windows_builder( name = "win-angle-chromium-x64-builder", console_view_entry = consoles.console_view_entry(
diff --git a/infra/config/subprojects/chromium/subproject.star b/infra/config/subprojects/chromium/subproject.star index b7eaf15..3c35dce 100644 --- a/infra/config/subprojects/chromium/subproject.star +++ b/infra/config/subprojects/chromium/subproject.star
@@ -7,6 +7,7 @@ exec("./ci.star") exec("./try.star") exec("./gpu.try.star") +exec("./angle.try.star") exec("./swangle.try.star") # TODO(gbeaty) external_console_view uses new fields/types that aren't present
diff --git a/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star b/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star index f1588ce..a734330 100644 --- a/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star +++ b/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star
@@ -24,14 +24,6 @@ short_name = "loc", ), luci.console_view_entry( - builder = "goma/Win7 Builder Goma Canary", - category = "win7|rel", - ), - luci.console_view_entry( - builder = "goma/Win7 Builder (dbg) Goma Canary", - category = "win7|dbg", - ), - luci.console_view_entry( builder = "goma/Mac Builder Goma Canary", category = "mac|rel", ),
diff --git a/infra/config/subprojects/goma/consoles/goma.latest.star b/infra/config/subprojects/goma/consoles/goma.latest.star index 4bf267b..133e1a3 100644 --- a/infra/config/subprojects/goma/consoles/goma.latest.star +++ b/infra/config/subprojects/goma/consoles/goma.latest.star
@@ -23,14 +23,6 @@ short_name = "loc", ), luci.console_view_entry( - builder = "goma/Win7 Builder Goma Latest Client", - category = "win7|rel", - ), - luci.console_view_entry( - builder = "goma/Win7 Builder (dbg) Goma Latest Client", - category = "win7|dbg", - ), - luci.console_view_entry( builder = "goma/Mac Builder Goma Latest Client", category = "mac|rel", ),
diff --git a/infra/config/subprojects/goma/goma.star b/infra/config/subprojects/goma/goma.star index 83dc774..dd1f5a7a 100644 --- a/infra/config/subprojects/goma/goma.star +++ b/infra/config/subprojects/goma/goma.star
@@ -91,16 +91,6 @@ ) fyi_goma_canary_builder( - name = "Win7 Builder (dbg) Goma Canary", - os = os.WINDOWS_7, -) - -fyi_goma_canary_builder( - name = "Win7 Builder Goma Canary", - os = os.WINDOWS_7, -) - -fyi_goma_canary_builder( name = "android-archive-dbg-goma-canary", ) @@ -245,16 +235,6 @@ ) fyi_goma_latest_client_builder( - name = "Win7 Builder (dbg) Goma Latest Client", - os = os.WINDOWS_7, -) - -fyi_goma_latest_client_builder( - name = "Win7 Builder Goma Latest Client", - os = os.WINDOWS_7, -) - -fyi_goma_latest_client_builder( name = "android-archive-dbg-goma-latest", )
diff --git a/ios/build/bots/scripts/result_sink_util.py b/ios/build/bots/scripts/result_sink_util.py index e4c53ce6..a48b869 100644 --- a/ios/build/bots/scripts/result_sink_util.py +++ b/ios/build/bots/scripts/result_sink_util.py
@@ -106,11 +106,15 @@ # Ensure session is closed at exit. atexit.register(self.close) + logging.getLogger("requests").setLevel(logging.WARNING) + def close(self): """Closes the connection to result sink server.""" if not self.sink: return LOGGER.info('Closing connection with result sink server.') + # Reset to default logging level of test runner scripts. + logging.getLogger("requests").setLevel(logging.DEBUG) self._session.close() def post(self, test_result):
diff --git a/ios/build/bots/scripts/test_apps.py b/ios/build/bots/scripts/test_apps.py index fa225c05..757711a 100644 --- a/ios/build/bots/scripts/test_apps.py +++ b/ios/build/bots/scripts/test_apps.py
@@ -472,6 +472,8 @@ ] self.test_args.append('--gtest_filter=%s' % gtest_filter) + self.test_args.append('--gmock_verbose=error') + xctestrun_data['TestTargetName'].update( {'CommandLineArguments': self.test_args}) @@ -587,6 +589,8 @@ ] self.test_args.append('--gtest_filter=%s' % gtest_filter) + self.test_args.append('--gmock_verbose=error') + xctestrun_data['TestTargetName'].update( {'CommandLineArguments': self.test_args})
diff --git a/ios/build/bots/scripts/test_apps_test.py b/ios/build/bots/scripts/test_apps_test.py index 7a90156..dd22bb4 100644 --- a/ios/build/bots/scripts/test_apps_test.py +++ b/ios/build/bots/scripts/test_apps_test.py
@@ -3,12 +3,20 @@ # found in the LICENSE file. """Unittests for test_apps.py.""" +import mock import unittest import test_apps import test_runner_test +_TEST_APP_PATH = '/path/to/test_app.app' +_HOST_APP_PATH = '/path/to/host_app.app' +_BUNDLE_ID = 'org.chromium.gtest.test-app' +_MODULE_NAME = 'test_app' +_XCTEST_PATH = '/PlugIns/boringssl_ssl_tests_module.xctest' + + class GetKIFTestFilterTest(test_runner_test.TestCase): """Tests for test_runner.get_kif_test_filter.""" @@ -58,5 +66,82 @@ self.assertEqual(test_apps.get_gtest_filter(tests, invert=True), expected) +class DeviceXCTestUnitTestsAppTest(test_runner_test.TestCase): + """Tests to test methods of SimulatorXCTestUnitTestsApp.""" + + @mock.patch('test_apps.get_bundle_id', return_value=_BUNDLE_ID) + @mock.patch( + 'test_apps.DeviceXCTestUnitTestsApp._xctest_path', + return_value=_XCTEST_PATH) + @mock.patch('os.path.exists', return_value=True) + def test_fill_xctestrun_node(self, *args): + """Tests fill_xctestrun_node method.""" + test_app = test_apps.DeviceXCTestUnitTestsApp(_TEST_APP_PATH) + expected_xctestrun_node = { + 'TestTargetName': { + 'CommandLineArguments': [ + '--enable-run-ios-unittests-with-xctest', + '--gmock_verbose=error' + ], + 'IsAppHostedTestBundle': True, + 'TestBundlePath': '__TESTHOST__/%s' % _XCTEST_PATH, + 'TestHostBundleIdentifier': _BUNDLE_ID, + 'TestHostPath': '%s' % _TEST_APP_PATH, + 'TestingEnvironmentVariables': { + 'DYLD_INSERT_LIBRARIES': + '__TESTHOST__/Frameworks/libXCTestBundleInject.dylib', + 'DYLD_LIBRARY_PATH': + '__PLATFORMS__/iPhoneOS.platform/Developer/Library', + 'DYLD_FRAMEWORK_PATH': + '__PLATFORMS__/iPhoneOS.platform/Developer/' + 'Library/Frameworks', + 'XCInjectBundleInto': + '__TESTHOST__/%s' % _MODULE_NAME + } + } + } + xctestrun_node = test_app.fill_xctestrun_node() + self.assertEqual(xctestrun_node, expected_xctestrun_node) + + +class SimulatorXCTestUnitTestsAppTest(test_runner_test.TestCase): + """Tests to test methods of SimulatorXCTestUnitTestsApp.""" + + @mock.patch('test_apps.get_bundle_id', return_value=_BUNDLE_ID) + @mock.patch( + 'test_apps.SimulatorXCTestUnitTestsApp._xctest_path', + return_value=_XCTEST_PATH) + @mock.patch('os.path.exists', return_value=True) + def test_fill_xctestrun_node(self, *args): + """Tests fill_xctestrun_node method.""" + test_app = test_apps.SimulatorXCTestUnitTestsApp(_TEST_APP_PATH) + expected_xctestrun_node = { + 'TestTargetName': { + 'CommandLineArguments': [ + '--enable-run-ios-unittests-with-xctest', + '--gmock_verbose=error' + ], + 'IsAppHostedTestBundle': True, + 'TestBundlePath': '__TESTHOST__/%s' % _XCTEST_PATH, + 'TestHostBundleIdentifier': _BUNDLE_ID, + 'TestHostPath': '%s' % _TEST_APP_PATH, + 'TestingEnvironmentVariables': { + 'DYLD_INSERT_LIBRARIES': + '__PLATFORMS__/iPhoneSimulator.platform/Developer/usr/lib/' + 'libXCTestBundleInject.dylib', + 'DYLD_LIBRARY_PATH': + '__PLATFORMS__/iPhoneSimulator.platform/Developer/Library', + 'DYLD_FRAMEWORK_PATH': + '__PLATFORMS__/iPhoneSimulator.platform/Developer/' + 'Library/Frameworks', + 'XCInjectBundleInto': + '__TESTHOST__/%s' % _MODULE_NAME + } + } + } + xctestrun_node = test_app.fill_xctestrun_node() + self.assertEqual(xctestrun_node, expected_xctestrun_node) + + if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main()
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 6f3023c..bb34afe 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -95,6 +95,7 @@ #import "ios/chrome/browser/ui/main/scene_delegate.h" #import "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/browser/ui/util/multi_window_support.h" +#include "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/ui/webui/chrome_web_ui_ios_controller_factory.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" @@ -733,9 +734,8 @@ } - (void)orientationDidChange:(NSNotification*)notification { - crash_keys::SetCurrentOrientation( - [[UIApplication sharedApplication] statusBarOrientation], - [[UIDevice currentDevice] orientation]); + crash_keys::SetCurrentOrientation(GetInterfaceOrientation(), + [[UIDevice currentDevice] orientation]); } - (void)registerForOrientationChangeNotifications {
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index c09d8df..fa1a991 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">ትር ደርሷል።</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> ደቂቃዎች</translation> <translation id="3448016392200048164">የተከፈለ ዕይታ</translation> +<translation id="3454224729131972583">ርዕስ</translation> <translation id="345565170154308620">የይለፍ ቃላትን አቀናብር...</translation> <translation id="3469166899695866866">ማውረድ ይቁም?</translation> <translation id="3470502288861289375">በመቅዳት ላይ...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">ቁጥር</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ላይ ዕልባት ተደርጓል</translation> <translation id="3709582977625132201">እንዳልተነበበ ምልክት አድርግ</translation> +<translation id="3720541637541300822">Chromeን ሲዘጉ ማንነት የማያሳውቁ ትሮችን ይቆልፉ</translation> <translation id="3740397331642243698">በGoogle Chrome ውስጥ የገቡትን ዩአርኤሎች ማንነትን በማያሳውቅ ሁነታ ላይ ይከፍታል።</translation> <translation id="3771033907050503522">ማንነት የማያሳውቁ ትሮች</translation> <translation id="3775743491439407556">ስምረት እየሰራ አይደለም</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index c423b15..e05a434f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Атрымана ўкладка.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> хв</translation> <translation id="3448016392200048164">Раздзелены кадр</translation> +<translation id="3454224729131972583">Форма звароту</translation> <translation id="345565170154308620">Кіраваць паролямі...</translation> <translation id="3469166899695866866">Спыніць спампоўку?</translation> <translation id="3470502288861289375">Ідзе капіраванне...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Нумар</translation> <translation id="3691593122358196899">Закладка дададзена ў папку "<ph name="FOLDER_TITLE" />"</translation> <translation id="3709582977625132201">Пазначыць як непрачытанае</translation> +<translation id="3720541637541300822">Блакіраваць укладкі ў рэжыме інкогніта пры закрыцці Chrome</translation> <translation id="3740397331642243698">Адкрывае ўведзеныя URL-адрасы ў Google Chrome у рэжыме інкогніта.</translation> <translation id="3771033907050503522">Укладкі інкогніта</translation> <translation id="3775743491439407556">Сінхранізацыя не працуе</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 7ed3e1a9..5da1f32c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">ট্যাব পাওয়া গেছে।</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> মিনিট</translation> <translation id="3448016392200048164">বিভক্ত দৃশ্য</translation> +<translation id="3454224729131972583">শীর্ষক</translation> <translation id="345565170154308620">পাসওয়ার্ড পরিচালনা করুন…</translation> <translation id="3469166899695866866">ডাউনলোড বন্ধ করবেন?</translation> <translation id="3470502288861289375">অনুলিপি করা হচ্ছে...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">নম্বর</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> এ বুকমার্ক করা হয়েছে</translation> <translation id="3709582977625132201">'পড়া হয়নি' হিসেবে চিহ্নিত করুন</translation> +<translation id="3720541637541300822">Chrome বন্ধ করলে, 'ছদ্মবেশী' ট্যাব লক হয়ে যায়</translation> <translation id="3740397331642243698">এটি ইনপুট করা ইউআরএলগুলিকে Google Chrome-এ, 'ছদ্মবেশী' মোডে খোলে।</translation> <translation id="3771033907050503522">ছদ্মবেশী ট্যাবগুলি</translation> <translation id="3775743491439407556">সিঙ্ক কাজ করছে না</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 5e382ae..0ccd89df 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">S'ha rebut una pestanya.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Visualització dividida</translation> +<translation id="3454224729131972583">Títol</translation> <translation id="345565170154308620">Gestiona les contrasenyes...</translation> <translation id="3469166899695866866">Vols aturar la baixada?</translation> <translation id="3470502288861289375">S'està copiant...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Número</translation> <translation id="3691593122358196899">Adreça d'interès afegida a <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Marca com a no llegit</translation> +<translation id="3720541637541300822">Bloqueja les pestanyes d'incògnit després de tancar Chrome</translation> <translation id="3740397331642243698">Obre els URL introduïts en mode d'incògnit a Google Chrome.</translation> <translation id="3771033907050503522">Pestanyes d'incògnit</translation> <translation id="3775743491439407556">La sincronització no funciona</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index b960a88..2916d66 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Byla přijata karta.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Režim Split View</translation> +<translation id="3454224729131972583">Název</translation> <translation id="345565170154308620">Spravovat hesla...</translation> <translation id="3469166899695866866">Zastavit stahování?</translation> <translation id="3470502288861289375">Kopírování...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Číslo</translation> <translation id="3691593122358196899">Záložka přidána do složky <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Označit jako nepřečtené</translation> +<translation id="3720541637541300822">Při zavření Chromu zamknout anonymní karty</translation> <translation id="3740397331642243698">Otevře zadané adresy URL v prohlížeči Google Chrome v anonymním režimu.</translation> <translation id="3771033907050503522">Anonymní karty</translation> <translation id="3775743491439407556">Synchronizace nefunguje</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 25fc35d..ba377e2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -465,7 +465,7 @@ <translation id="5964480694698977962">Neuen Inkognitotab erstellen.</translation> <translation id="5965679971710331625">Sie sind angemeldet</translation> <translation id="5979837087407522202">Passwörter suchen</translation> -<translation id="5982717868370722439">Vorhandene Daten zu <ph name="USER_EMAIL" /> hinzufügen.</translation> +<translation id="5982717868370722439">Vorhandene Daten zu <ph name="USER_EMAIL" /> hinzufügen</translation> <translation id="5984222099446776634">Kürzlich besucht</translation> <translation id="5988851877894965432">URLs in Chrome öffnen</translation> <translation id="6012140227487808125">Wird verschlüsselt…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index ef9ed6f..3af5ea1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -60,7 +60,7 @@ <translation id="1492417797159476138">You already saved this username for this site</translation> <translation id="1509486075633541495">Sign in to website</translation> <translation id="1509960214886564027">Features on many sites may break</translation> -<translation id="152234381334907219">Never Saved</translation> +<translation id="152234381334907219">Never saved</translation> <translation id="1523341279170789507">Allow All Cookies</translation> <translation id="1535268707340844072">Your current setting may cause some sites to break. To manage cookies for all sites, see <ph name="BEGIN_LINK" />Cookie settings<ph name="END_LINK" />.</translation> <translation id="1540800554400757039">Address 1</translation> @@ -179,7 +179,7 @@ <translation id="2830972654601096923">Manage Addresses…</translation> <translation id="2834956026595107950"><ph name="TITLE" />, <ph name="STATE" />, <ph name="URL" /></translation> <translation id="2840687315230832938">Initial Sync Setup Not Finished</translation> -<translation id="2843803966603263712">Reset Translate Settings</translation> +<translation id="2843803966603263712">Reset Translate settings</translation> <translation id="2858204748079866344">To protect your privacy, Chrome will not auto-fill your password in this field.</translation> <translation id="285960592395650245">Retry Download</translation> <translation id="2870560284913253234">Site</translation> @@ -595,7 +595,7 @@ <translation id="7159472599653637159">Request Mobile Site</translation> <translation id="7162168282402939716">Unlock incognito tabs with <ph name="BIOMETRIC_AUTHENITCATION_TYPE" /></translation> <translation id="7172852049901402487">Keep your passwords safe from security issues</translation> -<translation id="7173114856073700355">Open Settings</translation> +<translation id="7173114856073700355">Open settings</translation> <translation id="7189598951263744875">Share...</translation> <translation id="7192050974311852563">Start logging</translation> <translation id="7203585745079012652">Speak Answers Back</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 30cc7ff..4db4ced 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Fitxa bat jaso da.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Ikuspegi zatitua</translation> +<translation id="3454224729131972583">Izena</translation> <translation id="345565170154308620">Kudeatu pasahitzak…</translation> <translation id="3469166899695866866">Deskarga eten nahi duzu?</translation> <translation id="3470502288861289375">Kopiatzen…</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Zenbakia</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> karpetan gehitu da laster-marka</translation> <translation id="3709582977625132201">Markatu irakurri gabeko gisa</translation> +<translation id="3720541637541300822">Blokeatu ezkutuko moduko fitxak Chrome ixten duzunean</translation> <translation id="3740397331642243698">Idatzitako URLak Google Chrome-ren ezkutuko moduan irekitzen ditu.</translation> <translation id="3771033907050503522">Ezkutuko moduko fitxak</translation> <translation id="3775743491439407556">Sinkronizazioa ez dabil</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 15a5cdefa..978cd85 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">برگه دریافت شد.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> دقیقه</translation> <translation id="3448016392200048164">نمای تقسیم</translation> +<translation id="3454224729131972583">عنوان</translation> <translation id="345565170154308620">مدیریت گذرواژهها…</translation> <translation id="3469166899695866866">بارگیری متوقف شود؟</translation> <translation id="3470502288861289375">در حال کپی کردن...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">عدد</translation> <translation id="3691593122358196899">نشانک به <ph name="FOLDER_TITLE" /> اضافه شد</translation> <translation id="3709582977625132201">علامتگذاری بهعنوان خواندهنشده</translation> +<translation id="3720541637541300822">قفل کردن «برگههای ناشناس» وقتی Chrome را میبندید</translation> <translation id="3740397331642243698">نشانیهای واردشده را در Google Chrome در حالت «ناشناس» باز میکند.</translation> <translation id="3771033907050503522">برگههای ناشناس</translation> <translation id="3775743491439407556">همگامسازی کار نمیکند</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 6baf99a..80ef0b5d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Välilehti vastaanotettu</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Jaettu näkymä</translation> +<translation id="3454224729131972583">Nimi</translation> <translation id="345565170154308620">Salasanavalinnat…</translation> <translation id="3469166899695866866">Pysäytetäänkö lataus?</translation> <translation id="3470502288861289375">Kopioidaan…</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Numero</translation> <translation id="3691593122358196899">Lisätty kirjanmerkiksi kansioon <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Merkitse lukemattomaksi</translation> +<translation id="3720541637541300822">Lukitse incognito-välilehdet, kun suljet Chromen</translation> <translation id="3740397331642243698">Avaa syötetyt URL-osoitteet Google Chromen incognito-tilassa.</translation> <translation id="3771033907050503522">Incognito</translation> <translation id="3775743491439407556">Synkronointi ei toimi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 4a09e8a..df46a44 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Onglet reçu.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Vue partagée</translation> +<translation id="3454224729131972583">Titre</translation> <translation id="345565170154308620">Gérer les mots de passe…</translation> <translation id="3469166899695866866">Arrêter le téléchargement?</translation> <translation id="3470502288861289375">Copie en cours…</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Numéro</translation> <translation id="3691593122358196899">Marqué comme favori dans <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Marquer comme non lu</translation> +<translation id="3720541637541300822">Verrouiller les onglets de navigation privée lorsque vous fermez Chrome</translation> <translation id="3740397331642243698">Ouvre les URL entrées dans Google Chrome en mode de navigation privée.</translation> <translation id="3771033907050503522">Onglets nav. priv.</translation> <translation id="3775743491439407556">La synchronisation ne fonctionne pas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index 7975821..1a7ef12 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Recibiuse unha pestana.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Vista dividida</translation> +<translation id="3454224729131972583">Tratamento</translation> <translation id="345565170154308620">Xestionar contrasinais…</translation> <translation id="3469166899695866866">Queres deter a descarga?</translation> <translation id="3470502288861289375">Copiando...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Número</translation> <translation id="3691593122358196899">Marcador engadido a <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Marcar como non lido</translation> +<translation id="3720541637541300822">Bloquear pestanas do modo de incógnito ao pechar Chrome</translation> <translation id="3740397331642243698">Abre os URL escritos en Google Chrome no modo de incógnito.</translation> <translation id="3771033907050503522">Pestanas de incógnito</translation> <translation id="3775743491439407556">A sincronización non funciona</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 9dbdcc4d..549223b7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -118,7 +118,7 @@ <translation id="2139867232736819575">Vágólapra másolt szöveg keresése</translation> <translation id="2149973817440762519">Könyvjelző szerkesztése</translation> <translation id="2175927920773552910">QR-kód</translation> -<translation id="2198757192731523470">A Google felhasználhatja az Ön előzményeit a Keresés, a hirdetések és más Google-szolgáltatások személyre szabására.</translation> +<translation id="2198757192731523470">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására.</translation> <translation id="2218443599109088993">Kicsinyítés</translation> <translation id="2230173723195178503">A weboldal betöltött</translation> <translation id="2239626343334228536">Böngészési adatok törlése…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 36142c6..baa61d59 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Դուք ներդիր եք ստացել։</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> րոպե</translation> <translation id="3448016392200048164">Տրոհված տեսք</translation> +<translation id="3454224729131972583">Դիմելաձև</translation> <translation id="345565170154308620">Կառավարել գաղտնաբառերը…</translation> <translation id="3469166899695866866">Դադարեցնե՞լ ներբեռնումը</translation> <translation id="3470502288861289375">Պատճենում…</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Քարտի համարը</translation> <translation id="3691593122358196899">Էջանիշը պահվել է <ph name="FOLDER_TITLE" />-ում</translation> <translation id="3709582977625132201">Նշել որպես չկարդացված</translation> +<translation id="3720541637541300822">Կողպել ինկոգնիտո ներդիրները, երբ փակում եք Chrome-ը</translation> <translation id="3740397331642243698">Մուտքագրված URL-ները բացվում են Google Chrome-ի ինկոգնիտո ներդիրում։</translation> <translation id="3771033907050503522">Ինկոգնիտո ներդիրներ</translation> <translation id="3775743491439407556">Համաժամացումը չի աշխատում</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index abac366..7a5920ba 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Skirtukas gautas.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min.</translation> <translation id="3448016392200048164">Padalytas rodinys</translation> +<translation id="3454224729131972583">Pavadinimas</translation> <translation id="345565170154308620">Tvarkyti slaptažodžius...</translation> <translation id="3469166899695866866">Sustabdyti atsisiuntimą?</translation> <translation id="3470502288861289375">Kopijuojama...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Numeris</translation> <translation id="3691593122358196899">Sukurta „<ph name="FOLDER_TITLE" />“ žymė</translation> <translation id="3709582977625132201">Pažymėti kaip neskaitytą</translation> +<translation id="3720541637541300822">Užrakinti inkognito skirtukus uždarius „Chrome“</translation> <translation id="3740397331642243698">Atidaromi įvesti URL naršyklėje „Google Chrome“ inkognito režimu.</translation> <translation id="3771033907050503522">Inkognito skirt.</translation> <translation id="3775743491439407556">Sinchronizavimas neveikia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 67908b86..f957ac9d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Примена е картичка.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> мин.</translation> <translation id="3448016392200048164">Поделен приказ</translation> +<translation id="3454224729131972583">Наслов</translation> <translation id="345565170154308620">Управувајте со лозинките…</translation> <translation id="3469166899695866866">Дали да се сопре преземањето?</translation> <translation id="3470502288861289375">Се копира...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Број</translation> <translation id="3691593122358196899">Додаден е обележувач во <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Обележи како непрочитано</translation> +<translation id="3720541637541300822">Заклучувај ги картичките „Инкогнито“ кога ќе го затворам Chrome</translation> <translation id="3740397331642243698">Ги отвора внесените URL-адреси во Google Chrome во „Инкогнито“.</translation> <translation id="3771033907050503522">Инкогнито картички</translation> <translation id="3775743491439407556">Синхронизацијата не функционира</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 370859d..7bcbe6f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">ടാബ് സ്വീകരിച്ചു.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> മി.</translation> <translation id="3448016392200048164">വിഭജിത കാഴ്ച</translation> +<translation id="3454224729131972583">പേര്</translation> <translation id="345565170154308620">പാസ്വേഡുകൾ മാനേജ് ചെയ്യുക...</translation> <translation id="3469166899695866866">ഡൗൺലോഡ് നിർത്തണോ?</translation> <translation id="3470502288861289375">പകർത്തുന്നു...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">നമ്പർ</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> ഫോൾഡറിലേക്ക് ബുക്ക്മാർക്ക് ചെയ്തു</translation> <translation id="3709582977625132201">വായിച്ചില്ലെന്ന് അടയാളപ്പെടുത്തുക</translation> +<translation id="3720541637541300822">Chrome അടയ്ക്കുമ്പോൾ അദൃശ്യ ടാബുകൾ ലോക്ക് ചെയ്യുക</translation> <translation id="3740397331642243698">Google Chrome-ൽ നൽകിയിട്ടുള്ള URL-കൾ അദൃശ്യ മോഡിൽ തുറക്കുന്നു.</translation> <translation id="3771033907050503522">ആൾമാറാട്ട ടാബുകൾ</translation> <translation id="3775743491439407556">സമന്വയം പ്രവർത്തിക്കുന്നില്ല</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 86647411..f50c969 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Fila a fost primită.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min.</translation> <translation id="3448016392200048164">Vizualizare împărțită</translation> +<translation id="3454224729131972583">Titlu</translation> <translation id="345565170154308620">Gestionează parolele...</translation> <translation id="3469166899695866866">Oprești descărcarea?</translation> <translation id="3470502288861289375">Se copiază...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Număr</translation> <translation id="3691593122358196899">Marcaj adăugat în <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Marchează ca necitit</translation> +<translation id="3720541637541300822">Blochează filele incognito când închizi Chrome</translation> <translation id="3740397331642243698">Deschide adresele URL introduse în Google Chrome în modul incognito.</translation> <translation id="3771033907050503522">File incognito</translation> <translation id="3775743491439407556">Sincronizarea nu funcționează</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index a0bc542..91f8164e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">ලැබූ පටිත්ත.</translation> <translation id="3445288400492335833">මිනි <ph name="MINUTES" /></translation> <translation id="3448016392200048164">විභෙදුම් දසුන</translation> +<translation id="3454224729131972583">මාතෘකාව</translation> <translation id="345565170154308620">මුරපද කළමනා කරන්න...</translation> <translation id="3469166899695866866">බාගැනීම නවතන්න</translation> <translation id="3470502288861289375">පිටපත් කෙරෙමින්...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">අංකය</translation> <translation id="3691593122358196899"><ph name="FOLDER_TITLE" /> වෙත පිටුසන් යොදන ලදී</translation> <translation id="3709582977625132201">නොකියවූ ලෙස ලකුණු කරන්න</translation> +<translation id="3720541637541300822">ඔබ Chrome වසන විට අප්රසිද්ධ ටැබ අගුලු දමන්න</translation> <translation id="3740397331642243698">අප්රසිද්ධ තුළ Google Chrome in හි ආදානය කළ URL විවෘත කරයි.</translation> <translation id="3771033907050503522">අප්රකට පටිති</translation> <translation id="3775743491439407556">සමමුහූර්ත කිරීම ක්රියා නොකරයි</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index d3e17301..e8debc1c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -84,7 +84,7 @@ <translation id="1687475363370981210">Označiť všetko ako prečítané</translation> <translation id="1689333818294560261">Prezývka</translation> <translation id="1690731385917361335">Žiadne položky</translation> -<translation id="1692118695553449118">Synchronizácia je zapnutá.</translation> +<translation id="1692118695553449118">Synchronizácia je zapnutá</translation> <translation id="1700629756560807968">Počet vybraných záložiek: <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> <translation id="1740468249224277719">Dvojitým klepnutím spustíte inštaláciu.</translation> <translation id="1746815479209538200">Ak chcete prehliadať internet, pridajte novú kartu.</translation> @@ -238,6 +238,7 @@ <translation id="3443810440409579745">Karta bola prijatá.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Rozdelené zobrazenie</translation> +<translation id="3454224729131972583">Názov</translation> <translation id="345565170154308620">Spravovať heslá…</translation> <translation id="3469166899695866866">Zastaviť sťahovanie?</translation> <translation id="3470502288861289375">Prebieha kopírovanie...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Číslo</translation> <translation id="3691593122358196899">Uložené ako záložka v priečinku <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Označiť ako neprečítané</translation> +<translation id="3720541637541300822">Uzamknúť karty inkognito pri zavretí Chromu</translation> <translation id="3740397331642243698">Otvorí zadané webové adresy v prehliadači Google Chrome v režime inkognito.</translation> <translation id="3771033907050503522">Karty inkognito</translation> <translation id="3775743491439407556">Synchronizácia nefunguje</translation> @@ -389,7 +391,7 @@ <translation id="5090832849094901128">Odstránením tohto hesla nevymažete svoj účet na <ph name="WEBSITE" />.</translation> <translation id="5094827893301452931">Tweet bol uverejnený.</translation> <translation id="5118764316110575523">Vypnuté</translation> -<translation id="5127805178023152808">Synchronizácia je vypnutá.</translation> +<translation id="5127805178023152808">Synchronizácia je vypnutá</translation> <translation id="5132942445612118989">Synchronizujte svoje heslá, históriu a ďalší obsah vo všetkých zariadeniach</translation> <translation id="5140288047769711648">Chrome si toto heslo zapamätá za vás. Nemusíte sa ho učiť naspamäť.</translation> <translation id="5150492518600715772">Odoslať do vášho zariadenia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index d9d71f0..45c4443 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -238,6 +238,7 @@ <translation id="3443810440409579745">Skeda u mor.</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3448016392200048164">Pamja e ndarë</translation> +<translation id="3454224729131972583">Titulli</translation> <translation id="345565170154308620">Menaxho fjalëkalimet...</translation> <translation id="3469166899695866866">Të ndalohet shkarkimi?</translation> <translation id="3470502288861289375">Po kopjon...</translation> @@ -267,6 +268,7 @@ <translation id="3670030362669914947">Numri</translation> <translation id="3691593122358196899">Faqeshënuesi u shtua te <ph name="FOLDER_TITLE" /></translation> <translation id="3709582977625132201">Shëno si të palexuar</translation> +<translation id="3720541637541300822">Kyçi skedat "e fshehta" kur të mbyllësh Chrome</translation> <translation id="3740397331642243698">Hap URL-të e futura në Google Chrome në modalitetin "i fshehtë".</translation> <translation id="3771033907050503522">Skedat "e fshehura"</translation> <translation id="3775743491439407556">Sinkronizimi nuk po punon</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 571a7f32..8818416 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -59,7 +59,7 @@ <translation id="1491277525950327607">Ayarı açıp kapatmak için iki kez dokunun</translation> <translation id="1492417797159476138">Bu site için bu kullanıcı adını zaten kaydettiniz</translation> <translation id="1509486075633541495">Web sitesinde oturum açın</translation> -<translation id="1509960214886564027">Birçok sitedeki özellikler bozulabilir</translation> +<translation id="1509960214886564027">Birçok sitedeki özellikler çalışmayabilir</translation> <translation id="152234381334907219">Hiç Kaydedilmeyenler</translation> <translation id="1523341279170789507">Tüm Çerezlere İzin Ver</translation> <translation id="1535268707340844072">Geçerli ayarlarınız bazı sitelerin bozulmasına neden olabilir. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="BEGIN_LINK" />Çerez Ayarları<ph name="END_LINK" /> sayfasından öğrenebilirsiniz.</translation> @@ -667,7 +667,7 @@ Siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezler kullanabilir.</translation> <translation id="7971521879845308059">Pop-up'ları Engelle</translation> <translation id="7982789257301363584">Ağ</translation> -<translation id="7993619969781047893">Bazı sitelerdeki özellikler bozulabilir</translation> +<translation id="7993619969781047893">Bazı sitelerdeki özellikler çalışmayabilir</translation> <translation id="800361585186029508">Girilen URL'leri Google Chrome'da açar.</translation> <translation id="8007420562015504427">Gizli Arama</translation> <translation id="802154636333426148">İndirilemedi</translation> @@ -737,7 +737,7 @@ <translation id="8756969031206844760">Şifre güncellensin mi?</translation> <translation id="8775144690796719618">Geçersiz URL</translation> <translation id="8803639129939845298">Güvenli</translation> -<translation id="8820817407110198400">Favoriler</translation> +<translation id="8820817407110198400">Yer işaretleri</translation> <translation id="8840513115188359703">Google Hesaplarınızdaki oturumlarınız kapatılmaz.</translation> <translation id="8870413625673593573">Son Kapatılan</translation> <translation id="8881801611828450202">Bu Resmi <ph name="SEARCH_ENGINE" /> Üzerinde Ara</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 6082e047..cc382a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -25,7 +25,7 @@ <translation id="1165039591588034296">错误</translation> <translation id="1172898394251786223">下一个字段</translation> <translation id="1176932207622159128">无法保存图片</translation> -<translation id="1180526666083833456">在所有设备上保持同步并进行个性化设置。</translation> +<translation id="1180526666083833456">在所有设备上保持同步,获享个性化体验。</translation> <translation id="1181037720776840403">移除</translation> <translation id="1207113853726624428">新搜索</translation> <translation id="1209206284964581585">暂时隐藏</translation> @@ -187,7 +187,7 @@ <translation id="2876369937070532032">当您面临安全风险时,将您所访问的部分网页的网址发送给 Google</translation> <translation id="288655811176831528">关闭标签页</translation> <translation id="2898963176829412617">新建文件夹…</translation> -<translation id="2916171785467530738">自动填充搜索字词和网址</translation> +<translation id="2916171785467530738">自动补全搜索字词和网址</translation> <translation id="291754862089661335">将 QR 码或条形码放到此框内</translation> <translation id="2921219216347069551">无法分享网页</translation> <translation id="2923448633003185837">粘贴并转到</translation> @@ -755,7 +755,7 @@ <translation id="9079935439869366234">全部标为未读</translation> <translation id="9081058212938299310">更新 <ph name="USERNAME" /> 的密码?</translation> <translation id="9083392325882095631">有1个书签</translation> -<translation id="9083838294503912307">要在您的所有设备上保持同步并进行个性化设置,请开启同步功能。</translation> +<translation id="9083838294503912307">要在您的所有设备上保持同步并获享个性化体验,请开启同步功能。</translation> <translation id="9087108903408689779">Chrome 建议的密码:</translation> <translation id="9094033019050270033">更新密码</translation> <translation id="9100610230175265781">必须提供密码</translation>
diff --git a/ios/chrome/browser/autofill/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/autofill_controller_unittest.mm index 4c8c0639..b97f0e7 100644 --- a/ios/chrome/browser/autofill/autofill_controller_unittest.mm +++ b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
@@ -292,10 +292,6 @@ [accessory_mediator_ injectWebState:web_state()]; [accessory_mediator_ injectProvider:suggestion_controller_]; - auto suggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>( - [web_state()->GetJSInjectionReceiver() - instanceOfClass:[JsSuggestionManager class]]); - [accessory_mediator_ injectSuggestionManager:suggestionManager]; histogram_tester_.reset(new base::HistogramTester()); }
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_handler.h b/ios/chrome/browser/autofill/form_input_accessory_view_handler.h index fd4b04f..3df1a7a 100644 --- a/ios/chrome/browser/autofill/form_input_accessory_view_handler.h +++ b/ios/chrome/browser/autofill/form_input_accessory_view_handler.h
@@ -7,13 +7,15 @@ #import "ios/chrome/browser/autofill/form_input_navigator.h" -@class JsSuggestionManager; +namespace autofill { +class JsSuggestionManager; +} // namespace autofill // This handles user actions in the default keyboard accessory view buttons. @interface FormInputAccessoryViewHandler : NSObject <FormInputNavigator> // The JS manager for interacting with the underlying form. -@property(nonatomic, weak) JsSuggestionManager* JSSuggestionManager; +@property(nonatomic) autofill::JsSuggestionManager* JSSuggestionManager; // Resets the metrics logger of the instance. - (void)reset;
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm b/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm index a26bdfa..2d8b585 100644 --- a/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm +++ b/ios/chrome/browser/autofill/form_input_accessory_view_handler.mm
@@ -9,6 +9,7 @@ #include "base/mac/foundation_util.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" +#include "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/keyboard_accessory_metrics_logger.h" #import "components/autofill/ios/browser/js_suggestion_manager.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" @@ -255,12 +256,17 @@ } - (void)fetchPreviousAndNextElementsPresenceWithCompletionHandler: - (void (^)(BOOL, BOOL))completionHandler { + (void (^)(bool, bool))completionHandler { DCHECK(completionHandler); - [_JSSuggestionManager - fetchPreviousAndNextElementsPresenceInFrameWithID: - _lastFocusFormActivityWebFrameID - completionHandler:completionHandler]; + + if (!_JSSuggestionManager) { + completionHandler(false, false); + return; + } + + _JSSuggestionManager->FetchPreviousAndNextElementsPresenceInFrameWithID( + base::SysNSStringToUTF8(_lastFocusFormActivityWebFrameID), + base::BindOnce(completionHandler)); } #pragma mark - Private @@ -272,11 +278,12 @@ NSString* actionName = kFormSuggestionAssistButtonDone; BOOL performedAction = [self executeFormAssistAction:actionName]; - if (!performedAction && [_lastFocusFormActivityWebFrameID length]) { + if (!performedAction && [_lastFocusFormActivityWebFrameID length] && + _JSSuggestionManager) { // We could not find the built-in form assist controls, so try to focus // the next or previous control using JavaScript. - [_JSSuggestionManager - closeKeyboardForFrameWithID:_lastFocusFormActivityWebFrameID]; + _JSSuggestionManager->CloseKeyboardForFrameWithID( + base::SysNSStringToUTF8(_lastFocusFormActivityWebFrameID)); } if (loggingButtonPressed) { _keyboardAccessoryMetricsLogger->OnCloseButtonPressed(); @@ -290,11 +297,11 @@ NSString* actionName = kFormSuggestionAssistButtonPreviousElement; BOOL performedAction = [self executeFormAssistAction:actionName]; - if (!performedAction) { + if (!performedAction && _JSSuggestionManager) { // We could not find the built-in form assist controls, so try to focus // the next or previous control using JavaScript. - [_JSSuggestionManager - selectPreviousElementInFrameWithID:_lastFocusFormActivityWebFrameID]; + _JSSuggestionManager->SelectPreviousElementInFrameWithID( + base::SysNSStringToUTF8(_lastFocusFormActivityWebFrameID)); } if (loggingButtonPressed) { _keyboardAccessoryMetricsLogger->OnPreviousButtonPressed(); @@ -308,11 +315,11 @@ NSString* actionName = kFormSuggestionAssistButtonNextElement; BOOL performedAction = [self executeFormAssistAction:actionName]; - if (!performedAction) { + if (!performedAction && _JSSuggestionManager) { // We could not find the built-in form assist controls, so try to focus // the next or previous control using JavaScript. - [_JSSuggestionManager - selectNextElementInFrameWithID:_lastFocusFormActivityWebFrameID]; + _JSSuggestionManager->SelectNextElementInFrameWithID( + base::SysNSStringToUTF8(_lastFocusFormActivityWebFrameID)); } if (loggingButtonPressed) { _keyboardAccessoryMetricsLogger->OnNextButtonPressed();
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_handler_unittest.mm b/ios/chrome/browser/autofill/form_input_accessory_view_handler_unittest.mm index 22f9c78..54472cf 100644 --- a/ios/chrome/browser/autofill/form_input_accessory_view_handler_unittest.mm +++ b/ios/chrome/browser/autofill/form_input_accessory_view_handler_unittest.mm
@@ -23,10 +23,7 @@ [[FormInputAccessoryViewHandler alloc] init]; ASSERT_TRUE(accessory_view_delegate); [accessory_view_delegate closeKeyboardWithoutButtonPress]; - CRWJSInjectionReceiver* injection_receiver = - web_state()->GetJSInjectionReceiver(); accessory_view_delegate.JSSuggestionManager = - base::mac::ObjCCastStrict<JsSuggestionManager>( - [injection_receiver instanceOfClass:[JsSuggestionManager class]]); + autofill::JsSuggestionManager::GetOrCreateForWebState(web_state()); [accessory_view_delegate closeKeyboardWithoutButtonPress]; }
diff --git a/ios/chrome/browser/autofill/form_input_navigator.h b/ios/chrome/browser/autofill/form_input_navigator.h index e0dc03bd..f03704f 100644 --- a/ios/chrome/browser/autofill/form_input_navigator.h +++ b/ios/chrome/browser/autofill/form_input_navigator.h
@@ -30,11 +30,11 @@ // Called when updating the keyboard view. Checks if the page contains a next // and a previous element. -// |completionHandler| is called with 2 BOOLs, the first indicating if a +// |completionHandler| is called with 2 bools, the first indicating if a // previous element was found, and the second indicating if a next element was // found. |completionHandler| cannot be nil. - (void)fetchPreviousAndNextElementsPresenceWithCompletionHandler: - (void (^)(BOOL, BOOL))completionHandler; + (void (^)(bool, bool))completionHandler; @end
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller.h b/ios/chrome/browser/autofill/form_suggestion_controller.h index 41e0889..2d1755b 100644 --- a/ios/chrome/browser/autofill/form_suggestion_controller.h +++ b/ios/chrome/browser/autofill/form_suggestion_controller.h
@@ -52,12 +52,6 @@ @interface FormSuggestionController (ForTesting) -// Initializes a new controller in the same way as the public initializer, but -// supports specifying a JsSuggestionManager for testing. -- (instancetype)initWithWebState:(web::WebState*)webState - providers:(NSArray*)providers - JsSuggestionManager:(JsSuggestionManager*)jsSuggestionManager; - // Overrides the web view proxy. - (void)setWebViewProxy:(id<CRWWebViewProxy>)webViewProxy;
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller.mm b/ios/chrome/browser/autofill/form_suggestion_controller.mm index e6a36bb..c6e29fd 100644 --- a/ios/chrome/browser/autofill/form_suggestion_controller.mm +++ b/ios/chrome/browser/autofill/form_suggestion_controller.mm
@@ -110,9 +110,6 @@ // Bridge to observe the web state from Objective-C. std::unique_ptr<web::WebStateObserverBridge> _webStateObserverBridge; - // Manager for FormSuggestion JavaScripts. - JsSuggestionManager* _jsSuggestionManager; - // The provider for the current set of suggestions. __weak id<FormSuggestionProvider> _provider; } @@ -120,8 +117,7 @@ @synthesize formInputNavigator = _formInputNavigator; - (instancetype)initWithWebState:(web::WebState*)webState - providers:(NSArray*)providers - JsSuggestionManager:(JsSuggestionManager*)jsSuggestionManager { + providers:(NSArray*)providers { self = [super init]; if (self) { DCHECK(webState); @@ -130,24 +126,11 @@ std::make_unique<web::WebStateObserverBridge>(self); _webState->AddObserver(_webStateObserverBridge.get()); _webViewProxy = webState->GetWebViewProxy(); - _jsSuggestionManager = jsSuggestionManager; _suggestionProviders = [providers copy]; } return self; } -- (instancetype)initWithWebState:(web::WebState*)webState - providers:(NSArray*)providers { - JsSuggestionManager* jsSuggestionManager = - base::mac::ObjCCast<JsSuggestionManager>( - [webState->GetJSInjectionReceiver() - instanceOfClass:[JsSuggestionManager class]]); - [jsSuggestionManager setWebFramesManager:webState->GetWebFramesManager()]; - return [self initWithWebState:webState - providers:providers - JsSuggestionManager:jsSuggestionManager]; -} - - (void)dealloc { if (_webState) { _webState->RemoveObserver(_webStateObserverBridge.get());
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm index a4289e4a..2da9678 100644 --- a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm +++ b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
@@ -156,10 +156,6 @@ void SetUp() override { PlatformTest::SetUp(); - // Mock out the JsSuggestionManager. - mock_js_suggestion_manager_ = - [OCMockObject niceMockForClass:[JsSuggestionManager class]]; - fake_web_state_.SetWebViewProxy(mock_web_view_proxy_); } @@ -172,10 +168,9 @@ // Sets up |suggestion_controller_| with the specified array of // FormSuggestionProviders. void SetUpController(NSArray* providers) { - suggestion_controller_ = [[FormSuggestionController alloc] - initWithWebState:&fake_web_state_ - providers:providers - JsSuggestionManager:mock_js_suggestion_manager_]; + suggestion_controller_ = + [[FormSuggestionController alloc] initWithWebState:&fake_web_state_ + providers:providers]; [suggestion_controller_ setWebViewProxy:mock_web_view_proxy_]; id mock_consumer = [OCMockObject @@ -217,7 +212,6 @@ [accessory_mediator_ injectWebState:&fake_web_state_]; [accessory_mediator_ injectProvider:suggestion_controller_]; - [accessory_mediator_ injectSuggestionManager:mock_js_suggestion_manager_]; } // The FormSuggestionController under test. @@ -226,9 +220,6 @@ // The suggestions the controller sent to the client, if any. NSArray* received_suggestions_; - // Mock JsSuggestionManager for verifying interactions. - id mock_js_suggestion_manager_; - // Mock CRWWebViewProxy for verifying interactions. id mock_web_view_proxy_; @@ -253,7 +244,6 @@ fake_web_state_.SetCurrentURL(GURL("data:text/html;charset=utf8;base64,")); fake_web_state_.OnPageLoaded(web::PageLoadCompletionStatus::SUCCESS); EXPECT_FALSE(received_suggestions_.count); - EXPECT_OCMOCK_VERIFY(mock_js_suggestion_manager_); } // Tests that pages whose content isn't HTML aren't processed.
diff --git a/ios/chrome/browser/autofill/js_suggestion_manager_unittest.mm b/ios/chrome/browser/autofill/js_suggestion_manager_unittest.mm index 99937d4..a1641ea 100644 --- a/ios/chrome/browser/autofill/js_suggestion_manager_unittest.mm +++ b/ios/chrome/browser/autofill/js_suggestion_manager_unittest.mm
@@ -31,7 +31,7 @@ JsSuggestionManagerTest() : ChromeWebTest(std::make_unique<ChromeWebClient>()) {} // Returns the frame ID for the main frame of |web_state()|'s current page. - NSString* GetFrameIdForMainFrame(); + std::string GetFrameIdForMainFrame(); // Helper method that initializes a form with three fields. Can be used to // test whether adding an attribute on the second field causes it to be // skipped (or not, as is appropriate) by selectNextElement. @@ -47,19 +47,17 @@ return [GetActiveElementName() isEqualToString:name]; }); } - JsSuggestionManager* manager_; + autofill::JsSuggestionManager* manager_; }; void JsSuggestionManagerTest::SetUp() { ChromeWebTest::SetUp(); - manager_ = [[JsSuggestionManager alloc] - initWithReceiver:web_state()->GetJSInjectionReceiver()]; - [manager_ setWebFramesManager:web_state()->GetWebFramesManager()]; + manager_ = autofill::JsSuggestionManager::GetOrCreateForWebState(web_state()); } -NSString* JsSuggestionManagerTest::GetFrameIdForMainFrame() { +std::string JsSuggestionManagerTest::GetFrameIdForMainFrame() { web::WebFramesManager* manager = web_state()->GetWebFramesManager(); - return base::SysUTF8ToNSString(manager->GetMainWebFrame()->GetFrameId()); + return manager->GetMainWebFrame()->GetFrameId(); } TEST_F(JsSuggestionManagerTest, InitAndInject) { @@ -234,24 +232,22 @@ ExecuteJavaScript(@"document.getElementsByName('firstname')[0].focus()"); - [manager_ selectNextElementInFrameWithID:GetFrameIdForMainFrame()]; + manager_->SelectNextElementInFrameWithID(GetFrameIdForMainFrame()); EXPECT_TRUE(WaitUntilElementSelected(@"lastname")); __block BOOL block_was_called = NO; - [manager_ - fetchPreviousAndNextElementsPresenceInFrameWithID:GetFrameIdForMainFrame() - completionHandler:^void( - BOOL has_previous_element, - BOOL has_next_element) { - block_was_called = YES; - EXPECT_TRUE(has_previous_element); - EXPECT_TRUE(has_next_element); - }]; + manager_->FetchPreviousAndNextElementsPresenceInFrameWithID( + GetFrameIdForMainFrame(), + base::BindOnce(^void(bool has_previous_element, bool has_next_element) { + block_was_called = YES; + EXPECT_TRUE(has_previous_element); + EXPECT_TRUE(has_next_element); + })); base::test::ios::WaitUntilCondition(^bool() { return block_was_called; }); - [manager_ selectNextElementInFrameWithID:GetFrameIdForMainFrame()]; + manager_->SelectNextElementInFrameWithID(GetFrameIdForMainFrame()); EXPECT_TRUE(WaitUntilElementSelected(@"email")); - [manager_ selectPreviousElementInFrameWithID:GetFrameIdForMainFrame()]; + manager_->SelectPreviousElementInFrameWithID(GetFrameIdForMainFrame()); EXPECT_TRUE(WaitUntilElementSelected(@"lastname")); } @@ -266,7 +262,7 @@ attribute]); ExecuteJavaScript(@"document.getElementsByName('firstname')[0].focus()"); EXPECT_NSEQ(@"firstname", GetActiveElementName()); - [manager_ selectNextElementInFrameWithID:GetFrameIdForMainFrame()]; + manager_->SelectNextElementInFrameWithID(GetFrameIdForMainFrame()); if (shouldSkip) EXPECT_TRUE(WaitUntilElementSelected(@"lastname")); else @@ -331,7 +327,7 @@ @"select.onblur = function(){window.location.href = '#test'}"); ExecuteJavaScript(@"select.focus()"); // In the failure condition the app will crash during the next line. - [manager_ closeKeyboardForFrameWithID:GetFrameIdForMainFrame()]; + manager_->CloseKeyboardForFrameWithID(GetFrameIdForMainFrame()); // TODO(crbug.com/661624): add a check for the keyboard actually being // dismissed; unfortunately it is not known how to adapt // WaitForBackgroundTasks to yield for events wrapped with window.setTimeout() @@ -339,7 +335,7 @@ } // Test fixture to test -// |fetchPreviousAndNextElementsPresenceWithCompletionHandler|. +// |FetchPreviousAndNextElementsPresenceInFrameWithID|. class FetchPreviousAndNextExceptionTest : public JsSuggestionManagerTest { public: void SetUp() override { @@ -349,20 +345,18 @@ protected: // Evaluates JS and tests that the completion handler passed to - // |fetchPreviousAndNextElementsPresenceWithCompletionHandler| is called with - // (NO, NO) indicating no previous and next element. + // |FetchPreviousAndNextElementsPresenceInFrameWithID| is called with + // (false, false) indicating no previous and next element. void EvaluateJavaScriptAndExpectNoPreviousAndNextElement(NSString* js) { ExecuteJavaScript(js); __block BOOL block_was_called = NO; - id completionHandler = ^(BOOL hasPreviousElement, BOOL hasNextElement) { - EXPECT_FALSE(hasPreviousElement); - EXPECT_FALSE(hasNextElement); - block_was_called = YES; - }; - [manager_ - fetchPreviousAndNextElementsPresenceInFrameWithID: - GetFrameIdForMainFrame() - completionHandler:completionHandler]; + manager_->FetchPreviousAndNextElementsPresenceInFrameWithID( + GetFrameIdForMainFrame(), + base::BindOnce(^(bool hasPreviousElement, bool hasNextElement) { + EXPECT_FALSE(hasPreviousElement); + EXPECT_FALSE(hasNextElement); + block_was_called = YES; + })); base::test::ios::WaitUntilCondition(^bool() { base::RunLoop().RunUntilIdle(); return block_was_called;
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 3523871..27bc8be 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -222,6 +222,19 @@ {"Native UI", kDiscoverFeedInNtpEnableNativeUI, base::size(kDiscoverFeedInNtpEnableNativeUI), nullptr}}; +const FeatureEntry::FeatureParam kWebViewNativeContextMenuWeb[] = { + {web::features::kWebViewNativeContextMenuName, + web::features::kWebViewNativeContextMenuParameterWeb}}; +const FeatureEntry::FeatureParam kWebViewNativeContextMenuSystem[] = { + {web::features::kWebViewNativeContextMenuName, + web::features::kWebViewNativeContextMenuParameterSystem}}; + +const FeatureEntry::FeatureVariation kWebViewNativeContextMenuVariations[] = { + {"Web", kWebViewNativeContextMenuWeb, + base::size(kWebViewNativeContextMenuWeb), nullptr}, + {"System", kWebViewNativeContextMenuSystem, + base::size(kWebViewNativeContextMenuSystem), nullptr}}; + // To add a new entry, add to the end of kFeatureEntries. There are four // distinct types of entries: // . ENABLE_DISABLE_VALUE: entry is either enabled, disabled, or uses the @@ -562,7 +575,9 @@ {"web-view-native-context-menu", flag_descriptions::kWebViewNativeContextMenuName, flag_descriptions::kWebViewNativeContextMenuDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(web::features::kWebViewNativeContextMenu)}, + FEATURE_WITH_PARAMS_VALUE_TYPE(web::features::kWebViewNativeContextMenu, + kWebViewNativeContextMenuVariations, + "WebViewNativeContextMenu")}, {"location-permissions-prompt", flag_descriptions::kLocationPermissionsPromptName, flag_descriptions::kLocationPermissionsPromptDescription, flags_ui::kOsIos,
diff --git a/ios/chrome/browser/history/domain_diversity_reporter_factory.mm b/ios/chrome/browser/history/domain_diversity_reporter_factory.mm index afaf397..1f983d2 100644 --- a/ios/chrome/browser/history/domain_diversity_reporter_factory.mm +++ b/ios/chrome/browser/history/domain_diversity_reporter_factory.mm
@@ -54,6 +54,10 @@ ios::HistoryServiceFactory::GetForBrowserState( chrome_browser_state, ServiceAccessType::EXPLICIT_ACCESS); + // Only build DomainDiversityReporter service with a valid |history_service|. + if (!history_service) + return nullptr; + return std::make_unique<DomainDiversityReporter>( history_service, chrome_browser_state->GetPrefs(), base::DefaultClock::GetInstance());
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index 491b312..d621f52 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -1226,11 +1226,6 @@ ON_CALL(*store_, IsAbleToSavePasswords).WillByDefault(Return(true)); std::unique_ptr<TestChromeBrowserState> browser_state(builder.Build()); - id mock_js_injection_receiver = - [OCMockObject mockForClass:[CRWJSInjectionReceiver class]]; - [[mock_js_injection_receiver expect] executeJavaScript:[OCMArg any] - completionHandler:[OCMArg any]]; - web_state_.SetJSInjectionReceiver(mock_js_injection_receiver); ON_CALL(web_state_, GetBrowserState) .WillByDefault(testing::Return(browser_state.get())); UniqueIDDataTabHelper::CreateForWebState(&web_state_);
diff --git a/ios/chrome/browser/prerender/preload_controller.mm b/ios/chrome/browser/prerender/preload_controller.mm index 5adbd51..62b108c 100644 --- a/ios/chrome/browser/prerender/preload_controller.mm +++ b/ios/chrome/browser/prerender/preload_controller.mm
@@ -144,7 +144,7 @@ // Maximum time to let a cancelled webState attempt to finish restore. static const size_t kMaximumCancelledWebStateDelay = 2; -// Used to enable the workaround for a WebKit crash, see crbug.com/1032928. +// Kill switch guarding a workaround for a WebKit crash, see crbug.com/1032928. const base::Feature kPreloadDelayWebStateReset{ "PreloadDelayWebStateReset", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/alert_view/alert_view_controller.mm b/ios/chrome/browser/ui/alert_view/alert_view_controller.mm index fd34467..15386933 100644 --- a/ios/chrome/browser/ui/alert_view/alert_view_controller.mm +++ b/ios/chrome/browser/ui/alert_view/alert_view_controller.mm
@@ -144,8 +144,7 @@ self.contentView = [[UIView alloc] init]; self.contentView.accessibilityIdentifier = self.alertAccessibilityIdentifier; self.contentView.clipsToBounds = YES; - self.contentView.backgroundColor = - [UIColor colorNamed:kPrimaryBackgroundColor]; + self.contentView.backgroundColor = UIColor.cr_systemBackgroundColor; self.contentView.layer.cornerRadius = kCornerRadius; self.contentView.layer.shadowOffset = CGSizeMake(kShadowOffsetX, kShadowOffsetY); @@ -295,8 +294,7 @@ } stackHolder.layer.borderWidth = 1.0 / [UIScreen mainScreen].scale; stackHolder.clipsToBounds = YES; - stackHolder.backgroundColor = - [UIColor colorNamed:kSecondaryBackgroundColor]; + stackHolder.backgroundColor = UIColor.cr_secondarySystemBackgroundColor; stackHolder.translatesAutoresizingMaskIntoConstraints = NO; self.textFieldStackHolder = stackHolder;
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/gradient_view.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/gradient_view.mm index 220c77a..44cb6fd 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/gradient_view.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/gradient_view.mm
@@ -5,7 +5,7 @@ #import "ios/chrome/browser/ui/authentication/signin/user_signin/gradient_view.h" #import "base/mac/foundation_util.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -53,9 +53,8 @@ [CATransaction setDisableActions:YES]; self.gradientLayer.colors = @[ - (id)[[UIColor colorNamed:kPrimaryBackgroundColor] colorWithAlphaComponent:0] - .CGColor, - (id)[UIColor colorNamed:kPrimaryBackgroundColor].CGColor, + (id)[UIColor.cr_systemBackgroundColor colorWithAlphaComponent:0].CGColor, + (id)UIColor.cr_systemBackgroundColor.CGColor, ]; [CATransaction commit]; }
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm index 5bd1c58..87f3094a 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
@@ -23,6 +23,7 @@ #import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h" #import "ios/chrome/browser/ui/commands/browsing_data_commands.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" +#import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/unified_consent/unified_consent_service_factory.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -213,6 +214,15 @@ [self interruptUserSigninUIWithAction:action completion:completion]; } +- (void)stop { + DCHECK(!self.viewController); + DCHECK(!self.mediator); + DCHECK(!self.unifiedConsentCoordinator); + DCHECK(!self.addAccountSigninCoordinator); + DCHECK(!self.advancedSettingsSigninCoordinator); + [super stop]; +} + #pragma mark - UnifiedConsentCoordinatorDelegate - (void)unifiedConsentCoordinatorDidTapSettingsLink: @@ -432,8 +442,7 @@ // Avoid presenting the promo if the current device orientation is not // supported. The promo will be presented at a later moment, when the // device orientation is supported. - UIInterfaceOrientation orientation = - [UIApplication sharedApplication].statusBarOrientation; + UIInterfaceOrientation orientation = GetInterfaceOrientation(); NSUInteger supportedOrientationsMask = [self.viewController supportedInterfaceOrientations]; if (!((1 << orientation) & supportedOrientationsMask)) { @@ -505,10 +514,10 @@ __weak UserSigninCoordinator* weakSelf = self; ProceduralBlock runCompletionCallback = ^{ [weakSelf - runCompletionCallbackWithSigninResult:SigninCoordinatorResultInterrupted - identity:self.unifiedConsentCoordinator - .selectedIdentity - showAdvancedSettingsSignin:NO]; + viewControllerDismissedWithResult:SigninCoordinatorResultInterrupted + identity:weakSelf.unifiedConsentCoordinator + .selectedIdentity + settingsLinkWasTapped:NO]; if (completion) { completion(); }
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm index 90ad96b..c93c77f 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm
@@ -12,6 +12,7 @@ #import "ios/chrome/browser/ui/authentication/signin/user_signin/gradient_view.h" #import "ios/chrome/browser/ui/util/rtl_geometry.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/common/ui/util/pointer_interaction_util.h" @@ -306,7 +307,7 @@ #pragma mark - Properties - (UIColor*)systemBackgroundColor { - return [UIColor colorNamed:kPrimaryBackgroundColor]; + return UIColor.cr_systemBackgroundColor; } - (NSString*)confirmationButtonTitle {
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm index 6d8ccf65..538e5e18 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm
@@ -12,7 +12,6 @@ #import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_constants.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/common/ui/util/pointer_interaction_util.h" @@ -48,7 +47,7 @@ if (self) { self.accessibilityIdentifier = kIdentityPickerViewIdentifier; self.layer.cornerRadius = kIdentityPickerViewRadius; - self.backgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor]; + self.backgroundColor = UIColor.cr_secondarySystemBackgroundColor; // Adding view elements inside. // Ink view. _rippleView = [[MDCRippleView alloc] initWithFrame:CGRectZero];
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm index 10c7f114..1f2f4900 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
@@ -193,7 +193,7 @@ // Separator. UIView* separator = [[UIView alloc] initWithFrame:CGRectZero]; separator.translatesAutoresizingMaskIntoConstraints = NO; - separator.backgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor]; + separator.backgroundColor = UIColor.cr_secondarySystemBackgroundColor; [container addSubview:separator]; // Customize label.
diff --git a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm index f4f718d..b40bbe9 100644 --- a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm +++ b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
@@ -22,6 +22,7 @@ #import "ios/chrome/browser/ui/collection_view/collection_view_controller.h" #import "ios/chrome/browser/ui/collection_view/collection_view_model.h" #import "ios/chrome/browser/ui/util/rtl_geometry.h" +#import "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ui/base/l10n/l10n_util.h" @@ -363,8 +364,7 @@ // Focus the first visible input, unless the orientation is landscape. In // landscape, the keyboard covers up the storage checkbox shown below this // view and the user might never see it. - if (UIInterfaceOrientationIsPortrait( - [UIApplication sharedApplication].statusBarOrientation)) { + if (UIInterfaceOrientationIsPortrait(GetInterfaceOrientation())) { // Also check whether any of the inputs are already the first responder and // are non-empty, in which case the focus should be left there. if ((!CVC.monthInput.isFirstResponder || CVC.monthInput.text.length == 0) &&
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h index 63bbcbf..40d289a0 100644 --- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.h
@@ -18,7 +18,6 @@ @protocol FormInputAccessoryConsumer; @class FormInputAccessoryMediator; @protocol FormInputSuggestionsProvider; -@class JsSuggestionManager; @class ReauthenticationModule; @protocol SecurityAlertCommands; @@ -86,9 +85,6 @@ // The WebState this instance is observing. Can be null. - (void)injectWebState:(web::WebState*)webState; -// The JS manager for interacting with the underlying form. -- (void)injectSuggestionManager:(JsSuggestionManager*)JSSuggestionManager; - // Replaces the object in charge of providing suggestions. - (void)injectProvider:(id<FormInputSuggestionsProvider>)provider;
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm index eb1d693..2ecaa70 100644 --- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
@@ -73,9 +73,6 @@ @property(nonatomic, strong) FormInputAccessoryViewHandler* formInputAccessoryHandler; -// The JS manager for interacting with the underlying form. -@property(nonatomic, weak) JsSuggestionManager* JSSuggestionManager; - // The observer to determine when the keyboard dissapears and when it stays. @property(nonatomic, strong) KeyboardObserverHelper* keyboardObserver; @@ -164,12 +161,6 @@ web::WebState* webState = webStateList->GetActiveWebState(); if (webState) { _webState = webState; - CRWJSInjectionReceiver* injectionReceiver = - webState->GetJSInjectionReceiver(); - _JSSuggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>( - [injectionReceiver instanceOfClass:[JsSuggestionManager class]]); - [_JSSuggestionManager - setWebFramesManager:webState->GetWebFramesManager()]; FormSuggestionTabHelper* tabHelper = FormSuggestionTabHelper::FromWebState(webState); if (tabHelper) { @@ -184,7 +175,10 @@ } } _formInputAccessoryHandler = [[FormInputAccessoryViewHandler alloc] init]; - _formInputAccessoryHandler.JSSuggestionManager = _JSSuggestionManager; + _formInputAccessoryHandler.JSSuggestionManager = + _webState + ? autofill::JsSuggestionManager::GetOrCreateForWebState(_webState) + : nullptr; NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter]; [defaultCenter addObserver:self @@ -464,7 +458,7 @@ __weak __typeof(self) weakSelf = self; [self.formInputAccessoryHandler fetchPreviousAndNextElementsPresenceWithCompletionHandler:^( - BOOL previousButtonEnabled, BOOL nextButtonEnabled) { + bool previousButtonEnabled, bool nextButtonEnabled) { weakSelf.consumer.formInputNextButtonEnabled = nextButtonEnabled; weakSelf.consumer.formInputPreviousButtonEnabled = previousButtonEnabled; @@ -483,21 +477,15 @@ webState->AddObserver(_webStateObserverBridge.get()); _formActivityObserverBridge = std::make_unique<autofill::FormActivityObserverBridge>(webState, self); - CRWJSInjectionReceiver* injectionReceiver = - webState->GetJSInjectionReceiver(); - self.JSSuggestionManager = base::mac::ObjCCastStrict<JsSuggestionManager>( - [injectionReceiver instanceOfClass:[JsSuggestionManager class]]); - [self.JSSuggestionManager - setWebFramesManager:webState->GetWebFramesManager()]; FormSuggestionTabHelper* tabHelper = FormSuggestionTabHelper::FromWebState(webState); if (tabHelper) { self.provider = tabHelper->GetAccessoryViewProvider(); } - _formInputAccessoryHandler.JSSuggestionManager = self.JSSuggestionManager; + _formInputAccessoryHandler.JSSuggestionManager = + autofill::JsSuggestionManager::GetOrCreateForWebState(webState); } else { self.webState = nullptr; - self.JSSuggestionManager = nil; self.provider = nil; } } @@ -703,11 +691,6 @@ std::make_unique<autofill::FormActivityObserverBridge>(_webState, self); } -- (void)injectSuggestionManager:(JsSuggestionManager*)JSSuggestionManager { - _JSSuggestionManager = JSSuggestionManager; - _formInputAccessoryHandler.JSSuggestionManager = _JSSuggestionManager; -} - - (void)injectProvider:(id<FormInputSuggestionsProvider>)provider { self.provider = provider; }
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 index ff0ac7a..11f389b 100644 --- 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
@@ -55,7 +55,7 @@ @property(nonatomic, readonly) CRWJSInjectionReceiver* injectionReceiver; // Convenience getter for the current suggestion manager. -@property(nonatomic, readonly) JsSuggestionManager* suggestionManager; +@property(nonatomic, readonly) autofill::JsSuggestionManager* suggestionManager; // Interface for |reauthenticationModule|, handling mostly the case when no // hardware for authentication is available. @@ -192,14 +192,14 @@ return nil; } -- (JsSuggestionManager*)suggestionManager { - JsSuggestionManager* manager = base::mac::ObjCCastStrict<JsSuggestionManager>( - [self.injectionReceiver instanceOfClass:[JsSuggestionManager class]]); +- (autofill::JsSuggestionManager*)suggestionManager { + autofill::JsSuggestionManager* suggestionManager = nullptr; web::WebState* webState = self.webStateList->GetActiveWebState(); if (webState) { - [manager setWebFramesManager:webState->GetWebFramesManager()]; + suggestionManager = + autofill::JsSuggestionManager::GetOrCreateForWebState(webState); } - return manager; + return suggestionManager; } #pragma mark - Private
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm index 7cd5405d..f09595a 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm
@@ -6,7 +6,7 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -16,7 +16,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + self.view.backgroundColor = UIColor.cr_systemBackgroundColor; self.navigationBar.accessibilityIdentifier = kBookmarkNavigationBarIdentifier; }
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index e493c7e..4e6a693 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -606,6 +606,11 @@ @property(nonatomic, strong) BrowserViewHiderCoordinator* browserViewHiderCoordinator; +// Whether the view has been translated for thumb strip usage when smooth +// scrolling has been enabled. This allows the correct setup to be done when +// displaying a new web state. +@property(nonatomic, assign) BOOL viewTranslatedForSmoothScrolling; + // BVC initialization // ------------------ // If the BVC is initialized with a valid browser state & tab model immediately, @@ -1439,7 +1444,6 @@ [self installFakeStatusBar]; [self buildToolbarAndTabStrip]; [self setUpViewLayout:YES]; - [self addConstraintsToTabStrip]; [self addConstraintsToToolbar]; // If the tab model and browser state are valid, finish initialization. @@ -2282,6 +2286,7 @@ [self addChildViewController:self.tabStripCoordinator.viewController]; self.tabStripView = self.tabStripCoordinator.view; [self.view addSubview:self.tabStripView]; + [self addConstraintsToTabStrip]; } [self.view insertSubview:primaryToolbarView aboveSubview:self.tabStripView]; @@ -2408,7 +2413,15 @@ // Make new content visible, resizing it first as the orientation may // have changed from the last time it was displayed. CGRect webStateViewFrame = self.contentArea.bounds; - if (!fullscreen::features::ShouldUseSmoothScrolling()) { + if (fullscreen::features::ShouldUseSmoothScrolling()) { + // If the view was translated for the thumb strip, make sure to re-apply + // that translation here. + if (self.viewTranslatedForSmoothScrolling) { + CGFloat toolbarHeight = [self expandedTopToolbarHeight]; + webStateViewFrame = UIEdgeInsetsInsetRect( + webStateViewFrame, UIEdgeInsetsMake(toolbarHeight, 0, 0, 0)); + } + } else { // If the Smooth Scrolling is on, the WebState view is not // resized, and should always match the bounds of the content area. When // the provider is not initialized, viewport insets resize the webview, so @@ -2908,25 +2921,32 @@ // frame must be moved down and the content inset is decreased. To prevent // the actual web content from jumping, the content offset must be moved up // by a corresponding amount. - if (self.currentWebState && ![self isNTPActiveForCurrentWebState] && - fullscreen::features::ShouldUseSmoothScrolling()) { + if (fullscreen::features::ShouldUseSmoothScrolling()) { + self.viewTranslatedForSmoothScrolling = YES; CGFloat toolbarHeight = [self expandedTopToolbarHeight]; - CGRect webStateViewFrame = UIEdgeInsetsInsetRect( - [self viewForWebState:self.currentWebState].frame, - UIEdgeInsetsMake(toolbarHeight, 0, 0, 0)); - [self viewForWebState:self.currentWebState].frame = webStateViewFrame; + if (self.currentWebState) { + CGRect webStateViewFrame = UIEdgeInsetsInsetRect( + [self viewForWebState:self.currentWebState].frame, + UIEdgeInsetsMake(toolbarHeight, 0, 0, 0)); + [self viewForWebState:self.currentWebState].frame = webStateViewFrame; + } - CRWWebViewScrollViewProxy* scrollProxy = - self.currentWebState->GetWebViewProxy().scrollViewProxy; - CGPoint scrollOffset = scrollProxy.contentOffset; - scrollOffset.y += toolbarHeight; - scrollProxy.contentOffset = scrollOffset; - - // TODO(crbug.com/1155536): Inform FullscreenController about these - // changes and allow it to calculate the correct overall contentInset. - UIEdgeInsets contentInset = scrollProxy.contentInset; - contentInset.top -= toolbarHeight; - scrollProxy.contentInset = contentInset; + // Translate all web states' offset so web states from other tabs are also + // updated. + if (self.browser) { + WebStateList* webStateList = self.browser->GetWebStateList(); + for (int index = 0; index < webStateList->count(); ++index) { + web::WebState* webState = webStateList->GetWebStateAt(index); + CRWWebViewScrollViewProxy* scrollProxy = + webState->GetWebViewProxy().scrollViewProxy; + CGPoint scrollOffset = scrollProxy.contentOffset; + scrollOffset.y += toolbarHeight; + scrollProxy.contentOffset = scrollOffset; + } + } + // This alerts the fullscreen controller to use the correct new content + // insets. + self.fullscreenController->FreezeToolbarHeight(true); } } } @@ -2973,25 +2993,31 @@ [self installFakeStatusBar]; [self setupStatusBarLayout]; - // See the comments in |-willAnimateViewReveal:| for the explantation of why + // See the comments in |-willAnimateViewReveal:| for the explanation of why // this is necessary. - if (self.currentWebState && ![self isNTPActiveForCurrentWebState] && - fullscreen::features::ShouldUseSmoothScrolling()) { + if (fullscreen::features::ShouldUseSmoothScrolling()) { + self.viewTranslatedForSmoothScrolling = NO; + self.fullscreenController->FreezeToolbarHeight(false); CGFloat toolbarHeight = [self expandedTopToolbarHeight]; - CGRect webStateViewFrame = UIEdgeInsetsInsetRect( - [self viewForWebState:self.currentWebState].frame, - UIEdgeInsetsMake(-toolbarHeight, 0, 0, 0)); - [self viewForWebState:self.currentWebState].frame = webStateViewFrame; + if (self.currentWebState) { + CGRect webStateViewFrame = UIEdgeInsetsInsetRect( + [self viewForWebState:self.currentWebState].frame, + UIEdgeInsetsMake(-toolbarHeight, 0, 0, 0)); + [self viewForWebState:self.currentWebState].frame = webStateViewFrame; + } - CRWWebViewScrollViewProxy* scrollProxy = - self.currentWebState->GetWebViewProxy().scrollViewProxy; - UIEdgeInsets contentInset = scrollProxy.contentInset; - contentInset.top += toolbarHeight; - scrollProxy.contentInset = contentInset; + if (self.browser) { + WebStateList* webStateList = self.browser->GetWebStateList(); + for (int index = 0; index < webStateList->count(); ++index) { + web::WebState* webState = webStateList->GetWebStateAt(index); + CRWWebViewScrollViewProxy* scrollProxy = + webState->GetWebViewProxy().scrollViewProxy; - CGPoint scrollOffset = scrollProxy.contentOffset; - scrollOffset.y -= toolbarHeight; - scrollProxy.contentOffset = scrollOffset; + CGPoint scrollOffset = scrollProxy.contentOffset; + scrollOffset.y -= toolbarHeight; + scrollProxy.contentOffset = scrollOffset; + } + } } } } @@ -3268,7 +3294,8 @@ - (void)webState:(web::WebState*)webState handleContextMenu:(const web::ContextMenuParams&)params { - DCHECK(!web::features::UseWebViewNativeContextMenu()); + DCHECK(!web::features::UseWebViewNativeContextMenuWeb() && + !web::features::UseWebViewNativeContextMenuSystem()); // Prevent context menu from displaying for a tab which is no longer the // current one. if (webState != self.currentWebState) {
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 a62dbb3..efe8c6ee 100644 --- a/ios/chrome/browser/ui/collection_view/collection_view_controller.mm +++ b/ios/chrome/browser/ui/collection_view/collection_view_controller.mm
@@ -13,7 +13,7 @@ #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/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -65,10 +65,9 @@ } // Suport dark mode. - self.collectionView.backgroundColor = - [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + self.collectionView.backgroundColor = UIColor.cr_systemGroupedBackgroundColor; self.styler.cellBackgroundColor = - [UIColor colorNamed:kGroupedSecondaryBackgroundColor]; + UIColor.cr_secondarySystemGroupedBackgroundColor; } - (void)contentSizeCategoryDidChange:(id)sender {
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index f9455f4..018bb9c 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -298,7 +298,7 @@ changeDiscoverFeedHeaderVisibility:[self.contentSuggestionsVisible value]]; self.suggestionsViewController.contentSuggestionsEnabled = - prefs->FindPreference(prefs::kArticlesForYouEnabled); + contentSuggestionsEnabled; self.suggestionsViewController.handler = self; self.contentSuggestionsMediator.consumer = self.suggestionsViewController;
diff --git a/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm b/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm index a87ae86..29a07fc 100644 --- a/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm +++ b/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/fancy_ui/primary_action_button.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/pointer_interaction_util.h" @@ -42,7 +43,7 @@ } #endif // defined(__IPHONE_13_4) - UIColor* hintColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + UIColor* hintColor = UIColor.cr_systemBackgroundColor; UIColor* inkColor = [UIColor colorWithWhite:1 alpha:0.2f]; UIColor* backgroundColor = [UIColor colorNamed:kBlueColor]; UIColor* disabledColor = [UIColor colorNamed:kDisabledTintColor];
diff --git a/ios/chrome/browser/ui/first_run/static_file_view_controller.mm b/ios/chrome/browser/ui/first_run/static_file_view_controller.mm index b61597a..68958ff 100644 --- a/ios/chrome/browser/ui/first_run/static_file_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/static_file_view_controller.mm
@@ -13,7 +13,7 @@ #import "ios/chrome/browser/ui/icons/chrome_icon.h" #import "ios/chrome/browser/ui/material_components/utils.h" #include "ios/chrome/browser/ui/util/rtl_geometry.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/web/common/web_view_creation_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -70,7 +70,7 @@ cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0]; [_webView loadRequest:request]; - [_webView setBackgroundColor:[UIColor colorNamed:kPrimaryBackgroundColor]]; + [_webView setBackgroundColor:UIColor.cr_systemBackgroundColor]; [self.view addSubview:_webView]; ConfigureAppBarViewControllerWithCardStyle(_appBarViewController);
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h b/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h index 89a4c71..5777475 100644 --- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h +++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller.h
@@ -87,6 +87,8 @@ // 1.0. virtual void ExitFullscreen() = 0; + virtual void FreezeToolbarHeight(bool freeze_toolbar_height) = 0; + // Force horizontal content resize, when content isn't tracking resize by // itself. virtual void ResizeHorizontalViewport() = 0;
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h index de79087..495bf30 100644 --- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h +++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.h
@@ -48,6 +48,7 @@ void EnterFullscreen() override; void ExitFullscreen() override; void ResizeHorizontalViewport() override; + void FreezeToolbarHeight(bool freeze_toolbar_height) override; private:
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm index 9148bf6..a226ac2 100644 --- a/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm +++ b/ios/chrome/browser/ui/fullscreen/fullscreen_controller_impl.mm
@@ -177,3 +177,7 @@ // two relayouts. mediator_.ResizeHorizontalInsets(); } + +void FullscreenControllerImpl::FreezeToolbarHeight(bool freeze_toolbar_height) { + model_.SetFreezeToolbarHeight(freeze_toolbar_height); +}
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_model.h b/ios/chrome/browser/ui/fullscreen/fullscreen_model.h index 3b2d83b..cd4ee0e7 100644 --- a/ios/chrome/browser/ui/fullscreen/fullscreen_model.h +++ b/ios/chrome/browser/ui/fullscreen/fullscreen_model.h
@@ -46,7 +46,7 @@ // Returns the difference between the max and min toolbar heights. CGFloat toolbar_height_delta() const { - return expanded_toolbar_height_ - collapsed_toolbar_height_; + return GetExpandedToolbarHeight() - GetCollapsedToolbarHeight(); } // Returns whether the page content is tall enough for the toolbar to be @@ -57,7 +57,7 @@ // Whether the view is scrolled all the way to the top. bool is_scrolled_to_top() const { - return y_content_offset_ <= -expanded_toolbar_height_; + return y_content_offset_ <= -GetExpandedToolbarHeight(); } // Whether the view is scrolled all the way to the bottom. @@ -79,8 +79,8 @@ // Returns the toolbar insets at |progress|. UIEdgeInsets GetToolbarInsetsAtProgress(CGFloat progress) const { return UIEdgeInsetsMake( - collapsed_toolbar_height_ + - progress * (expanded_toolbar_height_ - collapsed_toolbar_height_), + GetCollapsedToolbarHeight() + progress * (GetExpandedToolbarHeight() - + GetCollapsedToolbarHeight()), 0, progress * bottom_toolbar_height_, 0); } @@ -157,6 +157,9 @@ void SetWebViewSafeAreaInsets(UIEdgeInsets safe_area_insets); UIEdgeInsets GetWebViewSafeAreaInsets() const; + void SetFreezeToolbarHeight(bool freeze_toolbar_height); + bool GetFreezeToolbarHeight() const; + private: // Returns how a scroll to the current |y_content_offset_| from |from_offset| // should be handled. @@ -234,6 +237,7 @@ UIEdgeInsets safe_area_insets_ = UIEdgeInsetsZero; // The number of FullscreenModelObserver callbacks currently being executed. size_t observer_callback_count_ = 0; + bool freeze_toolbar_height_ = false; DISALLOW_COPY_AND_ASSIGN(FullscreenModel); };
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm index e24cfa52..74f4bb3 100644 --- a/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm +++ b/ios/chrome/browser/ui/fullscreen/fullscreen_model.mm
@@ -79,7 +79,7 @@ } void FullscreenModel::SetCollapsedToolbarHeight(CGFloat height) { - if (AreCGFloatsEqual(collapsed_toolbar_height_, height)) + if (AreCGFloatsEqual(GetCollapsedToolbarHeight(), height)) return; DCHECK_GE(height, 0.0); collapsed_toolbar_height_ = height; @@ -91,11 +91,11 @@ } CGFloat FullscreenModel::GetCollapsedToolbarHeight() const { - return collapsed_toolbar_height_; + return GetFreezeToolbarHeight() ? 0 : collapsed_toolbar_height_; } void FullscreenModel::SetExpandedToolbarHeight(CGFloat height) { - if (AreCGFloatsEqual(expanded_toolbar_height_, height)) + if (AreCGFloatsEqual(GetExpandedToolbarHeight(), height)) return; DCHECK_GE(height, 0.0); expanded_toolbar_height_ = height; @@ -107,7 +107,7 @@ } CGFloat FullscreenModel::GetExpandedToolbarHeight() const { - return expanded_toolbar_height_; + return GetFreezeToolbarHeight() ? 0 : expanded_toolbar_height_; } void FullscreenModel::SetBottomToolbarHeight(CGFloat height) { @@ -247,6 +247,22 @@ return safe_area_insets_; } +void FullscreenModel::SetFreezeToolbarHeight(bool freeze_toolbar_height) { + if (freeze_toolbar_height_ == freeze_toolbar_height) { + return; + } + freeze_toolbar_height_ = freeze_toolbar_height; + base_offset_ = NAN; + ScopedIncrementer toolbar_height_incrementer(&observer_callback_count_); + for (auto& observer : observers_) { + observer.FullscreenModelToolbarHeightsUpdated(this); + } +} + +bool FullscreenModel::GetFreezeToolbarHeight() const { + return freeze_toolbar_height_; +} + FullscreenModel::ScrollAction FullscreenModel::ActionForScrollFromOffset( CGFloat from_offset) const { // Update the base offset but don't recalculate progress if: @@ -309,7 +325,7 @@ // When Smooth Scrolling is disabled, the scroll view can sometimes be // resized to account for the viewport insets after the page has been // rendered, so account for the maximum toolbar insets in the threshold. - disabling_threshold += expanded_toolbar_height_ + bottom_toolbar_height_; + disabling_threshold += GetExpandedToolbarHeight() + bottom_toolbar_height_; } else { // After reloads, pages whose viewports fit the screen are sometimes resized // to account for the safe area insets. Adding these to the threshold helps
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm index 0e7b994..f066e91 100644 --- a/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm +++ b/ios/chrome/browser/ui/fullscreen/fullscreen_model_unittest.mm
@@ -314,3 +314,16 @@ EXPECT_FALSE(model().is_scrolled_to_top()); EXPECT_TRUE(model().is_scrolled_to_bottom()); } + +// Tests that when the toolbar height is frozen, setting the height doesn't +// change the returned height until the toolbar is unfrozen. +TEST_F(FullscreenModelTest, FreezeToolbarHeight) { + model().SetFreezeToolbarHeight(true); + EXPECT_EQ(model().GetExpandedToolbarHeight(), 0); + + model().SetExpandedToolbarHeight(100); + EXPECT_EQ(model().GetExpandedToolbarHeight(), 0); + + model().SetFreezeToolbarHeight(false); + EXPECT_EQ(model().GetExpandedToolbarHeight(), 100); +}
diff --git a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h index c157f265..02a711be 100644 --- a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h +++ b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.h
@@ -41,6 +41,7 @@ void EnterFullscreen() override; void ExitFullscreen() override; void ResizeHorizontalViewport() override; + void FreezeToolbarHeight(bool freeze_toolbar_height) override; // Calls FullscreenViewportInsetRangeChanged() on observers. void OnFullscreenViewportInsetRangeChanged(UIEdgeInsets min_viewport_insets,
diff --git a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm index 78f30cf7..62206ea2 100644 --- a/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm +++ b/ios/chrome/browser/ui/fullscreen/test/test_fullscreen_controller.mm
@@ -126,3 +126,9 @@ void TestFullscreenController::ResizeHorizontalViewport() { // NOOP in tests. } + +void TestFullscreenController::FreezeToolbarHeight(bool freeze_toolbar_height) { + if (model_) { + model_->SetFreezeToolbarHeight(freeze_toolbar_height); + } +}
diff --git a/ios/chrome/browser/ui/material_components/utils.mm b/ios/chrome/browser/ui/material_components/utils.mm index b9c6a6d..bee7e27 100644 --- a/ios/chrome/browser/ui/material_components/utils.mm +++ b/ios/chrome/browser/ui/material_components/utils.mm
@@ -15,7 +15,6 @@ #include "base/mac/foundation_util.h" #import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -45,7 +44,7 @@ viewController.headerView.shiftBehavior = MDCFlexibleHeaderShiftBehaviorDisabled; viewController.headerView.backgroundColor = - [UIColor colorNamed:kSecondaryBackgroundColor]; + UIColor.cr_secondarySystemBackgroundColor; viewController.navigationBar.tintColor = UIColor.cr_labelColor; viewController.navigationBar.titleAlignment = MDCNavigationBarTitleAlignmentLeading;
diff --git a/ios/chrome/browser/ui/page_info/page_info_view_controller.mm b/ios/chrome/browser/ui/page_info/page_info_view_controller.mm index 059d1c0..ad13ac93 100644 --- a/ios/chrome/browser/ui/page_info/page_info_view_controller.mm +++ b/ios/chrome/browser/ui/page_info/page_info_view_controller.mm
@@ -68,9 +68,9 @@ - (void)viewDidLoad { [super viewDidLoad]; + self.navigationItem.titleView = + [self titleViewLabelForURL:self.pageInfoSecurityDescription.siteURL]; self.title = l10n_util::GetNSString(IDS_IOS_PAGE_INFO_SITE_INFORMATION); - self.navigationItem.prompt = self.pageInfoSecurityDescription.siteURL; - self.navigationController.navigationBar.prefersLargeTitles = NO; self.tableView.accessibilityIdentifier = kPageInfoViewAccessibilityIdentifier; UIBarButtonItem* dismissButton = [[UIBarButtonItem alloc] @@ -147,4 +147,17 @@ [self.handler showSecurityHelpPage]; } +#pragma mark - Private + +// Returns the navigationItem titleView for |siteURL|. +- (UILabel*)titleViewLabelForURL:(NSString*)siteURL { + UILabel* labelURL = [[UILabel alloc] init]; + labelURL.lineBreakMode = NSLineBreakByTruncatingHead; + labelURL.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + labelURL.text = siteURL; + labelURL.adjustsFontSizeToFitWidth = YES; + labelURL.minimumScaleFactor = 0.7; + return labelURL; +} + @end
diff --git a/ios/chrome/browser/ui/scanner/camera_controller.mm b/ios/chrome/browser/ui/scanner/camera_controller.mm index 0ee910c..201492b2 100644 --- a/ios/chrome/browser/ui/scanner/camera_controller.mm +++ b/ios/chrome/browser/ui/scanner/camera_controller.mm
@@ -8,6 +8,7 @@ #include "base/mac/foundation_util.h" #include "base/notreached.h" #include "base/strings/stringprintf.h" +#include "ios/chrome/browser/ui/util/uikit_ui_util.h" #include "ios/chrome/common/ios_app_bundle_id_prefix_buildflags.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -329,8 +330,7 @@ } - (AVCaptureVideoOrientation)videoOrientationForCurrentInterfaceOrientation { - UIInterfaceOrientation orientation = - [[UIApplication sharedApplication] statusBarOrientation]; + UIInterfaceOrientation orientation = GetInterfaceOrientation(); switch (orientation) { case UIInterfaceOrientationUnknown: return AVCaptureVideoOrientationPortrait;
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm index 46a28fc..31fdb75c 100644 --- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm +++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm
@@ -19,6 +19,7 @@ #include "ios/chrome/browser/ui/table_view/cells/table_view_url_item.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -81,9 +82,8 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; - self.styler.cellBackgroundColor = - [UIColor colorNamed:kPrimaryBackgroundColor]; + self.view.backgroundColor = UIColor.cr_systemBackgroundColor; + self.styler.cellBackgroundColor = UIColor.cr_systemBackgroundColor; self.tableView.sectionHeaderHeight = 0; self.tableView.sectionFooterHeight = 0; [self.tableView
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm index d8ce2948..dea998e 100644 --- a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm +++ b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm
@@ -16,6 +16,7 @@ #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h" #import "ios/chrome/browser/ui/table_view/table_view_utils.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -87,8 +88,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.view.backgroundColor = - [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + self.view.backgroundColor = UIColor.cr_systemGroupedBackgroundColor; self.tableView.accessibilityIdentifier = kAddCreditCardViewID; self.navigationItem.title = l10n_util::GetNSString(
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm index e45bdeca..2e822f9 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -139,10 +139,10 @@ if (!base::FeatureList::IsEnabled(kSettingsRefresh)) { self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + self.styler.cellBackgroundColor = UIColor.cr_systemBackgroundColor; + self.styler.tableViewBackgroundColor = UIColor.cr_systemBackgroundColor; self.tableView.accessibilityIdentifier = kClearBrowsingDataViewAccessibilityIdentifier; - self.styler.tableViewBackgroundColor = - [UIColor colorNamed:kPrimaryBackgroundColor]; self.tableView.backgroundColor = self.styler.tableViewBackgroundColor; // TableView configuration
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm index 09d8f10..7002d7d 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm
@@ -15,7 +15,6 @@ #import "ios/chrome/browser/ui/table_view/table_view_utils.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" -#import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -79,8 +78,7 @@ - (void)viewDidLoad { [super viewDidLoad]; if (!base::FeatureList::IsEnabled(kSettingsRefresh)) { - self.styler.tableViewBackgroundColor = - [UIColor colorNamed:kPrimaryBackgroundColor]; + self.styler.tableViewBackgroundColor = UIColor.cr_systemBackgroundColor; self.tableView.backgroundColor = self.styler.tableViewBackgroundColor; } [self loadModel];
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm index 7fa7884..befb055 100644 --- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -25,6 +25,7 @@ #include "ios/chrome/browser/ui/ui_feature_flags.h" #include "ios/chrome/browser/ui/util/ui_util.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" #include "ios/chrome/grit/ios_strings.h" @@ -288,7 +289,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + self.view.backgroundColor = UIColor.cr_systemBackgroundColor; if (base::FeatureList::IsEnabled(kSettingsRefresh)) { self.navigationBar.translucent = NO;
diff --git a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm index f20c692..29cbff5 100644 --- a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
@@ -117,7 +117,7 @@ - (void)viewDidLoad { if (!base::FeatureList::IsEnabled(kSettingsRefresh)) { self.styler.tableViewBackgroundColor = - [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + UIColor.cr_systemGroupedBackgroundColor; } UIBarButtonItem* flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace @@ -128,7 +128,7 @@ [super viewDidLoad]; self.styler.cellBackgroundColor = - [UIColor colorNamed:kGroupedSecondaryBackgroundColor]; + UIColor.cr_secondarySystemGroupedBackgroundColor; self.styler.cellTitleColor = UIColor.cr_labelColor; self.tableView.estimatedSectionHeaderHeight = kEstimatedHeaderFooterHeight; self.tableView.estimatedRowHeight = kSettingsCellDefaultHeight;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm index 2053bd3..f1d024c 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_view_controller.mm
@@ -92,6 +92,9 @@ // horizontal to grid layout. @property(nonatomic, strong) UICollectionViewTransitionLayout* gridHorizontalTransitionLayout; + +// YES while batch updates and the batch update completion are being performed. +@property(nonatomic) BOOL updating; @end @implementation GridViewController @@ -836,11 +839,15 @@ (ProceduralBlockWithBool)collectionViewUpdatesCompletion { [self.collectionView performBatchUpdates:^{ + self.updating = YES; // Synchronize model and view updates. modelUpdates(); collectionViewUpdates(); } - completion:collectionViewUpdatesCompletion]; + completion:^(BOOL completed) { + collectionViewUpdatesCompletion(completed); + self.updating = NO; + }]; } // Returns the index in |self.items| of the first item whose identifier is @@ -889,6 +896,12 @@ [self.delegate didTapPlusSignInGridViewController:self]; return; } + + // Speculative fix for crbug.com/1134663, where this method is called while + // updates from a tab insertion are processing. + if (self.updating) + return; + NSUInteger index = base::checked_cast<NSUInteger>(indexPath.item); DCHECK_LT(index, self.items.count); NSString* itemID = self.items[index].identifier;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm index fe16bb8e..41bfe54 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator.mm
@@ -82,7 +82,7 @@ } // Returns the index of the tab with |identifier| in |web_state_list|. Returns -// -1 if not found. +// WebStateList::kInvalidIndex if not found. int GetIndexOfTabWithId(WebStateList* web_state_list, NSString* identifier) { for (int i = 0; i < web_state_list->count(); i++) { web::WebState* web_state = web_state_list->GetWebStateAt(i); @@ -90,7 +90,7 @@ if ([identifier isEqualToString:tab_helper->tab_id()]) return i; } - return -1; + return WebStateList::kInvalidIndex; } // Returns the WebState with |identifier| in |web_state_list|. Returns |nullptr| @@ -241,8 +241,8 @@ if (webStateList->IsBatchInProgress()) return; // If the selected index changes as a result of the last webstate being - // detached, atIndex will be -1. - if (atIndex == -1) { + // detached, atIndex will be kInvalidIndex. + if (atIndex == WebStateList::kInvalidIndex) { [self.consumer selectItemWithID:nil]; return; } @@ -301,19 +301,36 @@ - (void)moveItemWithID:(NSString*)itemID toIndex:(NSUInteger)destinationIndex { int sourceIndex = GetIndexOfTabWithId(self.webStateList, itemID); - if (sourceIndex >= 0) + if (sourceIndex != WebStateList::kInvalidIndex) self.webStateList->MoveWebStateAt(sourceIndex, destinationIndex); } - (void)selectItemWithID:(NSString*)itemID { int index = GetIndexOfTabWithId(self.webStateList, itemID); - if (index >= 0) - self.webStateList->ActivateWebStateAt(index); + + // Don't activate non-existent indexes. + if (index == WebStateList::kInvalidIndex) + return; + + // Don't attempt a no-op activation. Normally this is not an issue, but it's + // possible that this method (-selectItemWithID:) is being called as part of + // a WebStateListObserver callback, in which case even a no-op activation + // will cause a CHECK(). + if (index == self.webStateList->active_index()) + return; + + // Avoid a reentrant activation. This is a fix for crbug.com/1134663, although + // ignoring the slection at this point may do weird things. + if (self.webStateList->IsMutating()) + return; + + // It should be safe to activate here. + self.webStateList->ActivateWebStateAt(index); } - (void)closeItemWithID:(NSString*)itemID { int index = GetIndexOfTabWithId(self.webStateList, itemID); - if (index >= 0) + if (index != WebStateList::kInvalidIndex) self.webStateList->CloseWebStateAt(index, WebStateList::CLOSE_USER_ACTION); } @@ -456,7 +473,7 @@ } // Reorder tab within same grid. int sourceIndex = GetIndexOfTabWithId(self.webStateList, tabInfo.tabID); - if (sourceIndex >= 0) + if (sourceIndex != WebStateList::kInvalidIndex) self.webStateList->MoveWebStateAt(sourceIndex, destinationIndex); return; }
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm index 6ee04a2..fb2725c 100644 --- a/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm +++ b/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm
@@ -6,6 +6,7 @@ #include "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -19,10 +20,9 @@ if (base::FeatureList::IsEnabled(kSettingsRefresh)) { _tableViewBackgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor]; - _cellBackgroundColor = - [UIColor colorNamed:kGroupedSecondaryBackgroundColor]; + _cellBackgroundColor = UIColor.cr_secondarySystemGroupedBackgroundColor; } else { - _tableViewBackgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + _tableViewBackgroundColor = UIColor.cr_systemBackgroundColor; } } return self;
diff --git a/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm b/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm index 08c4369..416f3ef 100644 --- a/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm +++ b/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm
@@ -8,6 +8,7 @@ #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h" #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" #include "ios/chrome/browser/ui/ui_feature_flags.h" +#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -42,10 +43,9 @@ self.toolbar.barTintColor = [UIColor colorNamed:kSecondaryBackgroundColor]; self.view.backgroundColor = [UIColor colorNamed:kSecondaryBackgroundColor]; } else { - self.navigationBar.barTintColor = - [UIColor colorNamed:kPrimaryBackgroundColor]; - self.toolbar.barTintColor = [UIColor colorNamed:kPrimaryBackgroundColor]; - self.view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + self.navigationBar.barTintColor = UIColor.cr_systemBackgroundColor; + self.toolbar.barTintColor = UIColor.cr_systemBackgroundColor; + self.view.backgroundColor = UIColor.cr_systemBackgroundColor; } }
diff --git a/ios/chrome/browser/ui/thumb_strip/BUILD.gn b/ios/chrome/browser/ui/thumb_strip/BUILD.gn index 931de5a3..84f20fd 100644 --- a/ios/chrome/browser/ui/thumb_strip/BUILD.gn +++ b/ios/chrome/browser/ui/thumb_strip/BUILD.gn
@@ -51,6 +51,7 @@ "//base", "//base/test:test_support", "//ios/chrome/browser/ui:feature_flags", + "//ios/chrome/browser/ui/fullscreen:feature_flags", "//ios/chrome/test:eg_test_support+eg2", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2",
diff --git a/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm b/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm index d3176814..dc426c8 100644 --- a/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm +++ b/ios/chrome/browser/ui/thumb_strip/thumb_strip_egtest.mm
@@ -4,6 +4,7 @@ #include "base/ios/ios_util.h" #import "base/test/ios/wait_util.h" +#import "ios/chrome/browser/ui/fullscreen/fullscreen_features.h" #import "ios/chrome/browser/ui/thumb_strip/thumb_strip_feature.h" #import "ios/chrome/browser/ui/ui_feature_flags.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" @@ -55,6 +56,8 @@ // See crbug.com/1143299. if (base::ios::IsRunningOnIOS13OrLater()) { config.features_enabled.push_back(kExpandedTabStrip); + config.features_disabled.push_back( + fullscreen::features::kSmoothScrollingDefault); } return config; }
diff --git a/ios/chrome/browser/ui/util/keyboard_observer_helper.mm b/ios/chrome/browser/ui/util/keyboard_observer_helper.mm index 5deb1b8..dd36ff15 100644 --- a/ios/chrome/browser/ui/util/keyboard_observer_helper.mm +++ b/ios/chrome/browser/ui/util/keyboard_observer_helper.mm
@@ -118,11 +118,13 @@ - (void)keyboardWillHide:(NSNotification*)notification { self.keyboardOnScreen = NO; +#if !defined(__IPHONE_13_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_13_0 dispatch_async(dispatch_get_main_queue(), ^{ if (self.keyboardOnScreen) { [self.consumer keyboardDidStayOnScreen]; } }); +#endif } #pragma mark - Private
diff --git a/ios/chrome/browser/web/chrome_web_client.h b/ios/chrome/browser/web/chrome_web_client.h index 8049728d..f1e1f7a 100644 --- a/ios/chrome/browser/web/chrome_web_client.h +++ b/ios/chrome/browser/web/chrome_web_client.h
@@ -62,6 +62,7 @@ base::OnceCallback<void(NSString*)> callback) override; UIView* GetWindowedContainer() override; bool EnableLongPressAndForceTouchHandling() const override; + bool EnableLongPressUIContextMenu() const override; bool ForceMobileVersionByDefault(const GURL& url) override; web::UserAgentType GetDefaultUserAgent(id<UITraitEnvironment> web_view, const GURL& url) override;
diff --git a/ios/chrome/browser/web/chrome_web_client.mm b/ios/chrome/browser/web/chrome_web_client.mm index d5ab352..4e345d8d 100644 --- a/ios/chrome/browser/web/chrome_web_client.mm +++ b/ios/chrome/browser/web/chrome_web_client.mm
@@ -397,7 +397,11 @@ } bool ChromeWebClient::EnableLongPressAndForceTouchHandling() const { - return !web::features::UseWebViewNativeContextMenu(); + return !web::features::UseWebViewNativeContextMenuWeb(); +} + +bool ChromeWebClient::EnableLongPressUIContextMenu() const { + return web::features::UseWebViewNativeContextMenuSystem(); } bool ChromeWebClient::ForceMobileVersionByDefault(const GURL& url) {
diff --git a/ios/chrome/browser/web/error_page_egtest.mm b/ios/chrome/browser/web/error_page_egtest.mm index 5ff05c3a..4771c75 100644 --- a/ios/chrome/browser/web/error_page_egtest.mm +++ b/ios/chrome/browser/web/error_page_egtest.mm
@@ -101,6 +101,27 @@ [ChromeEarlGrey waitForWebStateContainingText:"bar"]; } +// Loads the URL which fails to load, then sucessfully navigates back/forward to +// the page. +- (void)testNavigateForwardToErrorPage { + self.serverRespondsWithContent = YES; + [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?bar")]; + [ChromeEarlGrey waitForWebStateContainingText:"bar"]; + + // No response leads to ERR_CONNECTION_CLOSED error. + self.serverRespondsWithContent = NO; + [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")]; + [ChromeEarlGrey waitForWebStateContainingText:GetErrorMessage()]; + + self.serverRespondsWithContent = YES; + [ChromeEarlGrey goBack]; + [ChromeEarlGrey waitForWebStateContainingText:"bar"]; + + // Navigate forward to the error page, which should load without errors. + [ChromeEarlGrey goForward]; + [ChromeEarlGrey waitForWebStateContainingText:"foo"]; +} + // Loads the URL which fails to load, then sucessfully reloads the page. - (void)testReloadErrorPage { // No response leads to ERR_CONNECTION_CLOSED error.
diff --git a/ios/chrome/browser/web/ssl_egtest.mm b/ios/chrome/browser/web/ssl_egtest.mm index 79982e3..140fced 100644 --- a/ios/chrome/browser/web/ssl_egtest.mm +++ b/ios/chrome/browser/web/ssl_egtest.mm
@@ -5,6 +5,7 @@ #include "base/bind.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" +#import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/earl_grey/earl_grey_test.h" #include "ios/testing/embedded_test_server_handlers.h" @@ -38,11 +39,7 @@ _HTTPSServer = std::make_unique<net::test_server::EmbeddedTestServer>( net::test_server::EmbeddedTestServer::TYPE_HTTPS); RegisterDefaultHandlers(_HTTPSServer.get()); -} -// Test loading a page with a bad SSL certificate from the NTP, to avoid -// https://crbug.com/1067250 from regressing. -- (void)testBadSSLOnNTP { GREYAssertTrue(_HTTPSServer->Start(), @"Test server failed to start."); const GURL pageURL = _HTTPSServer->GetURL("/echo"); @@ -52,17 +49,43 @@ IDS_SSL_V2_HEADING)]; } +// Tests loading a bad ssl page and tapping "proceed". +- (void)testProceedToBadSSL { + // Tap on the "Proceed" link and verify that we go to the unsafe page. + [ChromeEarlGrey tapWebStateElementWithID:@"details-button"]; + [ChromeEarlGrey tapWebStateElementWithID:@"proceed-link"]; + [ChromeEarlGrey waitForWebStateContainingText:"Echo"]; +} + +// Tests loading a bad ssl page and tapping "Back to safety". The bad ssl page +// is loaded from the NTP to prevent https://crbug.com/1067250 from regressing. +- (void)testBackToSafetyFromBadSSL { + // Tap on the "Back to safety" link and verify that we go to the NTP. + [ChromeEarlGrey tapWebStateElementWithID:@"primary-button"]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()] + assertWithMatcher:grey_sufficientlyVisible()]; +} + +// Tests loading a BadSSL URL then a good URL then pressing back to navigates +// back to the BadSSL URL is showing the warning. +- (void)testNavigateBackToBadSSL { + // Load a server without SSL issues. + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + + const GURL pageURL = self.testServer->GetURL("/echo"); + [ChromeEarlGrey loadURL:pageURL]; + + [ChromeEarlGrey waitForWebStateContainingText:"Echo"]; + + // Navigate back to the bad SSL page. + [ChromeEarlGrey goBack]; + [ChromeEarlGrey waitForWebStateContainingText:l10n_util::GetStringUTF8( + IDS_SSL_V2_HEADING)]; +} + // Test loading a page with a bad SSL certificate during session restore, to // avoid regressing https://crbug.com/1050808. - (void)testBadSSLInSessionRestore { - GREYAssertTrue(_HTTPSServer->Start(), @"Test server failed to start."); - - GURL pageURL = _HTTPSServer->GetURL("/echo"); - [ChromeEarlGrey loadURL:pageURL]; - - [ChromeEarlGrey waitForWebStateContainingText:l10n_util::GetStringUTF8( - IDS_SSL_V2_HEADING)]; - [ChromeEarlGrey triggerRestoreViaTabGridRemoveAllUndo]; [ChromeEarlGrey waitForWebStateContainingText:l10n_util::GetStringUTF8( IDS_SSL_V2_HEADING)];
diff --git a/ios/chrome/browser/web_state_list/BUILD.gn b/ios/chrome/browser/web_state_list/BUILD.gn index f78f880..a0cab940 100644 --- a/ios/chrome/browser/web_state_list/BUILD.gn +++ b/ios/chrome/browser/web_state_list/BUILD.gn
@@ -69,6 +69,7 @@ "//ios/chrome/browser/main:public", "//ios/chrome/browser/sessions:restoration_agent", "//ios/chrome/browser/sessions:restoration_observer", + "//ios/chrome/browser/ui/util", "//ios/web/public", ] frameworks = [ "Foundation.framework" ]
diff --git a/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm b/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm index c30f0db..bc61828 100644 --- a/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm +++ b/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm
@@ -14,6 +14,7 @@ #include "ios/chrome/browser/chrome_url_constants.h" #include "ios/chrome/browser/crash_report/crash_loop_detection_util.h" #import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" +#include "ios/chrome/browser/ui/util/uikit_ui_util.h" #include "ios/chrome/browser/web_state_list/session_metrics.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" #include "ios/web/public/browser_state.h" @@ -157,7 +158,7 @@ void WebStateListMetricsBrowserAgent::PageLoaded( web::WebState* web_state, web::PageLoadCompletionStatus load_completion_status) { - switch ([[UIApplication sharedApplication] statusBarOrientation]) { + switch (GetInterfaceOrientation()) { case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: UMA_HISTOGRAM_BOOLEAN("Tab.PageLoadInPortrait", YES);
diff --git a/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h index e95226e..c4026725 100644 --- a/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h +++ b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h
@@ -13,6 +13,16 @@ // TODO (crbug.com/981889): Remove along with iOS 12. @interface UIColor (CRSemanticColors) +// System Background Color +@property(class, nonatomic, readonly) UIColor* cr_systemBackgroundColor; +@property(class, nonatomic, readonly) + UIColor* cr_secondarySystemBackgroundColor; + +// System Grouped Background Colors +@property(class, nonatomic, readonly) UIColor* cr_systemGroupedBackgroundColor; +@property(class, nonatomic, readonly) + UIColor* cr_secondarySystemGroupedBackgroundColor; + // Label Colors @property(class, nonatomic, readonly) UIColor* cr_labelColor; @property(class, nonatomic, readonly) UIColor* cr_secondaryLabelColor;
diff --git a/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm index 70f20f44..39ced8a 100644 --- a/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm +++ b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm
@@ -10,6 +10,42 @@ @implementation UIColor (CRSemanticColors) +#pragma mark - System Background Colors + ++ (UIColor*)cr_systemBackgroundColor { + if (@available(iOS 13, *)) { + return UIColor.systemBackgroundColor; + } + return UIColor.whiteColor; +} + ++ (UIColor*)cr_secondarySystemBackgroundColor { + if (@available(iOS 13, *)) { + return UIColor.secondarySystemBackgroundColor; + } + // This is the value for secondarySystemBackgroundColor in light mode. + return [UIColor colorWithRed:244 / (CGFloat)0xFF + green:244 / (CGFloat)0xFF + blue:248 / (CGFloat)0xFF + alpha:1]; +} + +#pragma mark - System Grouped Background Colors + ++ (UIColor*)cr_systemGroupedBackgroundColor { + if (@available(iOS 13, *)) { + return UIColor.systemGroupedBackgroundColor; + } + return UIColor.groupTableViewBackgroundColor; +} + ++ (UIColor*)cr_secondarySystemGroupedBackgroundColor { + if (@available(iOS 13, *)) { + return UIColor.secondarySystemGroupedBackgroundColor; + } + return UIColor.whiteColor; +} + #pragma mark - Label Colors + (UIColor*)cr_labelColor {
diff --git a/ios/chrome/common/ui/colors/resources/BUILD.gn b/ios/chrome/common/ui/colors/resources/BUILD.gn index 59ca80c..c6935c0 100644 --- a/ios/chrome/common/ui/colors/resources/BUILD.gn +++ b/ios/chrome/common/ui/colors/resources/BUILD.gn
@@ -27,12 +27,9 @@ ":grey_700_color", ":grey_800_color", ":grey_900_color", - ":grouped_primary_background_color", - ":grouped_secondary_background_color", ":mdc_ink_color", ":mdc_secondary_ink_color", ":placeholder_image_tint_color", - ":primary_background_color", ":red_color", ":red_dark_color", ":scrim_background_color", @@ -226,15 +223,3 @@ colorset("secondary_background_color") { sources = [ "secondary_background_color.colorset/Contents.json" ] } - -colorset("primary_background_color") { - sources = [ "primary_background_color.colorset/Contents.json" ] -} - -colorset("grouped_secondary_background_color") { - sources = [ "grouped_secondary_background_color.colorset/Contents.json" ] -} - -colorset("grouped_primary_background_color") { - sources = [ "grouped_primary_background_color.colorset/Contents.json" ] -}
diff --git a/ios/chrome/common/ui/colors/resources/grouped_primary_background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grouped_primary_background_color.colorset/Contents.json deleted file mode 100644 index f1f5bfa..0000000 --- a/ios/chrome/common/ui/colors/resources/grouped_primary_background_color.colorset/Contents.json +++ /dev/null
@@ -1,38 +0,0 @@ -{ - "info": { - "version": 1, - "author": "xcode" - }, - "colors": [ - { - "idiom": "universal", - "color": { - "color-space": "display-p3", - "components": { - "red": "0xF1", - "alpha": "1.000", - "blue": "0xF4", - "green": "0xF3" - } - } - }, - { - "idiom": "universal", - "appearances": [ - { - "appearance": "luminosity", - "value": "dark" - } - ], - "color": { - "color-space": "display-p3", - "components": { - "red": "0x20", - "alpha": "1.000", - "blue": "0x24", - "green": "0x21" - } - } - } - ] -} \ No newline at end of file
diff --git a/ios/chrome/common/ui/colors/resources/grouped_secondary_background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grouped_secondary_background_color.colorset/Contents.json deleted file mode 100644 index 0d5ff736..0000000 --- a/ios/chrome/common/ui/colors/resources/grouped_secondary_background_color.colorset/Contents.json +++ /dev/null
@@ -1,38 +0,0 @@ -{ - "info": { - "version": 1, - "author": "xcode" - }, - "colors": [ - { - "idiom": "universal", - "color": { - "color-space": "display-p3", - "components": { - "red": "0xFF", - "alpha": "1.000", - "blue": "0xFF", - "green": "0xFF" - } - } - }, - { - "idiom": "universal", - "appearances": [ - { - "appearance": "luminosity", - "value": "dark" - } - ], - "color": { - "color-space": "display-p3", - "components": { - "red": "0x35", - "alpha": "1.000", - "blue": "0x39", - "green": "0x37" - } - } - } - ] -} \ No newline at end of file
diff --git a/ios/chrome/common/ui/colors/resources/primary_background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/primary_background_color.colorset/Contents.json deleted file mode 100644 index a66621c8..0000000 --- a/ios/chrome/common/ui/colors/resources/primary_background_color.colorset/Contents.json +++ /dev/null
@@ -1,38 +0,0 @@ -{ - "info": { - "version": 1, - "author": "xcode" - }, - "colors": [ - { - "idiom": "universal", - "color": { - "color-space": "display-p3", - "components": { - "red": "0xFF", - "alpha": "1.000", - "blue": "0xFF", - "green": "0xFF" - } - } - }, - { - "idiom": "universal", - "appearances": [ - { - "appearance": "luminosity", - "value": "dark" - } - ], - "color": { - "color-space": "display-p3", - "components": { - "red": "0x20", - "alpha": "1.000", - "blue": "0x24", - "green": "0x21" - } - } - } - ] -} \ No newline at end of file
diff --git a/ios/chrome/common/ui/colors/semantic_color_names.h b/ios/chrome/common/ui/colors/semantic_color_names.h index d66f212..ce13cb6 100644 --- a/ios/chrome/common/ui/colors/semantic_color_names.h +++ b/ios/chrome/common/ui/colors/semantic_color_names.h
@@ -14,10 +14,6 @@ extern NSString* const kDisabledTintColor; // Background color used in the rounded squares behind favicons. extern NSString* const kFaviconBackgroundColor; -// Primary grouped background color. -extern NSString* const kGroupedPrimaryBackgroundColor; -// Secondary grouped background color. -extern NSString* const kGroupedSecondaryBackgroundColor; // Ink color for an MDC button. extern NSString* const kMDCInkColor; // Ink color for a secondary style MDC button (button with transparent @@ -25,8 +21,6 @@ extern NSString* const kMDCSecondaryInkColor; // Color used to tint placeholder images and icons. extern NSString* const kPlaceholderImageTintColor; -// Primary background color. -extern NSString* const kPrimaryBackgroundColor; extern NSString* const kScrimBackgroundColor; // Secondary background color. extern NSString* const kSecondaryBackgroundColor;
diff --git a/ios/chrome/common/ui/colors/semantic_color_names.mm b/ios/chrome/common/ui/colors/semantic_color_names.mm index 22d8e42..74d8960 100644 --- a/ios/chrome/common/ui/colors/semantic_color_names.mm +++ b/ios/chrome/common/ui/colors/semantic_color_names.mm
@@ -13,14 +13,9 @@ NSString* const kCloseButtonColor = @"close_button_color"; NSString* const kDisabledTintColor = @"disabled_tint_color"; NSString* const kFaviconBackgroundColor = @"favicon_background_color"; -NSString* const kGroupedPrimaryBackgroundColor = - @"grouped_primary_background_color"; -NSString* const kGroupedSecondaryBackgroundColor = - @"grouped_secondary_background_color"; NSString* const kMDCInkColor = @"mdc_ink_color"; NSString* const kMDCSecondaryInkColor = @"mdc_secondary_ink_color"; NSString* const kPlaceholderImageTintColor = @"placeholder_image_tint_color"; -NSString* const kPrimaryBackgroundColor = @"primary_background_color"; NSString* const kScrimBackgroundColor = @"scrim_background_color"; NSString* const kSecondaryBackgroundColor = @"secondary_background_color"; NSString* const kSeparatorColor = @"separator_color";
diff --git a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_en-GB.xtb b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_en-GB.xtb index d197166c..8a46a521 100644 --- a/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_en-GB.xtb +++ b/ios/chrome/share_extension/strings/resources/ios_share_extension_strings_en-GB.xtb
@@ -3,7 +3,7 @@ <translationbundle lang="en-GB"> <translation id="1613742542373525524">APPLICATION_NAME cannot handle this link.</translation> <translation id="4655616150233109325">Open in Chrome</translation> -<translation id="4743991241988563337">Read Later</translation> +<translation id="4743991241988563337">Read later</translation> <translation id="6930009216791986919">Add to Bookmarks</translation> <translation id="6965382102122355670">OK</translation> <translation id="8258999165172757081">Added</translation>
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index f0f85075..e557e47 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -df0c5af3c01e211e892dfa7202abbd97923f42c8 \ No newline at end of file +94f678cf18dd0eef24a8a55b78820d24f8fc6bb0 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index eb566b2..8683aea 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -479a5cdbe222d03b81f46ad57802cbabe8d85142 \ No newline at end of file +f676517d46cf239a99e53bc2f34800fc4dad691a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index 51f978a2..4954a6e 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -8aa76742ce99c2f6bf9abdf6fd8e1ae5d7c8b833 \ No newline at end of file +01a08f8e8f7482c18d3f9b00a3a5ecdc34d03fd0 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index cb695ab..fec52393 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -0d6c6bcfbf96031da1e97b6ca45ec1b950c947d8 \ No newline at end of file +01820e63c75a24d32ad4e0f415d3c2ab8e097fb6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index d96943a..0370452e 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -6304c71654ccc27f78f770f348c50d9343ecc014 \ No newline at end of file +c7448a1e1a1978ba3f7b005e88ed3b8a30c9b6f7 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index c550be42..682ae9e60 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -fd43d9d0bdf5b608a75bde850d771f551137244e \ No newline at end of file +0c7259491368e4bf6174a99a838a9296f09234f5 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index 3e33356..f185450 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -2f23f78fcdc06953931ecefc1454539aa68c35cb \ No newline at end of file +627834249633606f18505a76b25bee74fb02c1af \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 601bf34..3132fcf 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -2cc660c0e8df8ad03130b81e30dc6cd86ca71d59 \ No newline at end of file +cfdb96c675975e7ff4ea003b1afd7ef919ba69a9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index 69ab0b8..f91e39e 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -d1a3948e1471f0d3eafef0d042257fce2406cbe1 \ No newline at end of file +ee98541c077ee425fa48831ddbbe027a61fb4da2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index 643fca35..0a45384 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -cad27834b77d0b6819db2ecd2a9db07b1c386f06 \ No newline at end of file +62b5800d4d0e121156ae9636da1bd9f4338070ca \ No newline at end of file
diff --git a/ios/public/provider/chrome/browser/signin/chrome_identity.h b/ios/public/provider/chrome/browser/signin/chrome_identity.h index c755a07..3b7028a 100644 --- a/ios/public/provider/chrome/browser/signin/chrome_identity.h +++ b/ios/public/provider/chrome/browser/signin/chrome_identity.h
@@ -24,6 +24,10 @@ // Could be nil if no full name has been fetched for this account yet. @property(strong, nonatomic, readonly) NSString* userFullName; +// Returns the primary given name of the identity, usually the user's first +// name. Could be nil if no name has been fetched for this account yet. +@property(strong, nonatomic, readonly) NSString* userGivenName; + // Cached Hashed Gaia ID. This is used to pass the currently signed in account // between apps. @property(strong, nonatomic, readonly) NSString* hashedGaiaID;
diff --git a/ios/public/provider/chrome/browser/signin/chrome_identity.mm b/ios/public/provider/chrome/browser/signin/chrome_identity.mm index 6b6794f..fae2376 100644 --- a/ios/public/provider/chrome/browser/signin/chrome_identity.mm +++ b/ios/public/provider/chrome/browser/signin/chrome_identity.mm
@@ -27,6 +27,11 @@ return nil; } +- (NSString*)userGivenName { + NOTREACHED(); + return nil; +} + - (NSString*)hashedGaiaID { NOTREACHED(); return nil;
diff --git a/ios/public/provider/chrome/browser/signin/fake_chrome_identity.h b/ios/public/provider/chrome/browser/signin/fake_chrome_identity.h index 9085b568..bc0a810 100644 --- a/ios/public/provider/chrome/browser/signin/fake_chrome_identity.h +++ b/ios/public/provider/chrome/browser/signin/fake_chrome_identity.h
@@ -12,6 +12,8 @@ // Returns a ChromeIdentity based on |email|, |gaiaID| and |name|. // The |hashedGaiaID| property will be derived from |name|. +// For simplicity, both |userGivenName| and |userFullName| properties use +// |name|. + (FakeChromeIdentity*)identityWithEmail:(NSString*)email gaiaID:(NSString*)gaiaID name:(NSString*)name;
diff --git a/ios/public/provider/chrome/browser/signin/fake_chrome_identity.mm b/ios/public/provider/chrome/browser/signin/fake_chrome_identity.mm index a588fc70..724ba23 100644 --- a/ios/public/provider/chrome/browser/signin/fake_chrome_identity.mm +++ b/ios/public/provider/chrome/browser/signin/fake_chrome_identity.mm
@@ -14,6 +14,7 @@ NSString* const kCoderUserEmailKey = @"UserEmail"; NSString* const kCoderGaiaIDKey = @"GaiaID"; NSString* const kCoderUserFullNameKey = @"UserFullName"; +NSString* const kCoderUserGivenNameKey = @"UserGivenName"; NSString* const kCoderHashedGaiaIDKey = @"HashedGaiaID"; } // namespace @@ -21,6 +22,7 @@ NSString* _userEmail; NSString* _gaiaID; NSString* _userFullName; + NSString* _userGivenName; NSString* _hashedGaiaID; } @@ -40,6 +42,7 @@ _userEmail = [email copy]; _gaiaID = [gaiaID copy]; _userFullName = [name copy]; + _userGivenName = [name copy]; _hashedGaiaID = [NSString stringWithFormat:@"%@_hashID", name]; } return self; @@ -57,6 +60,10 @@ return _userFullName; } +- (NSString*)userGivenName { + return _userGivenName; +} + - (NSString*)hashedGaiaID { return _hashedGaiaID; } @@ -79,6 +86,7 @@ return [_userEmail isEqualToString:other.userEmail] && [_gaiaID isEqualToString:other.gaiaID] && [_userFullName isEqualToString:other.userFullName] && + [_userGivenName isEqualToString:other.userGivenName] && [_hashedGaiaID isEqualToString:other.hashedGaiaID]; } return NO; @@ -94,6 +102,7 @@ [coder encodeObject:_userEmail forKey:kCoderUserEmailKey]; [coder encodeObject:_gaiaID forKey:kCoderGaiaIDKey]; [coder encodeObject:_userFullName forKey:kCoderUserFullNameKey]; + [coder encodeObject:_userGivenName forKey:kCoderUserGivenNameKey]; [coder encodeObject:_hashedGaiaID forKey:kCoderHashedGaiaIDKey]; } @@ -105,6 +114,8 @@ forKey:kCoderGaiaIDKey]; _userFullName = [coder decodeObjectOfClass:[NSString class] forKey:kCoderUserFullNameKey]; + _userGivenName = [coder decodeObjectOfClass:[NSString class] + forKey:kCoderUserGivenNameKey]; _hashedGaiaID = [coder decodeObjectOfClass:[NSString class] forKey:kCoderHashedGaiaIDKey]; }
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn index a0258e2..c4b52c0 100644 --- a/ios/web/BUILD.gn +++ b/ios/web/BUILD.gn
@@ -478,11 +478,11 @@ ] sources = [ + "web_state/ui/crw_html_element_fetch_request_unittest.mm", "web_state/ui/crw_web_controller_unittest.mm", "web_state/ui/crw_web_view_content_view_unittest.mm", "web_state/ui/crw_web_view_proxy_impl_unittest.mm", "web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm", - "web_state/ui/html_element_fetch_request_unittest.mm", "web_state/ui/web_view_js_utils_unittest.mm", "web_state/ui/wk_content_rule_list_util_unittest.mm", "web_state/ui/wk_web_view_configuration_provider_unittest.mm", @@ -527,6 +527,7 @@ ":web", "//base/test:test_support", "//ios/net", + "//ios/testing:block_swizzler", "//ios/testing:embedded_test_server_support", "//ios/testing:http_server_bundle_data", "//ios/web:resources_grit", @@ -554,6 +555,8 @@ "//ios/web/test:test_constants", "//ios/web/test:test_support", "//ios/web/web_state", + "//ios/web/web_state:context_menu", + "//ios/web/web_state/ui:crw_context_menu_controller", "//mojo/core/embedder", "//net:test_support", "//services/network/public/cpp", @@ -578,6 +581,7 @@ "web_state/error_page_inttest.mm", "web_state/http_auth_inttest.mm", "web_state/keep_render_process_alive_inttest.mm", + "web_state/ui/crw_context_menu_element_fetcher_inttest.mm", "web_state/web_state_observer_inttest.mm", "webui/web_ui_inttest.mm", "webui/web_ui_mojo_inttest.mm",
diff --git a/ios/web/common/features.h b/ios/web/common/features.h index 7ca2ac9..1ab3fd75 100644 --- a/ios/web/common/features.h +++ b/ios/web/common/features.h
@@ -60,22 +60,31 @@ // When enabled, display an interstitial on legacy TLS connections. extern const base::Feature kIOSLegacyTLSInterstitial; -// When enabled, use the native context menu in web content, for the iOS version -// that supports it. -extern const base::Feature kWebViewNativeContextMenu; - // Records snapshot size of image (IOS.Snapshots.ImageSize histogram) and PDF // (IOS.Snapshots.PDFSize histogram) if enabled. Enabling this flag will // generate PDF when Page Snapshot is taken just to record PDF size. extern const base::Feature kRecordSnapshotSize; +// When enabled, use the native context menu in web content, for the iOS version +// that supports it. +extern const base::Feature kWebViewNativeContextMenu; + +// Parameter name and values for the native context menu. +extern const char kWebViewNativeContextMenuName[]; +extern const char kWebViewNativeContextMenuParameterSystem[]; +extern const char kWebViewNativeContextMenuParameterWeb[]; + // When true, for each navigation, the default user agent is chosen by the // WebClient GetDefaultUserAgent() method. If it is false, the mobile version // is requested by default. bool UseWebClientDefaultUserAgent(); // When true, the native context menu for the web content are used. -bool UseWebViewNativeContextMenu(); +bool UseWebViewNativeContextMenuWeb(); + +// When true, the custom implementation of context menu using native ContextMenu +// for the web content is used. +bool UseWebViewNativeContextMenuSystem(); } // namespace features } // namespace web
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm index cbf8f6f..22b0e7a9 100644 --- a/ios/web/common/features.mm +++ b/ios/web/common/features.mm
@@ -46,11 +46,15 @@ const base::Feature kIOSLegacyTLSInterstitial{"IOSLegacyTLSInterstitial", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kRecordSnapshotSize{"RecordSnapshotSize", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kWebViewNativeContextMenu{ "WebViewNativeContextMenu", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kRecordSnapshotSize{"RecordSnapshotSize", - base::FEATURE_DISABLED_BY_DEFAULT}; +const char kWebViewNativeContextMenuName[] = "type"; +const char kWebViewNativeContextMenuParameterSystem[] = "system"; +const char kWebViewNativeContextMenuParameterWeb[] = "web"; bool UseWebClientDefaultUserAgent() { if (@available(iOS 13, *)) { @@ -59,9 +63,24 @@ return false; } -bool UseWebViewNativeContextMenu() { +bool UseWebViewNativeContextMenuWeb() { if (@available(iOS 13, *)) { - return base::FeatureList::IsEnabled(kWebViewNativeContextMenu); + if (!base::FeatureList::IsEnabled(kWebViewNativeContextMenu)) + return false; + std::string field_trial_param = base::GetFieldTrialParamValueByFeature( + kWebViewNativeContextMenu, kWebViewNativeContextMenuName); + return field_trial_param == kWebViewNativeContextMenuParameterWeb; + } + return false; +} + +bool UseWebViewNativeContextMenuSystem() { + if (@available(iOS 13, *)) { + if (!base::FeatureList::IsEnabled(kWebViewNativeContextMenu)) + return false; + std::string field_trial_param = base::GetFieldTrialParamValueByFeature( + kWebViewNativeContextMenu, kWebViewNativeContextMenuName); + return field_trial_param == kWebViewNativeContextMenuParameterSystem; } return false; }
diff --git a/ios/web/common/uikit_ui_util.h b/ios/web/common/uikit_ui_util.h index 3ae8df7..9c3e40b 100644 --- a/ios/web/common/uikit_ui_util.h +++ b/ios/web/common/uikit_ui_util.h
@@ -11,4 +11,8 @@ // Use only if the context of which window doesn't matter. UIWindow* GetAnyKeyWindow(); +// Returns interface orientation for the current window, returned by +// GetAnyKeyWindow(). +UIInterfaceOrientation GetInterfaceOrientation(); + #endif // IOS_WEB_COMMON_UIKIT_UI_UTIL_H_
diff --git a/ios/web/common/uikit_ui_util.mm b/ios/web/common/uikit_ui_util.mm index 0ecd597..855669f 100644 --- a/ios/web/common/uikit_ui_util.mm +++ b/ios/web/common/uikit_ui_util.mm
@@ -22,3 +22,11 @@ return nil; #endif } + +UIInterfaceOrientation GetInterfaceOrientation() { +#if !defined(__IPHONE_13_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_13_0 + return [[UIApplication sharedApplication] statusBarOrientation]; +#else + return GetAnyKeyWindow().windowScene.interfaceOrientation; +#endif +}
diff --git a/ios/web/public/web_client.h b/ios/web/public/web_client.h index d9e79aa..c74ae81 100644 --- a/ios/web/public/web_client.h +++ b/ios/web/public/web_client.h
@@ -189,10 +189,13 @@ virtual UIView* GetWindowedContainer(); // Enables the logic to handle long press and force - // touch. Should return false to use the context menu API. - // Defaults to return true. + // touch through action sheet. Should return false to use the context menu + // API. Defaults to return true. virtual bool EnableLongPressAndForceTouchHandling() const; + // Enables the logic to handle long press context menu with UIContextMenu. + virtual bool EnableLongPressUIContextMenu() const; + // This method is used when the user didn't express any preference for the // version of |url|. Returning true allows to make sure that for |url|, the // mobile version will be used, unless the user explicitly requested the
diff --git a/ios/web/web_client.mm b/ios/web/web_client.mm index e405ab5..d285e0f 100644 --- a/ios/web/web_client.mm +++ b/ios/web/web_client.mm
@@ -120,6 +120,10 @@ return true; } +bool WebClient::EnableLongPressUIContextMenu() const { + return false; +} + bool WebClient::ForceMobileVersionByDefault(const GURL&) { return false; }
diff --git a/ios/web/web_state/context_menu_params_utils.h b/ios/web/web_state/context_menu_params_utils.h index 44008f4..6a29c33 100644 --- a/ios/web/web_state/context_menu_params_utils.h +++ b/ios/web/web_state/context_menu_params_utils.h
@@ -11,10 +11,9 @@ namespace web { -// Returns true if the |element| dictionary contains enough information to -// present a context menu. (A valid url for either kContextMenuElementHyperlink -// or kContextMenuElementSource must exist in the dicitionary.) -BOOL CanShowContextMenuForElementDictionary(NSDictionary* element); +// Returns true if the |params| contain enough information to present a context +// menu. (A valid url for either link_url or src_url must exist in the params.) +BOOL CanShowContextMenuForParams(const ContextMenuParams& params); // creates a ContextMenuParams from a NSDictionary representing an HTML element. // The fields "href", "src", "title", "referrerPolicy" and "innerText" will
diff --git a/ios/web/web_state/context_menu_params_utils.mm b/ios/web/web_state/context_menu_params_utils.mm index 50dc3cb..67e2d9a1 100644 --- a/ios/web/web_state/context_menu_params_utils.mm +++ b/ios/web/web_state/context_menu_params_utils.mm
@@ -68,13 +68,11 @@ namespace web { -BOOL CanShowContextMenuForElementDictionary(NSDictionary* element) { - NSString* href = element[kContextMenuElementHyperlink]; - if (GURL(base::SysNSStringToUTF8(href)).is_valid()) { +BOOL CanShowContextMenuForParams(const ContextMenuParams& params) { + if (params.link_url.is_valid()) { return YES; } - NSString* src = element[kContextMenuElementSource]; - if (GURL(base::SysNSStringToUTF8(src)).is_valid()) { + if (params.src_url.is_valid()) { return YES; } return NO;
diff --git a/ios/web/web_state/context_menu_params_utils_unittest.mm b/ios/web/web_state/context_menu_params_utils_unittest.mm index e3622652..9df07ca0 100644 --- a/ios/web/web_state/context_menu_params_utils_unittest.mm +++ b/ios/web/web_state/context_menu_params_utils_unittest.mm
@@ -113,55 +113,49 @@ EXPECT_EQ(params.menu_title_origin, ContextMenuTitleOrigin::kURL); } -// Tests that a context menu will not be shown for an empty element dictionary. +// Tests that a context menu will not be shown for empty params. TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestEmptyDictionary) { - EXPECT_FALSE(CanShowContextMenuForElementDictionary(@{})); -} - -// Tests that a context menu will not be shown for an element dictionary with -// only a request id. -TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestRequestIdOnly) { - EXPECT_FALSE(CanShowContextMenuForElementDictionary( - @{kContextMenuElementRequestId : @"kContextMenuElementRequestId"})); + EXPECT_FALSE(CanShowContextMenuForParams(ContextMenuParams())); } // Tests that a context menu will be shown for a link. TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestHyperlink) { - EXPECT_TRUE(CanShowContextMenuForElementDictionary(@{ - kContextMenuElementHyperlink : @"http://example.com", - kContextMenuElementInnerText : @"Click me." - })); + ContextMenuParams params; + params.link_url = GURL("http://example.com"); + params.link_text = @"Click me."; + EXPECT_TRUE(CanShowContextMenuForParams(params)); } // Tests that a context menu will not be shown for an invalid link. TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestInvalidHyperlink) { - EXPECT_FALSE(CanShowContextMenuForElementDictionary( - @{kContextMenuElementHyperlink : @"invalid_url"})); + ContextMenuParams params; + params.link_url = GURL("invalid_url"); + EXPECT_FALSE(CanShowContextMenuForParams(params)); } // Tests that a context menu will be shown for an image. TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestImageWithTitle) { - EXPECT_TRUE(CanShowContextMenuForElementDictionary(@{ - kContextMenuElementSource : @"http://example.com/image.jpeg", - kContextMenuElementTitle : @"Image" - })); + ContextMenuParams params; + params.src_url = GURL("http://example.com/image.jpeg"); + params.menu_title = @"Image"; + EXPECT_TRUE(CanShowContextMenuForParams(params)); } // Tests that a context menu will not be shown for an image with an invalid // source url. TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestImageWithInvalidSource) { - EXPECT_FALSE(CanShowContextMenuForElementDictionary(@{ - kContextMenuElementSource : @"invalid_url", - })); + ContextMenuParams params; + params.src_url = GURL("invalid_url"); + EXPECT_FALSE(CanShowContextMenuForParams(params)); } // Tests that a context menu will be shown for a linked image. TEST_F(ContextMenuParamsUtilsTest, CanShowContextMenuTestLinkedImage) { - EXPECT_TRUE(CanShowContextMenuForElementDictionary(@{ - kContextMenuElementHyperlink : @"http://example.com", - kContextMenuElementSource : @"http://example.com/image.jpeg" - })); + ContextMenuParams params; + params.link_url = GURL("http://example.com"); + params.src_url = GURL("http://example.com/image.jpeg"); + EXPECT_TRUE(CanShowContextMenuForParams(params)); } // Tests that the menu title prepends the element's alt text if it is an image
diff --git a/ios/web/web_state/ui/BUILD.gn b/ios/web/web_state/ui/BUILD.gn index 0f0eca6..6c03c00 100644 --- a/ios/web/web_state/ui/BUILD.gn +++ b/ios/web/web_state/ui/BUILD.gn
@@ -104,10 +104,14 @@ ] sources = [ + "crw_context_menu_controller.h", + "crw_context_menu_controller.mm", + "crw_context_menu_element_fetcher.h", + "crw_context_menu_element_fetcher.mm", + "crw_html_element_fetch_request.h", + "crw_html_element_fetch_request.mm", "crw_legacy_context_menu_controller.h", "crw_legacy_context_menu_controller.mm", - "html_element_fetch_request.h", - "html_element_fetch_request.mm", ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.h b/ios/web/web_state/ui/crw_context_menu_controller.h new file mode 100644 index 0000000..238c777 --- /dev/null +++ b/ios/web/web_state/ui/crw_context_menu_controller.h
@@ -0,0 +1,25 @@ +// Copyright 2020 The Chromium 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_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_CONTROLLER_H_ +#define IOS_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_CONTROLLER_H_ + +#import <UIKit/UIKit.h> +#import <WebKit/WebKit.h> + +namespace web { +class WebState; +} + +// Controller for displaying system Context Menu when the user is long pressing +// on an element. This is working by adding an interaction to the whole web view +// and then only adding focus on the element being long pressed. +API_AVAILABLE(ios(13.0)) @interface CRWContextMenuController : NSObject + +- (instancetype)initWithWebView:(WKWebView*)webView + webState:(web::WebState*)webState; + +@end + +#endif // IOS_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_CONTROLLER_H_
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.mm b/ios/web/web_state/ui/crw_context_menu_controller.mm new file mode 100644 index 0000000..9663d103 --- /dev/null +++ b/ios/web/web_state/ui/crw_context_menu_controller.mm
@@ -0,0 +1,116 @@ +// Copyright 2020 The Chromium 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/web/web_state/ui/crw_context_menu_controller.h" + +#import "ios/web/public/ui/context_menu_params.h" +#import "ios/web/web_state/ui/crw_context_menu_element_fetcher.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { +const CGFloat kJavaScriptTimeout = 1; +} // namespace + +@interface CRWContextMenuController () <UIContextMenuInteractionDelegate> + +@property(nonatomic, assign) web::ContextMenuParams params; + +// The context menu responsible for the interaction. +@property(nonatomic, strong) UIContextMenuInteraction* contextMenu; + +@property(nonatomic, strong) WKWebView* webView; + +@property(nonatomic, assign) web::WebState* webState; + +@property(nonatomic, strong) CRWContextMenuElementFetcher* elementFetcher; + +@end + +@implementation CRWContextMenuController + +- (instancetype)initWithWebView:(WKWebView*)webView + webState:(web::WebState*)webState { + self = [super init]; + if (self) { + _contextMenu = [[UIContextMenuInteraction alloc] initWithDelegate:self]; + + _webView = webView; + [webView addInteraction:_contextMenu]; + + _webState = webState; + + _elementFetcher = + [[CRWContextMenuElementFetcher alloc] initWithWebView:webView + webState:webState]; + } + return self; +} + +#pragma mark - UIContextMenuInteractionDelegate + +- (UIContextMenuConfiguration*)contextMenuInteraction: + (UIContextMenuInteraction*)interaction + configurationForMenuAtLocation:(CGPoint)location { + CGPoint locationInWebView = + [self.webView.scrollView convertPoint:location fromView:interaction.view]; + + // While traditionally using dispatch_async would be used here, we have to + // instead use CFRunLoop because dispatch_async blocks the thread. As this + // function is called by iOS when it detects the user's force touch, it is on + // the main thread and we cannot block that. CFRunLoop instead just loops on + // the main thread until the completion block is fired. + __block BOOL isRunLoopNested = NO; + __block BOOL javascriptEvaluationComplete = NO; + __block BOOL isRunLoopComplete = NO; + + __weak __typeof(self) weakSelf = self; + [self.elementFetcher + fetchDOMElementAtPoint:locationInWebView + completionHandler:^(const web::ContextMenuParams& params) { + __typeof(self) strongSelf = weakSelf; + javascriptEvaluationComplete = YES; + strongSelf.params = params; + if (isRunLoopNested) { + CFRunLoopStop(CFRunLoopGetCurrent()); + } + }]; + + // Make sure to timeout in case the JavaScript doesn't return in a timely + // manner. While this is executing, the scrolling on the page is frozen. + // Interacting with the page will force this method to return even before any + // of this code is called. + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, + (int64_t)(kJavaScriptTimeout * NSEC_PER_SEC)), + dispatch_get_main_queue(), ^{ + if (!isRunLoopComplete) { + // JavaScript didn't complete. Cancel the JavaScript and + // return. + CFRunLoopStop(CFRunLoopGetCurrent()); + __typeof(self) strongSelf = weakSelf; + [strongSelf.elementFetcher cancelFetches]; + } + }); + + // CFRunLoopRun isn't necessary if javascript evaluation is completed by the + // time we reach this line. + if (!javascriptEvaluationComplete) { + isRunLoopNested = YES; + CFRunLoopRun(); + isRunLoopNested = NO; + } + + isRunLoopComplete = YES; + + self.params.location = [self.webView convertPoint:location + fromView:interaction.view]; + + // TODO(crbug.com/1140387): Present the context menu with the params. + + return nil; +} + +@end
diff --git a/ios/web/web_state/ui/crw_context_menu_element_fetcher.h b/ios/web/web_state/ui/crw_context_menu_element_fetcher.h new file mode 100644 index 0000000..6896d0a --- /dev/null +++ b/ios/web/web_state/ui/crw_context_menu_element_fetcher.h
@@ -0,0 +1,33 @@ +// Copyright 2020 The Chromium 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_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_ELEMENT_FETCHER_H_ +#define IOS_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_ELEMENT_FETCHER_H_ + +#import <Foundation/Foundation.h> +#import <WebKit/WebKit.h> + +namespace web { +struct ContextMenuParams; +class WebState; +} + +// Class handling the fetching information about DOM element in a specific +// position. +@interface CRWContextMenuElementFetcher : NSObject + +- (instancetype)initWithWebView:(WKWebView*)webView + webState:(web::WebState*)webState; + +// Asynchronously fetches information about DOM element for the given |point| +// (in the scroll view coordinates). |handler| can not be nil. +- (void)fetchDOMElementAtPoint:(CGPoint)point + completionHandler:(void (^)(const web::ContextMenuParams&))handler; + +// Cancels all the fetches current in progress. +- (void)cancelFetches; + +@end + +#endif // IOS_WEB_WEB_STATE_UI_CRW_CONTEXT_MENU_ELEMENT_FETCHER_H_
diff --git a/ios/web/web_state/ui/crw_context_menu_element_fetcher.mm b/ios/web/web_state/ui/crw_context_menu_element_fetcher.mm new file mode 100644 index 0000000..464ecf6 --- /dev/null +++ b/ios/web/web_state/ui/crw_context_menu_element_fetcher.mm
@@ -0,0 +1,157 @@ +// Copyright 2020 The Chromium 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/web/web_state/ui/crw_context_menu_element_fetcher.h" + +#include "base/strings/sys_string_conversions.h" +#include "base/unguessable_token.h" +#include "base/values.h" +#import "ios/web/js_messaging/crw_wk_script_message_router.h" +#import "ios/web/public/js_messaging/web_frame.h" +#import "ios/web/public/js_messaging/web_frame_util.h" +#import "ios/web/public/ui/context_menu_params.h" +#import "ios/web/public/web_state.h" +#import "ios/web/public/web_state_observer_bridge.h" +#import "ios/web/web_state/context_menu_constants.h" +#import "ios/web/web_state/context_menu_params_utils.h" +#import "ios/web/web_state/ui/crw_html_element_fetch_request.h" +#import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { +// Javascript function name to obtain element details at a point. +const char kFindElementAtPointFunctionName[] = "findElementAtPoint"; + +// JavaScript message handler name installed in WKWebView for found element +// response. +NSString* const kFindElementResultHandlerName = @"FindElementResultHandler"; +} // namespace + +@interface CRWContextMenuElementFetcher () <CRWWebStateObserver> { + std::unique_ptr<web::WebStateObserverBridge> _observer; +} + +@property(nonatomic, readonly, weak) WKWebView* webView; + +@property(nonatomic, assign) web::WebState* webState; + +// Details for currently in progress element fetches. The objects are +// instances of CRWHTMLElementFetchRequest and are keyed by a unique requestId +// string. +@property(nonatomic, strong) NSMutableDictionary* pendingElementFetchRequests; + +@end + +@implementation CRWContextMenuElementFetcher + +- (instancetype)initWithWebView:(WKWebView*)webView + webState:(web::WebState*)webState { + self = [super init]; + if (self) { + _pendingElementFetchRequests = [[NSMutableDictionary alloc] init]; + + _webView = webView; + + _webState = webState; + _observer = std::make_unique<web::WebStateObserverBridge>(self); + webState->AddObserver(_observer.get()); + + // Listen for fetched element response. + web::WKWebViewConfigurationProvider& configurationProvider = + web::WKWebViewConfigurationProvider::FromBrowserState( + webState->GetBrowserState()); + CRWWKScriptMessageRouter* messageRouter = + configurationProvider.GetScriptMessageRouter(); + __weak __typeof(self) weakSelf = self; + [messageRouter + setScriptMessageHandler:^(WKScriptMessage* message) { + [weakSelf didReceiveScriptMessage:message]; + } + name:kFindElementResultHandlerName + webView:webView]; + } + return self; +} + +- (void)dealloc { + if (self.webState) + self.webState->RemoveObserver(_observer.get()); +} + +- (void)fetchDOMElementAtPoint:(CGPoint)point + completionHandler: + (void (^)(const web::ContextMenuParams&))handler { + if (!self.webState) { + return; + } + web::WebFrame* frame = GetMainFrame(self.webState); + if (!frame) { + // A WebFrame may not exist for certain types of content, like PDFs. + return; + } + DCHECK(handler); + + std::string requestID = base::UnguessableToken::Create().ToString(); + CRWHTMLElementFetchRequest* fetchRequest = + [[CRWHTMLElementFetchRequest alloc] initWithFoundElementHandler:handler]; + _pendingElementFetchRequests[base::SysUTF8ToNSString(requestID)] = + fetchRequest; + + CGSize webViewContentSize = self.webView.scrollView.contentSize; + + std::vector<base::Value> args; + args.push_back(base::Value(requestID)); + args.push_back(base::Value(point.x)); + args.push_back(base::Value(point.y)); + args.push_back(base::Value(webViewContentSize.width)); + args.push_back(base::Value(webViewContentSize.height)); + frame->CallJavaScriptFunction(std::string(kFindElementAtPointFunctionName), + args); +} + +- (void)cancelFetches { + for (CRWHTMLElementFetchRequest* fetchRequest in _pendingElementFetchRequests + .allValues) { + [fetchRequest invalidate]; + } +} + +#pragma mark - Private + +// Called when web controller receives a new message from the web page. +- (void)didReceiveScriptMessage:(WKScriptMessage*)message { + NSMutableDictionary* response = + [[NSMutableDictionary alloc] initWithDictionary:message.body]; + + NSString* requestID = response[web::kContextMenuElementRequestId]; + CRWHTMLElementFetchRequest* fetchRequest = + _pendingElementFetchRequests[requestID]; + if (!fetchRequest) { + // Do not process the message if a fetch request with a matching |requestID| + // was not found. This ensures that the response matches a request made by + // this instance. + return; + } + + web::ContextMenuParams params = + web::ContextMenuParamsFromElementDictionary(response); + params.is_main_frame = message.frameInfo.mainFrame; + params.view = self.webView; + + [_pendingElementFetchRequests removeObjectForKey:requestID]; + [fetchRequest runHandlerWithResponse:params]; +} + +#pragma mark - CRWWebStateObserver + +- (void)webStateDestroyed:(web::WebState*)webState { + if (self.webState) + self.webState->RemoveObserver(_observer.get()); + self.webState = nullptr; +} + +@end
diff --git a/ios/web/web_state/ui/crw_context_menu_element_fetcher_inttest.mm b/ios/web/web_state/ui/crw_context_menu_element_fetcher_inttest.mm new file mode 100644 index 0000000..2c41d62 --- /dev/null +++ b/ios/web/web_state/ui/crw_context_menu_element_fetcher_inttest.mm
@@ -0,0 +1,124 @@ +// Copyright 2020 The Chromium 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/web/web_state/ui/crw_context_menu_element_fetcher.h" + +#import <WebKit/WebKit.h> + +#include "base/macros.h" +#import "base/test/ios/wait_util.h" +#include "ios/testing/scoped_block_swizzler.h" +#import "ios/web/public/test/web_view_content_test_util.h" +#import "ios/web/test/web_test_with_web_controller.h" +#import "ios/web/web_state/context_menu_constants.h" +#import "ios/web/web_state/ui/crw_legacy_context_menu_controller.h" +#import "ios/web/web_state/ui/crw_web_controller.h" +#import "ios/web/web_state/web_state_impl.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 + +namespace { +// This is the timeout used while waiting for the JavaScript to complete. The +// general kWaitForJSCompletionTimeout isn't used because one of the test is +// supposed to not complete and so will wait for the whole duration of the +// timeout. This constant is smaller to speed tests up. This constant is used in +// both the "successful" JavaScript calls and the "failing" JavaScript calls. It +// ensures that in the context of this test, the JavaScript completes in the +// given timespan (and so it ensures that if the "failing" JavaScript tests +// pass, it is because the JavaScript isn't called and not because it didn't +// have time to complete). +const CGFloat kFetcherJSTimeout = 1.0; +} // namespace + +namespace web { +class CRWContextMenuElementFetcherTest : public WebTestWithWebController { + public: + CRWContextMenuElementFetcherTest() { + // Disable the existing long press handling to avoid duplicating message + // handlers. + swizzler_ = std::make_unique<ScopedBlockSwizzler>( + [CRWLegacyContextMenuController class], + @selector(initWithWebView:webState:), ^id(id self) { + return nil; + }); + } + + void SetUp() override { + WebTestWithWebState::SetUp(); + WKWebView* web_view = [web_controller() ensureWebViewCreated]; + fetcher_ = + [[CRWContextMenuElementFetcher alloc] initWithWebView:web_view + webState:web_state()]; + } + + // Loads a page containing a link and waits until the link is present on the + // page, making sure that the HTML is correctly injected. + bool LoadHtmlPage() WARN_UNUSED_RESULT { + NSString* html = + @"<html><head>" + "<style>body { font-size:14em; }</style>" + "<meta name=\"viewport\" content=\"user-scalable=no, width=100\">" + "</head><body><p><a id=\"linkID\" " + "href=\"http://destination/\">link</a></p></body></html>"; + + LoadHtml(html); + + bool element_present = test::WaitForWebViewContainingElement( + web_state(), [ElementSelector selectorWithElementID:"linkID"]); + if (element_present) { + // If the element is present, we still need a small delay to let all the + // scripts be injected in the page. + base::test::ios::SpinRunLoopWithMinDelay( + base::TimeDelta::FromSecondsD(0.5)); + } + return element_present; + } + + CRWContextMenuElementFetcher* GetFetcher() { return fetcher_; } + + private: + std::unique_ptr<ScopedBlockSwizzler> swizzler_; + CRWContextMenuElementFetcher* fetcher_; +}; + +// Tests that the fetcher is triggering a callback for one element. +TEST_F(CRWContextMenuElementFetcherTest, FetchOneElement) { + EXPECT_TRUE(LoadHtmlPage()); + + CRWContextMenuElementFetcher* fetcher = GetFetcher(); + __block bool callback_called = false; + [fetcher fetchDOMElementAtPoint:CGPointMake(10, 10) + completionHandler:^(const web::ContextMenuParams&) { + callback_called = true; + }]; + + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(kFetcherJSTimeout, ^{ + return callback_called; + })); +} + +// Tests that cancelled fetches don't trigger callback. +TEST_F(CRWContextMenuElementFetcherTest, CancelFetch) { + EXPECT_TRUE(LoadHtmlPage()); + + CRWContextMenuElementFetcher* fetcher = GetFetcher(); + __block bool callback_called = false; + [fetcher fetchDOMElementAtPoint:CGPointMake(10, 10) + completionHandler:^(const web::ContextMenuParams&) { + callback_called = true; + }]; + [fetcher cancelFetches]; + + // The callback should never be called. + EXPECT_FALSE( + base::test::ios::WaitUntilConditionOrTimeout(kFetcherJSTimeout, ^{ + return callback_called; + })); +} + +} // namespace web
diff --git a/ios/web/web_state/ui/html_element_fetch_request.h b/ios/web/web_state/ui/crw_html_element_fetch_request.h similarity index 68% rename from ios/web/web_state/ui/html_element_fetch_request.h rename to ios/web/web_state/ui/crw_html_element_fetch_request.h index 9aa02d35..6d89648d 100644 --- a/ios/web/web_state/ui/html_element_fetch_request.h +++ b/ios/web/web_state/ui/crw_html_element_fetch_request.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_WEB_WEB_STATE_UI_HTML_ELEMENT_FETCH_REQUEST_H_ -#define IOS_WEB_WEB_STATE_UI_HTML_ELEMENT_FETCH_REQUEST_H_ +#ifndef IOS_WEB_WEB_STATE_UI_CRW_HTML_ELEMENT_FETCH_REQUEST_H_ +#define IOS_WEB_WEB_STATE_UI_CRW_HTML_ELEMENT_FETCH_REQUEST_H_ #import <Foundation/Foundation.h> @@ -11,8 +11,12 @@ class TimeTicks; } // namespace base +namespace web { +struct ContextMenuParams; +} + // Tracks request details for fetching attributes of an element. -@interface HTMLElementFetchRequest : NSObject +@interface CRWHTMLElementFetchRequest : NSObject // The time this object was created. @property(nonatomic, readonly) base::TimeTicks creationTime; @@ -21,16 +25,17 @@ // Designated initializer to create a new object with the given completion // handler |foundElementHandler|. - (instancetype)initWithFoundElementHandler: - (void (^)(NSDictionary*))foundElementHandler NS_DESIGNATED_INITIALIZER; + (void (^)(const web::ContextMenuParams&))foundElementHandler + NS_DESIGNATED_INITIALIZER; // Calls the |foundElementHandler| from the receiver's initializer with // |response| as the parameter. This method has no effect if |invalidate| has // been called. -- (void)runHandlerWithResponse:(NSDictionary*)response; +- (void)runHandlerWithResponse:(const web::ContextMenuParams&)response; // Removes the stored |foundElementHandler| from the receiver's initializer. // |runHandlerWithResponse:| will have no effect if called after |invalidate|. - (void)invalidate; @end -#endif // IOS_WEB_WEB_STATE_UI_HTML_ELEMENT_FETCH_REQUEST_H_ +#endif // IOS_WEB_WEB_STATE_UI_CRW_HTML_ELEMENT_FETCH_REQUEST_H_
diff --git a/ios/web/web_state/ui/html_element_fetch_request.mm b/ios/web/web_state/ui/crw_html_element_fetch_request.mm similarity index 65% rename from ios/web/web_state/ui/html_element_fetch_request.mm rename to ios/web/web_state/ui/crw_html_element_fetch_request.mm index 0835371..209779e 100644 --- a/ios/web/web_state/ui/html_element_fetch_request.mm +++ b/ios/web/web_state/ui/crw_html_element_fetch_request.mm
@@ -2,26 +2,28 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#import "ios/web/web_state/ui/html_element_fetch_request.h" +#import "ios/web/web_state/ui/crw_html_element_fetch_request.h" #include "base/time/time.h" +#import "ios/web/public/ui/context_menu_params.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -@interface HTMLElementFetchRequest () +@interface CRWHTMLElementFetchRequest () // Completion handler to call with found DOM element. -@property(nonatomic, copy) void (^foundElementHandler)(NSDictionary*); +@property(nonatomic, copy) void (^foundElementHandler) + (const web::ContextMenuParams&); @end -@implementation HTMLElementFetchRequest +@implementation CRWHTMLElementFetchRequest @synthesize creationTime = _creationTime; @synthesize foundElementHandler = _foundElementHandler; - (instancetype)initWithFoundElementHandler: - (void (^)(NSDictionary*))foundElementHandler { + (void (^)(const web::ContextMenuParams&))foundElementHandler { self = [super init]; if (self) { _creationTime = base::TimeTicks::Now(); @@ -30,7 +32,7 @@ return self; } -- (void)runHandlerWithResponse:(NSDictionary*)response { +- (void)runHandlerWithResponse:(const web::ContextMenuParams&)response { if (_foundElementHandler) { _foundElementHandler(response); }
diff --git a/ios/web/web_state/ui/crw_html_element_fetch_request_unittest.mm b/ios/web/web_state/ui/crw_html_element_fetch_request_unittest.mm new file mode 100644 index 0000000..370cf69 --- /dev/null +++ b/ios/web/web_state/ui/crw_html_element_fetch_request_unittest.mm
@@ -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. + +#import "ios/web/web_state/ui/crw_html_element_fetch_request.h" + +#include "base/time/time.h" +#import "ios/web/public/ui/context_menu_params.h" +#import "ios/web/web_state/context_menu_constants.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gtest_mac.h" +#include "testing/platform_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace web { + +using CRWHTMLElementFetchRequestTest = PlatformTest; + +// Tests that |creationTime| is set at CRWHTMLElementFetchRequest object +// creation. +TEST_F(CRWHTMLElementFetchRequestTest, CreationTime) { + CRWHTMLElementFetchRequest* request = + [[CRWHTMLElementFetchRequest alloc] initWithFoundElementHandler:nil]; + base::TimeDelta delta = base::TimeTicks::Now() - request.creationTime; + // Validate that |request.creationTime| is "now", but only use second + // precision to avoid performance induced test flake. + EXPECT_GT(1, delta.InSeconds()); +} + +// Tests that |runHandlerWithResponse:| runs the handler from the object's +// initializer with the expected |response|. +TEST_F(CRWHTMLElementFetchRequestTest, RunHandler) { + __block bool handler_called = false; + __block web::ContextMenuParams received_params; + void (^handler)(const web::ContextMenuParams&) = + ^(const web::ContextMenuParams& params) { + handler_called = true; + received_params = params; + }; + CRWHTMLElementFetchRequest* request = + [[CRWHTMLElementFetchRequest alloc] initWithFoundElementHandler:handler]; + web::ContextMenuParams params = web::ContextMenuParams(); + params.link_text = @"text"; + [request runHandlerWithResponse:params]; + EXPECT_TRUE(handler_called); + EXPECT_NSEQ(params.link_text, received_params.link_text); +} + +// Tests that |runHandlerWithResponse:| does not run the handler from the +// object's initializer if |invalidate| has been called. +TEST_F(CRWHTMLElementFetchRequestTest, Invalidate) { + __block bool handler_called = false; + void (^handler)(const web::ContextMenuParams&) = + ^(const web::ContextMenuParams& params) { + handler_called = true; + }; + CRWHTMLElementFetchRequest* request = + [[CRWHTMLElementFetchRequest alloc] initWithFoundElementHandler:handler]; + [request invalidate]; + [request runHandlerWithResponse:web::ContextMenuParams()]; + EXPECT_FALSE(handler_called); +} + +} // namespace web
diff --git a/ios/web/web_state/ui/crw_legacy_context_menu_controller.mm b/ios/web/web_state/ui/crw_legacy_context_menu_controller.mm index a5065ff..6970ccc 100644 --- a/ios/web/web_state/ui/crw_legacy_context_menu_controller.mm +++ b/ios/web/web_state/ui/crw_legacy_context_menu_controller.mm
@@ -11,21 +11,14 @@ #include "base/ios/ios_util.h" #include "base/mac/foundation_util.h" #include "base/metrics/histogram_macros.h" -#include "base/strings/sys_string_conversions.h" -#include "base/unguessable_token.h" #include "base/values.h" -#import "ios/web/js_messaging/crw_wk_script_message_router.h" -#import "ios/web/public/js_messaging/web_frame.h" -#import "ios/web/public/js_messaging/web_frame_util.h" #import "ios/web/public/navigation/navigation_context.h" #import "ios/web/public/ui/context_menu_params.h" #include "ios/web/public/web_client.h" #import "ios/web/public/web_state.h" #import "ios/web/public/web_state_observer_bridge.h" -#import "ios/web/web_state/context_menu_constants.h" #import "ios/web/web_state/context_menu_params_utils.h" -#import "ios/web/web_state/ui/html_element_fetch_request.h" -#import "ios/web/web_state/ui/wk_web_view_configuration_provider.h" +#import "ios/web/web_state/ui/crw_context_menu_element_fetcher.h" #import "ios/web/web_state/web_state_impl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -54,13 +47,6 @@ } } -// Javascript function name to obtain element details at a point. -const char kFindElementAtPointFunctionName[] = "findElementAtPoint"; - -// JavaScript message handler name installed in WKWebView for found element -// response. -NSString* const kFindElementResultHandlerName = @"FindElementResultHandler"; - // Enum used to record element details fetched for the context menu. enum class ContextMenuElementFrame { // Recorded when the element was found in the main frame. @@ -89,17 +75,6 @@ kMaxValue = Cancel }; -// Struct to track the details of the element at |location| in |webView|. -struct ContextMenuInfo { - // The location of the long press. - CGPoint location; - // True if the element is in the page's main frame, false if in an iframe. - BOOL is_main_frame; - // DOM element information. May contain the keys defined in - // ios/web/web_state/context_menu_constants.h. All values are strings. - NSDictionary* dom_element; -}; - // Returns an array of gesture recognizers with |fragment| in it's description // and attached to a subview of |webView|. NSArray<UIGestureRecognizer*>* GestureRecognizersWithDescriptionFragment( @@ -182,6 +157,8 @@ // WebState associated with this controller. @property(nonatomic, assign) web::WebStateImpl* webState; +@property(nonatomic, strong) CRWContextMenuElementFetcher* elementFetcher; + // Called when the |_contextMenuRecognizer| finishes recognizing a long press. - (void)longPressDetectedByGestureRecognizer: (UIGestureRecognizer*)gestureRecognizer; @@ -190,21 +167,12 @@ // Called when the |_contextMenuRecognizer| changes. - (void)longPressGestureRecognizerChanged; // Show the context menu or allow the system default behavior based on the DOM -// element details in |_contextMenuInfoForLastTouch.dom_element|. +// element details in |contextMenuParams|. - (void)processReceivedDOMElement; // Called when the context menu must be shown. - (void)showContextMenu; // Cancels all touch events in the web view (long presses, tapping, scrolling). - (void)cancelAllTouches; -// Asynchronously fetches information about DOM element for the given point (in -// UIView coordinates). |handler| can not be nil. See -// |_contextMenuInfoForLastTouch.dom_element| for element format description. -- (void)fetchDOMElementAtPoint:(CGPoint)point - completionHandler:(void (^)(NSDictionary*))handler; -// Sets the value of |_contextMenuInfoForLastTouch.dom_element|. -- (void)setDOMElementForLastTouch:(NSDictionary*)element; -// Called to process a message received from JavaScript. -- (void)didReceiveScriptMessage:(WKScriptMessage*)message; // Cancels the display of the context menu and clears associated element fetch // request state. - (void)cancelContextMenuDisplay; @@ -214,10 +182,8 @@ std::unique_ptr<web::WebStateObserverBridge> _observer; // Long press recognizer that allows showing context menus. UILongPressGestureRecognizer* _contextMenuRecognizer; - // DOM element information for the point where the user made the last touch. - // Precalculation is necessary because retreiving DOM element relies on async - // API so element info can not be built on demand. - ContextMenuInfo _contextMenuInfoForLastTouch; + // Location of the last touch on the screen. + CGPoint _lastTouchLocation; // Whether or not the system cotext menu should be displayed. If not, custom // context menu should be displayed. BOOL _systemContextMenuEnabled; @@ -229,10 +195,8 @@ // |_contextMenuRecognizer| finished, but couldn't yet show the context menu // becuase the DOM element details were not yet available. BOOL _contextMenuNeedsDisplay; - // Details for currently in progress element fetches. The objects are - // instances of HTMLElementFetchRequest and are keyed by a unique requestId - // string. - NSMutableDictionary* _pendingElementFetchRequests; + // Parameters for the context menu, populated by the element fetcher. + base::Optional<web::ContextMenuParams> _contextMenuParams; } @synthesize webView = _webView; @@ -243,7 +207,10 @@ self = [super init]; if (self) { _webView = webView; - _pendingElementFetchRequests = [[NSMutableDictionary alloc] init]; + + _elementFetcher = + [[CRWContextMenuElementFetcher alloc] initWithWebView:webView + webState:webState]; _webState = webState; _observer = std::make_unique<web::WebStateObserverBridge>(self); @@ -273,20 +240,6 @@ [_webView addGestureRecognizer:_contextMenuRecognizer]; OverrideGestureRecognizers(_contextMenuRecognizer, _webView); - - // Listen for fetched element response. - web::WKWebViewConfigurationProvider& configurationProvider = - web::WKWebViewConfigurationProvider::FromBrowserState( - webState->GetBrowserState()); - CRWWKScriptMessageRouter* messageRouter = - configurationProvider.GetScriptMessageRouter(); - __weak CRWLegacyContextMenuController* weakSelf = self; - [messageRouter - setScriptMessageHandler:^(WKScriptMessage* message) { - [weakSelf didReceiveScriptMessage:message]; - } - name:kFindElementResultHandlerName - webView:webView]; } return self; } @@ -329,7 +282,7 @@ } - (void)longPressGestureRecognizerBegan { - if (_contextMenuInfoForLastTouch.dom_element) { + if (_contextMenuParams.has_value()) { [self processReceivedDOMElement]; } else { // Shows the context menu once the DOM element information is set. @@ -340,7 +293,7 @@ - (void)longPressGestureRecognizerChanged { if (!_contextMenuNeedsDisplay || - CGPointEqualToPoint(_contextMenuInfoForLastTouch.location, CGPointZero)) { + CGPointEqualToPoint(_lastTouchLocation, CGPointZero)) { return; } @@ -350,10 +303,8 @@ // |_contextMenuNeedsDisplay| has already been set to True. CGPoint currentTouchLocation = [_contextMenuRecognizer locationInView:_webView]; - float deltaX = std::abs(_contextMenuInfoForLastTouch.location.x - - currentTouchLocation.x); - float deltaY = std::abs(_contextMenuInfoForLastTouch.location.y - - currentTouchLocation.y); + float deltaX = std::abs(_lastTouchLocation.x - currentTouchLocation.x); + float deltaY = std::abs(_lastTouchLocation.y - currentTouchLocation.y); if (deltaX > kLongPressMoveDeltaPixels || deltaY > kLongPressMoveDeltaPixels) { [self cancelContextMenuDisplay]; @@ -361,8 +312,9 @@ } - (void)processReceivedDOMElement { - BOOL canShowContextMenu = web::CanShowContextMenuForElementDictionary( - _contextMenuInfoForLastTouch.dom_element); + BOOL canShowContextMenu = + _contextMenuParams.has_value() && + web::CanShowContextMenuForParams(_contextMenuParams.value()); if (!canShowContextMenu) { // There is no link or image under user's gesture. Do not cancel all touches // to allow system text selection UI. @@ -374,30 +326,25 @@ // intentionally suppress system context menu UI. [self cancelAllTouches]; - _contextMenuInfoForLastTouch.location = - [_contextMenuRecognizer locationInView:_webView]; + _lastTouchLocation = [_contextMenuRecognizer locationInView:_webView]; [self showContextMenu]; } - (void)showContextMenu { - if (!self.webState) { + if (!self.webState || !_contextMenuParams.has_value()) { return; } // Log if the element is in the main frame or a child frame. UMA_HISTOGRAM_ENUMERATION("ContextMenu.DOMElementFrame", - (_contextMenuInfoForLastTouch.is_main_frame + (_contextMenuParams.value().is_main_frame ? ContextMenuElementFrame::MainFrame : ContextMenuElementFrame::Iframe), ContextMenuElementFrame::Count); - web::ContextMenuParams params = web::ContextMenuParamsFromElementDictionary( - _contextMenuInfoForLastTouch.dom_element); - params.view = _webView; - params.location = _contextMenuInfoForLastTouch.location; - params.is_main_frame = _contextMenuInfoForLastTouch.is_main_frame; + _contextMenuParams.value().location = _lastTouchLocation; - self.webState->HandleContextMenu(params); + self.webState->HandleContextMenu(_contextMenuParams.value()); } - (void)cancelAllTouches { @@ -415,8 +362,9 @@ } } -- (void)setDOMElementForLastTouch:(NSDictionary*)element { - _contextMenuInfoForLastTouch.dom_element = [element copy]; +// Sets the value of |params|. +- (void)setParamsForLastTouch:(const web::ContextMenuParams&)params { + _contextMenuParams = params; if (_contextMenuNeedsDisplay) { _contextMenuNeedsDisplay = NO; UMA_HISTOGRAM_ENUMERATION(kContextMenuDelayedElementDetailsHistogram, @@ -425,33 +373,14 @@ } } -- (void)didReceiveScriptMessage:(WKScriptMessage*)message { - NSMutableDictionary* response = - [[NSMutableDictionary alloc] initWithDictionary:message.body]; - _contextMenuInfoForLastTouch.is_main_frame = message.frameInfo.mainFrame; - NSString* requestID = response[web::kContextMenuElementRequestId]; - HTMLElementFetchRequest* fetchRequest = - _pendingElementFetchRequests[requestID]; - // Do not process the message if a fetch request with a matching |requestID| - // was not found. This ensures that the response matches a request made by - // this CRWLegacyContextMenuController instance. - if (fetchRequest) { - [_pendingElementFetchRequests removeObjectForKey:requestID]; - [fetchRequest runHandlerWithResponse:response]; - } -} - - (void)cancelContextMenuDisplay { if (_contextMenuNeedsDisplay) { UMA_HISTOGRAM_ENUMERATION(kContextMenuDelayedElementDetailsHistogram, DelayedElementDetailsState::Cancel); } _contextMenuNeedsDisplay = NO; - _contextMenuInfoForLastTouch.location = CGPointZero; - for (HTMLElementFetchRequest* fetchRequest in _pendingElementFetchRequests - .allValues) { - [fetchRequest invalidate]; - } + _lastTouchLocation = CGPointZero; + [self.elementFetcher cancelFetches]; } #pragma mark - @@ -481,14 +410,15 @@ // touch. If there a link, the web controller will reject system's context // menu and show another one. If for some reason context menu info is not // fetched - system context menu will be shown. - [self setDOMElementForLastTouch:nil]; + _contextMenuParams.reset(); [self cancelContextMenuDisplay]; __weak CRWLegacyContextMenuController* weakSelf = self; - [self fetchDOMElementAtPoint:[touch locationInView:_webView] - completionHandler:^(NSDictionary* element) { - [weakSelf setDOMElementForLastTouch:element]; - }]; + [self.elementFetcher + fetchDOMElementAtPoint:[touch locationInView:_webView.scrollView] + completionHandler:^(const web::ContextMenuParams& params) { + [weakSelf setParamsForLastTouch:params]; + }]; return YES; } @@ -512,39 +442,6 @@ return YES; } -#pragma mark - -#pragma mark Web Page Features - -- (void)fetchDOMElementAtPoint:(CGPoint)point - completionHandler:(void (^)(NSDictionary*))handler { - if (!self.webState) { - return; - } - web::WebFrame* frame = GetMainFrame(self.webState); - if (!frame) { - // A WebFrame may not exist for certain types of content, like PDFs. - return; - } - DCHECK(handler); - - std::string requestID = base::UnguessableToken::Create().ToString(); - HTMLElementFetchRequest* fetchRequest = - [[HTMLElementFetchRequest alloc] initWithFoundElementHandler:handler]; - _pendingElementFetchRequests[base::SysUTF8ToNSString(requestID)] = - fetchRequest; - - CGSize webViewContentSize = self.webScrollView.contentSize; - - std::vector<base::Value> args; - args.push_back(base::Value(requestID)); - args.push_back(base::Value(point.x + self.scrollPosition.x)); - args.push_back(base::Value(point.y + self.scrollPosition.y)); - args.push_back(base::Value(webViewContentSize.width)); - args.push_back(base::Value(webViewContentSize.height)); - frame->CallJavaScriptFunction(std::string(kFindElementAtPointFunctionName), - args); -} - #pragma mark - CRWWebStateObserver - (void)webStateDestroyed:(web::WebState*)webState {
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 7323264e..0524d388 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -46,6 +46,7 @@ #import "ios/web/security/crw_ssl_status_updater.h" #import "ios/web/web_state/page_viewport_state.h" #import "ios/web/web_state/ui/cookie_blocking_error_logger.h" +#import "ios/web/web_state/ui/crw_context_menu_controller.h" #import "ios/web/web_state/ui/crw_legacy_context_menu_controller.h" #import "ios/web/web_state/ui/crw_swipe_recognizer_provider.h" #import "ios/web/web_state/ui/crw_web_controller_container_view.h" @@ -223,6 +224,10 @@ // Returns the navigation item for the current page. @property(nonatomic, readonly) web::NavigationItemImpl* currentNavItem; +// ContextMenu controller, handling the interactions with the context menu. +@property(nonatomic, strong) + CRWContextMenuController* contextMenuController API_AVAILABLE(ios(13.0)); + // Returns the current URL of the web view, and sets |trustLevel| accordingly // based on the confidence in the verification. - (GURL)webURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel; @@ -1550,10 +1555,22 @@ requireGestureRecognizerToFail:swipeRecognizer]; } - self.UIHandler.contextMenuController = - [[CRWLegacyContextMenuController alloc] + BOOL usingNewContextMenu = NO; + if (web::GetWebClient()->EnableLongPressUIContextMenu()) { + if (@available(iOS 13, *)) { + usingNewContextMenu = YES; + self.contextMenuController = [[CRWContextMenuController alloc] initWithWebView:self.webView webState:self.webStateImpl]; + } + } + if (!usingNewContextMenu) { + // Default to legacy implementation. + self.UIHandler.contextMenuController = + [[CRWLegacyContextMenuController alloc] + initWithWebView:self.webView + webState:self.webStateImpl]; + } // WKWebViews with invalid or empty frames have exhibited rendering bugs, so // resize the view to match the container view upon creation.
diff --git a/ios/web/web_state/ui/crw_wk_ui_handler.h b/ios/web/web_state/ui/crw_wk_ui_handler.h index 27a7e3b90..12a70bd 100644 --- a/ios/web/web_state/ui/crw_wk_ui_handler.h +++ b/ios/web/web_state/ui/crw_wk_ui_handler.h
@@ -19,6 +19,7 @@ // Delegate for the handler. @property(nonatomic, weak) id<CRWWKUIHandlerDelegate> delegate; +// TODO(crbug.com/1156636): Remove once the new context menus have shipped. // Context menu controller, to be set when the WebView is created. @property(nonatomic, strong) CRWLegacyContextMenuController* contextMenuController;
diff --git a/ios/web/web_state/ui/crw_wk_ui_handler.mm b/ios/web/web_state/ui/crw_wk_ui_handler.mm index 931c18c..adf24de 100644 --- a/ios/web/web_state/ui/crw_wk_ui_handler.mm +++ b/ios/web/web_state/ui/crw_wk_ui_handler.mm
@@ -168,6 +168,9 @@ }]; } +#if !defined(__IPHONE_13_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_13_0 + +// TODO(crbug.com/1131852): Preview depracted is iOS13+ - (BOOL)webView:(WKWebView*)webView shouldPreviewElement:(WKPreviewElementInfo*)elementInfo { return self.webStateImpl->ShouldPreviewLink( @@ -211,6 +214,8 @@ completionHandler); } +#endif // End of >iOS13 deprecated block. + - (void)webView:(WKWebView*)webView contextMenuDidEndForElement:(WKContextMenuElementInfo*)elementInfo API_AVAILABLE(ios(13.0)) {
diff --git a/ios/web/web_state/ui/html_element_fetch_request_unittest.mm b/ios/web/web_state/ui/html_element_fetch_request_unittest.mm deleted file mode 100644 index 58b4b563..0000000 --- a/ios/web/web_state/ui/html_element_fetch_request_unittest.mm +++ /dev/null
@@ -1,62 +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. - -#import "ios/web/web_state/ui/html_element_fetch_request.h" - -#include "base/time/time.h" -#import "ios/web/web_state/context_menu_constants.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/gtest_mac.h" -#include "testing/platform_test.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace web { - -using HtmlElementFetchRequestTest = PlatformTest; - -// Tests that |creationTime| is set at HtmlElementFetchRequest object creation. -TEST_F(HtmlElementFetchRequestTest, CreationTime) { - HTMLElementFetchRequest* request = - [[HTMLElementFetchRequest alloc] initWithFoundElementHandler:nil]; - base::TimeDelta delta = base::TimeTicks::Now() - request.creationTime; - // Validate that |request.creationTime| is "now", but only use second - // precision to avoid performance induced test flake. - EXPECT_GT(1, delta.InSeconds()); -} - -// Tests that |runHandlerWithResponse:| runs the handler from the object's -// initializer with the expected |response|. -TEST_F(HtmlElementFetchRequestTest, RunHandler) { - __block bool handler_called = false; - __block NSDictionary* received_response = nil; - void (^handler)(NSDictionary*) = ^(NSDictionary* response) { - handler_called = true; - received_response = response; - }; - HTMLElementFetchRequest* request = - [[HTMLElementFetchRequest alloc] initWithFoundElementHandler:handler]; - NSDictionary* response = @{kContextMenuElementInnerText : @"text"}; - [request runHandlerWithResponse:response]; - EXPECT_TRUE(handler_called); - EXPECT_NSEQ(response, received_response); -} - -// Tests that |runHandlerWithResponse:| does not run the handler from the -// object's initializer if |invalidate| has been called. -TEST_F(HtmlElementFetchRequestTest, Invalidate) { - __block bool handler_called = false; - void (^handler)(NSDictionary*) = ^(NSDictionary* response) { - handler_called = true; - }; - HTMLElementFetchRequest* request = - [[HTMLElementFetchRequest alloc] initWithFoundElementHandler:handler]; - [request invalidate]; - [request runHandlerWithResponse:nil]; - EXPECT_FALSE(handler_called); -} - -} // namespace web
diff --git a/ios/web/web_state/ui/wk_web_view_configuration_provider.mm b/ios/web/web_state/ui/wk_web_view_configuration_provider.mm index be13021..d8e1a0b 100644 --- a/ios/web/web_state/ui/wk_web_view_configuration_provider.mm +++ b/ios/web/web_state/ui/wk_web_view_configuration_provider.mm
@@ -125,9 +125,11 @@ // displayed and also prevents the iOS 13 ContextMenu delegate methods // from being called. // https://github.com/WebKit/webkit/blob/1233effdb7826a5f03b3cdc0f67d713741e70976/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm#L307 - BOOL enable_long_press_action = - !web::GetWebClient()->EnableLongPressAndForceTouchHandling(); - [configuration_ setValue:@(enable_long_press_action) + BOOL disable_long_press_system_actions = + + web::GetWebClient()->EnableLongPressAndForceTouchHandling() || + web::GetWebClient()->EnableLongPressUIContextMenu(); + [configuration_ setValue:@(!disable_long_press_system_actions) forKey:@"longPressActionsEnabled"]; } @catch (NSException* exception) { NOTREACHED() << "Error setting value for longPressActionsEnabled";
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller.mm b/ios/web_view/internal/autofill/cwv_autofill_controller.mm index c37d30d..f616c17 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
@@ -70,9 +70,6 @@ // Javascript autofill manager associated with |webState|. JsAutofillManager* _JSAutofillManager; - // Javascript suggestion manager associated with |webState|. - JsSuggestionManager* _JSSuggestionManager; - // The |webState| which this autofill controller should observe. web::WebState* _webState; @@ -95,7 +92,7 @@ std::unique_ptr<autofill::FormActivityObserverBridge> _formActivityObserverBridge; - NSString* _lastFormActivityWebFrameID; + std::string _lastFormActivityWebFrameID; NSString* _lastFormActivityTypedValue; NSString* _lastFormActivityType; FormRendererId _lastFormActivityUniqueFormID; @@ -110,7 +107,6 @@ autofillClient autofillAgent:(AutofillAgent*)autofillAgent JSAutofillManager:(JsAutofillManager*)JSAutofillManager - JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager passwordManager:(std::unique_ptr<password_manager::PasswordManager>) passwordManager passwordManagerClient: @@ -144,8 +140,6 @@ _JSAutofillManager = JSAutofillManager; - _JSSuggestionManager = JSSuggestionManager; - _passwordManagerClient = std::move(passwordManagerClient); _passwordManagerClient->set_bridge(self); _passwordManager = std::move(passwordManager); @@ -301,21 +295,20 @@ } - (void)focusPreviousField { - [_JSSuggestionManager - selectPreviousElementInFrameWithID:_lastFormActivityWebFrameID]; + autofill::JsSuggestionManager::GetOrCreateForWebState(_webState) + ->SelectPreviousElementInFrameWithID(_lastFormActivityWebFrameID); } - (void)focusNextField { - [_JSSuggestionManager - selectNextElementInFrameWithID:_lastFormActivityWebFrameID]; + autofill::JsSuggestionManager::GetOrCreateForWebState(_webState) + ->SelectNextElementInFrameWithID(_lastFormActivityWebFrameID); } - (void)checkIfPreviousAndNextFieldsAreAvailableForFocusWithCompletionHandler: (void (^)(BOOL previous, BOOL next))completionHandler { - [_JSSuggestionManager - fetchPreviousAndNextElementsPresenceInFrameWithID: - _lastFormActivityWebFrameID - completionHandler:completionHandler]; + autofill::JsSuggestionManager::GetOrCreateForWebState(_webState) + ->FetchPreviousAndNextElementsPresenceInFrameWithID( + _lastFormActivityWebFrameID, base::BindOnce(completionHandler)); } #pragma mark - CWVAutofillClientIOSBridge @@ -493,7 +486,7 @@ NSString* nsType = base::SysUTF8ToNSString(params.type); BOOL userInitiated = params.has_user_gesture; - _lastFormActivityWebFrameID = nsFrameID; + _lastFormActivityWebFrameID = GetWebFrameId(frame); _lastFormActivityTypedValue = nsValue; _lastFormActivityType = nsType; if (params.type == "focus") {
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h b/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h index 8643f3a2..31f91166 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h +++ b/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h
@@ -37,7 +37,6 @@ @class AutofillAgent; @class JsAutofillManager; -@class JsSuggestionManager; @class SharedPasswordController; @interface CWVAutofillController () <AutofillDriverIOSBridge, @@ -53,7 +52,6 @@ autofillClient autofillAgent:(AutofillAgent*)autofillAgent JSAutofillManager:(JsAutofillManager*)JSAutofillManager - JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager passwordManager:(std::unique_ptr<password_manager::PasswordManager>) passwordManager passwordManagerClient:
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 8358b69..0d5c013 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm
@@ -19,7 +19,6 @@ #import "components/autofill/ios/browser/fake_autofill_agent.h" #import "components/autofill/ios/browser/fake_js_autofill_manager.h" #import "components/autofill/ios/browser/form_suggestion.h" -#import "components/autofill/ios/browser/js_suggestion_manager.h" #include "components/autofill/ios/form_util/form_activity_params.h" #import "components/autofill/ios/form_util/form_activity_tab_helper.h" #import "components/autofill/ios/form_util/test_form_activity_tab_helper.h" @@ -88,7 +87,6 @@ web_state_.SetJSInjectionReceiver(injectionReceiver); js_autofill_manager_ = [[FakeJSAutofillManager alloc] init]; - js_suggestion_manager_ = OCMClassMock([JsSuggestionManager class]); UniqueIDDataTabHelper::CreateForWebState(&web_state_); @@ -125,7 +123,6 @@ autofillClient:std::move(autofill_client) autofillAgent:autofill_agent_ JSAutofillManager:js_autofill_manager_ - JSSuggestionManager:js_suggestion_manager_ passwordManager:std::move(password_manager) passwordManagerClient:std::move(password_manager_client) passwordManagerDriver:std::move(password_manager_driver) @@ -156,7 +153,6 @@ id password_controller_; std::unique_ptr<autofill::TestFormActivityTabHelper> form_activity_tab_helper_; - id js_suggestion_manager_; WebViewPasswordManagerClient* password_manager_client_; }; @@ -310,33 +306,6 @@ EXPECT_NSEQ(frame_id_, js_autofill_manager_.lastClearedFrameIdentifier); } -// Tests CWVAutofillController focus previous field. -TEST_F(CWVAutofillControllerTest, FocusPrevious) { - [[js_suggestion_manager_ expect] selectPreviousElementInFrameWithID:nil]; - [autofill_controller_ focusPreviousField]; - [js_suggestion_manager_ verify]; -} - -// Tests CWVAutofillController focus next field. -TEST_F(CWVAutofillControllerTest, FocusNext) { - [[js_suggestion_manager_ expect] selectNextElementInFrameWithID:nil]; - [autofill_controller_ focusNextField]; - [js_suggestion_manager_ verify]; -} - -// Tests CWVAutofillController checks previous and next focusable state. -TEST_F(CWVAutofillControllerTest, CheckFocus) { - id completionHandler = ^(BOOL previous, BOOL next) { - }; - [[js_suggestion_manager_ expect] - fetchPreviousAndNextElementsPresenceInFrameWithID:nil - completionHandler:completionHandler]; - [autofill_controller_ - checkIfPreviousAndNextFieldsAreAvailableForFocusWithCompletionHandler: - completionHandler]; - [js_suggestion_manager_ verify]; -} - // Tests CWVAutofillController delegate focus callback is invoked. TEST_F(CWVAutofillControllerTest, FocusCallback) { id delegate = OCMProtocolMock(@protocol(CWVAutofillControllerDelegate));
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm index f368ed50..5ca736ba 100644 --- a/ios/web_view/internal/cwv_web_view.mm +++ b/ios/web_view/internal/cwv_web_view.mm
@@ -652,11 +652,6 @@ initWithPrefService:_configuration.browserState->GetPrefs() webState:_webState.get()]; JsAutofillManager* JSAutofillManager = [[JsAutofillManager alloc] init]; - JsSuggestionManager* JSSuggestionManager = - base::mac::ObjCCastStrict<JsSuggestionManager>( - [_webState->GetJSInjectionReceiver() - instanceOfClass:[JsSuggestionManager class]]); - [JSSuggestionManager setWebFramesManager:_webState->GetWebFramesManager()]; auto passwordManagerClient = ios_web_view::WebViewPasswordManagerClient::Create( @@ -682,7 +677,6 @@ autofillClient:std::move(autofillClient) autofillAgent:autofillAgent JSAutofillManager:JSAutofillManager - JSSuggestionManager:JSSuggestionManager passwordManager:std::move(passwordManager) passwordManagerClient:std::move(passwordManagerClient) passwordManagerDriver:std::move(passwordManagerDriver)
diff --git a/media/audio/audio_manager_base.cc b/media/audio/audio_manager_base.cc index 5e1d35df..2f97c51cb 100644 --- a/media/audio/audio_manager_base.cc +++ b/media/audio/audio_manager_base.cc
@@ -343,7 +343,7 @@ std::string output_device_id = AudioDeviceDescription::IsDefaultDevice(device_id) ? -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) // On ChromeOS, it is expected that, if the default device is given, // no specific device ID should be used since the actual output device // should change dynamically if the system default device changes.
diff --git a/media/base/mime_util_internal.cc b/media/base/mime_util_internal.cc index 39d6247..6c554eb1 100644 --- a/media/base/mime_util_internal.cc +++ b/media/base/mime_util_internal.cc
@@ -565,13 +565,12 @@ case THEORA: return false; - // AV1 is not supported on Android yet. - case AV1: - return false; - // ---------------------------------------------------------------------- // The remaining codecs may be supported depending on platform abilities. // ---------------------------------------------------------------------- + case AV1: + return BUILDFLAG(ENABLE_AV1_DECODER); + case MPEG2_AAC: // MPEG2_AAC cannot be used in HLS (mpegurl suffix), but this is enforced // in the parsing step by excluding MPEG2_AAC from the list of
diff --git a/media/base/mime_util_unittest.cc b/media/base/mime_util_unittest.cc index c539b94..ae9451d 100644 --- a/media/base/mime_util_unittest.cc +++ b/media/base/mime_util_unittest.cc
@@ -563,7 +563,6 @@ switch (codec) { // These codecs are never supported by the Android platform. case MimeUtil::INVALID_CODEC: - case MimeUtil::AV1: case MimeUtil::MPEG_H_AUDIO: case MimeUtil::THEORA: EXPECT_FALSE(result); @@ -611,6 +610,10 @@ case MimeUtil::EAC3: EXPECT_EQ(HasEac3Support(), result); break; + + case MimeUtil::AV1: + EXPECT_EQ(BUILDFLAG(ENABLE_AV1_DECODER), result); + break; } }); } @@ -630,7 +633,6 @@ case MimeUtil::INVALID_CODEC: case MimeUtil::MPEG_H_AUDIO: case MimeUtil::THEORA: - case MimeUtil::AV1: EXPECT_FALSE(result); break; @@ -671,6 +673,10 @@ case MimeUtil::EAC3: EXPECT_EQ(HasEac3Support(), result); break; + + case MimeUtil::AV1: + EXPECT_EQ(BUILDFLAG(ENABLE_AV1_DECODER), result); + break; } }); }
diff --git a/media/base/status_codes.h b/media/base/status_codes.h index e4781d5..7012484 100644 --- a/media/base/status_codes.h +++ b/media/base/status_codes.h
@@ -78,6 +78,8 @@ kCreateVideoProcessorEnumeratorFailed = 0x00000312, kCreateVideoProcessorFailed = 0x00000313, kQueryVideoContextFailed = 0x00000314, + kAcceleratorFlushFailed = 0x00000315, + kTryAgainNotSupported = 0x00000316, // MojoDecoder Errors: 0x04 kMojoDecoderNoWrappedDecoder = 0x00000401,
diff --git a/media/capture/video/chromeos/camera_device_context.cc b/media/capture/video/chromeos/camera_device_context.cc index 2de1625..6f5f659 100644 --- a/media/capture/video/chromeos/camera_device_context.cc +++ b/media/capture/video/chromeos/camera_device_context.cc
@@ -153,4 +153,9 @@ return result == VideoCaptureDevice::Client::ReserveResult::kSucceeded; } +bool CameraDeviceContext::HasClient() { + base::AutoLock lock(client_lock_); + return !clients_.empty(); +} + } // namespace media
diff --git a/media/capture/video/chromeos/camera_device_delegate.cc b/media/capture/video/chromeos/camera_device_delegate.cc index b05c2db..b8260fc 100644 --- a/media/capture/video/chromeos/camera_device_delegate.cc +++ b/media/capture/video/chromeos/camera_device_delegate.cc
@@ -211,6 +211,8 @@ return StreamType::kYUVInput; case 3: return StreamType::kYUVOutput; + case 4: + return StreamType::kRecordingOutput; default: return StreamType::kUnknown; } @@ -226,6 +228,8 @@ return std::string("StreamType::kYUVInput"); case StreamType::kYUVOutput: return std::string("StreamType::kYUVOutput"); + case StreamType::kRecordingOutput: + return std::string("StreamType::kRecordingOutput"); default: return std::string("Unknown StreamType value: ") + base::NumberToString(static_cast<int32_t>(stream_type)); @@ -272,18 +276,16 @@ VideoCaptureDeviceDescriptor device_descriptor, scoped_refptr<CameraHalDelegate> camera_hal_delegate, scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner, - CameraAppDeviceImpl* camera_app_device, - ClientType client_type) + CameraAppDeviceImpl* camera_app_device) : device_descriptor_(device_descriptor), camera_hal_delegate_(std::move(camera_hal_delegate)), ipc_task_runner_(std::move(ipc_task_runner)), - camera_app_device_(camera_app_device), - client_type_(client_type) {} + camera_app_device_(camera_app_device) {} CameraDeviceDelegate::~CameraDeviceDelegate() = default; void CameraDeviceDelegate::AllocateAndStart( - const VideoCaptureParams& params, + const base::flat_map<ClientType, VideoCaptureParams>& params, CameraDeviceContext* device_context) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); @@ -593,6 +595,18 @@ result_metadata_frame_number_for_photo_state_ = current_request_frame_number_; } +void CameraDeviceDelegate::ReconfigureStreams( + const base::flat_map<ClientType, VideoCaptureParams>& params) { + DCHECK(ipc_task_runner_->BelongsToCurrentThread()); + chrome_capture_params_ = params; + if (request_manager_) { + // ReconfigureStreams is used for video recording. It does not require + // photo. + request_manager_->StopPreview(base::BindOnce( + &CameraDeviceDelegate::OnFlushed, GetWeakPtr(), false, base::nullopt)); + } +} + void CameraDeviceDelegate::SetRotation(int rotation) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); DCHECK(rotation >= 0 && rotation < 360 && rotation % 90 == 0); @@ -620,11 +634,11 @@ gfx::Size new_blob_resolution(static_cast<int32_t>(settings->width), static_cast<int32_t>(settings->height)); request_manager_->StopPreview( - base::BindOnce(&CameraDeviceDelegate::OnFlushed, GetWeakPtr(), + base::BindOnce(&CameraDeviceDelegate::OnFlushed, GetWeakPtr(), true, std::move(new_blob_resolution))); } else { request_manager_->StopPreview(base::BindOnce( - &CameraDeviceDelegate::OnFlushed, GetWeakPtr(), base::nullopt)); + &CameraDeviceDelegate::OnFlushed, GetWeakPtr(), true, base::nullopt)); } return true; } @@ -645,7 +659,7 @@ // Trigger the reconfigure process if it not yet triggered. if (on_reconfigured_callbacks_.empty()) { request_manager_->StopPreview(base::BindOnce( - &CameraDeviceDelegate::OnFlushed, GetWeakPtr(), base::nullopt)); + &CameraDeviceDelegate::OnFlushed, GetWeakPtr(), true, base::nullopt)); } auto on_reconfigured_callback = base::BindOnce( [](base::WeakPtr<Camera3AController> controller, @@ -681,6 +695,7 @@ } void CameraDeviceDelegate::OnFlushed( + bool require_photo, base::Optional<gfx::Size> new_blob_resolution, int32_t result) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); @@ -692,7 +707,7 @@ return; } device_context_->SetState(CameraDeviceContext::State::kInitialized); - ConfigureStreams(true, std::move(new_blob_resolution)); + ConfigureStreams(require_photo, std::move(new_blob_resolution)); } void CameraDeviceDelegate::OnClosed(int32_t result) { @@ -760,13 +775,15 @@ DCHECK_EQ(device_context_->GetState(), CameraDeviceContext::State::kStarting); mojo::PendingRemote<cros::mojom::Camera3CallbackOps> callback_ops; + // Assumes the buffer_type will be the same for all |chrome_capture_params|. request_manager_ = std::make_unique<RequestManager>( callback_ops.InitWithNewPipeAndPassReceiver(), std::make_unique<StreamCaptureInterfaceImpl>(GetWeakPtr()), - device_context_, chrome_capture_params_.buffer_type, + device_context_, + chrome_capture_params_[ClientType::kPreviewClient].buffer_type, std::make_unique<CameraBufferFactory>(), base::BindRepeating(&RotateAndBlobify), ipc_task_runner_, - camera_app_device_, client_type_); + camera_app_device_); camera_3a_controller_ = std::make_unique<Camera3AController>( static_metadata_, request_manager_.get(), ipc_task_runner_); device_ops_->Initialize( @@ -820,27 +837,33 @@ DCHECK_EQ(device_context_->GetState(), CameraDeviceContext::State::kInitialized); - // Set up context for preview stream. - cros::mojom::Camera3StreamPtr preview_stream = - cros::mojom::Camera3Stream::New(); - preview_stream->id = static_cast<uint64_t>(StreamType::kPreviewOutput); - preview_stream->stream_type = - cros::mojom::Camera3StreamType::CAMERA3_STREAM_OUTPUT; - preview_stream->width = - chrome_capture_params_.requested_format.frame_size.width(); - preview_stream->height = - chrome_capture_params_.requested_format.frame_size.height(); - preview_stream->format = - cros::mojom::HalPixelFormat::HAL_PIXEL_FORMAT_YCbCr_420_888; - preview_stream->usage = cros::mojom::GRALLOC_USAGE_HW_COMPOSER | - cros::mojom::GRALLOC_USAGE_HW_VIDEO_ENCODER; - preview_stream->data_space = 0; - preview_stream->rotation = - cros::mojom::Camera3StreamRotation::CAMERA3_STREAM_ROTATION_0; - cros::mojom::Camera3StreamConfigurationPtr stream_config = cros::mojom::Camera3StreamConfiguration::New(); - stream_config->streams.push_back(std::move(preview_stream)); + for (const auto& param : chrome_capture_params_) { + // Set up context for preview stream and record stream. + cros::mojom::Camera3StreamPtr stream = cros::mojom::Camera3Stream::New(); + StreamType stream_type = (param.first == ClientType::kPreviewClient) + ? StreamType::kPreviewOutput + : StreamType::kRecordingOutput; + // TODO(henryhsu): PreviewClient should remove HW_VIDEO_ENCODER usage when + // multiple streams enabled. + auto usage = (param.first == ClientType::kPreviewClient) + ? (cros::mojom::GRALLOC_USAGE_HW_COMPOSER | + cros::mojom::GRALLOC_USAGE_HW_VIDEO_ENCODER) + : cros::mojom::GRALLOC_USAGE_HW_VIDEO_ENCODER; + stream->id = static_cast<uint64_t>(stream_type); + stream->stream_type = cros::mojom::Camera3StreamType::CAMERA3_STREAM_OUTPUT; + stream->width = param.second.requested_format.frame_size.width(); + stream->height = param.second.requested_format.frame_size.height(); + stream->format = + cros::mojom::HalPixelFormat::HAL_PIXEL_FORMAT_YCbCr_420_888; + stream->usage = usage; + stream->data_space = 0; + stream->rotation = + cros::mojom::Camera3StreamRotation::CAMERA3_STREAM_ROTATION_0; + + stream_config->streams.push_back(std::move(stream)); + } // Set up context for still capture stream. We set still capture stream to the // JPEG stream configuration with maximum supported resolution. @@ -961,9 +984,9 @@ current_blob_resolution_.SetSize(blob_resolution.width(), blob_resolution.height()); - request_manager_->SetUpStreamsAndBuffers( - chrome_capture_params_.requested_format, static_metadata_, - std::move(updated_config->streams)); + request_manager_->SetUpStreamsAndBuffers(chrome_capture_params_, + static_metadata_, + std::move(updated_config->streams)); device_context_->SetState(CameraDeviceContext::State::kStreamConfigured); // Kick off the preview stream. @@ -1130,8 +1153,10 @@ SetFpsRangeInMetadata(&settings, specified_fps_range->GetMin(), specified_fps_range->GetMax()); } else { + // Assumes the frame_rate will be the same for all |chrome_capture_params|. int32_t requested_frame_rate = - std::round(chrome_capture_params_.requested_format.frame_rate); + std::round(chrome_capture_params_[ClientType::kPreviewClient] + .requested_format.frame_rate); bool prefer_constant_frame_rate = base::FeatureList::IsEnabled( chromeos::features::kPreferConstantFrameRate) ||
diff --git a/media/capture/video/chromeos/camera_device_delegate.h b/media/capture/video/chromeos/camera_device_delegate.h index f11df02..1e2e52f 100644 --- a/media/capture/video/chromeos/camera_device_delegate.h +++ b/media/capture/video/chromeos/camera_device_delegate.h
@@ -8,6 +8,7 @@ #include <memory> #include <queue> +#include "base/containers/flat_map.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" @@ -34,7 +35,19 @@ kJpegOutput = 1, kYUVInput = 2, kYUVOutput = 3, - kUnknown, + kRecordingOutput = 4, + kUnknown = 5, +}; + +// A map to know that each StreamType belongs to which ClientType. +// The index is StreamType value. +constexpr std::array<ClientType, static_cast<int>(StreamType::kUnknown)> + kStreamClientTypeMap = { + ClientType::kPreviewClient, // kPreviewOutput + ClientType::kPreviewClient, // kJpegOutput + ClientType::kPreviewClient, // kYUVInput + ClientType::kPreviewClient, // kYUVOutput + ClientType::kVideoClient, // kRecordingOutput }; // The metadata might be large so clone a whole metadata might be relatively @@ -96,6 +109,11 @@ // AllocateAndStart of VideoCaptureDeviceArcChromeOS runs on. All the methods // in CameraDeviceDelegate run on |ipc_task_runner_| and hence all the // access to member variables is sequenced. +// +// CameraDeviceDelegate supports multiple clients. +// It will use the first client for preview stream and photo stream and use +// second client for recording stream. +// The second client will be a virtual camera device which is only used in CCA. class CAPTURE_EXPORT CameraDeviceDelegate final : public CaptureMetadataDispatcher::ResultMetadataObserver { public: @@ -103,20 +121,23 @@ VideoCaptureDeviceDescriptor device_descriptor, scoped_refptr<CameraHalDelegate> camera_hal_delegate, scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner, - CameraAppDeviceImpl* camera_app_device, - ClientType client_type); + CameraAppDeviceImpl* camera_app_device); ~CameraDeviceDelegate() final; // Delegation methods for the VideoCaptureDevice interface. - void AllocateAndStart(const VideoCaptureParams& params, - CameraDeviceContext* device_context); + void AllocateAndStart( + const base::flat_map<ClientType, VideoCaptureParams>& params, + CameraDeviceContext* device_context); void StopAndDeAllocate(base::OnceClosure device_close_callback); void TakePhoto(VideoCaptureDevice::TakePhotoCallback callback); void GetPhotoState(VideoCaptureDevice::GetPhotoStateCallback callback); void SetPhotoOptions(mojom::PhotoSettingsPtr settings, VideoCaptureDevice::SetPhotoOptionsCallback callback); + void ReconfigureStreams( + const base::flat_map<ClientType, VideoCaptureParams>& params); + // Sets the frame rotation angle in |rotation_|. |rotation_| is clockwise // rotation in degrees, and is passed to |client_| along with the captured // frames. @@ -138,8 +159,10 @@ // Mojo connection error handler. void OnMojoConnectionError(); - // Reconfigure streams for picture taking. - void OnFlushed(base::Optional<gfx::Size> new_blob_resolution, int32_t result); + // Reconfigure streams for picture taking and recording. + void OnFlushed(bool require_photo, + base::Optional<gfx::Size> new_blob_resolution, + int32_t result); // Callback method for the Close Mojo IPC call. This method resets the Mojo // connection and closes the camera device. @@ -226,7 +249,8 @@ const scoped_refptr<CameraHalDelegate> camera_hal_delegate_; - VideoCaptureParams chrome_capture_params_; + // Map client type to video capture parameter. + base::flat_map<ClientType, VideoCaptureParams> chrome_capture_params_; CameraDeviceContext* device_context_; @@ -281,8 +305,6 @@ ResultMetadata result_metadata_; gfx::Rect active_array_size_; - ClientType client_type_; - base::WeakPtrFactory<CameraDeviceDelegate> weak_ptr_factory_{this}; DISALLOW_IMPLICIT_CONSTRUCTORS(CameraDeviceDelegate);
diff --git a/media/capture/video/chromeos/camera_device_delegate_unittest.cc b/media/capture/video/chromeos/camera_device_delegate_unittest.cc index 8ed8f8c..a9489f2 100644 --- a/media/capture/video/chromeos/camera_device_delegate_unittest.cc +++ b/media/capture/video/chromeos/camera_device_delegate_unittest.cc
@@ -111,11 +111,13 @@ constexpr size_t kDefaultWidth = 1280, kDefaultHeight = 720; constexpr int32_t kDefaultMinFrameRate = 1, kDefaultMaxFrameRate = 30; -VideoCaptureParams GetDefaultCaptureParams() { +base::flat_map<ClientType, VideoCaptureParams> GetDefaultCaptureParams() { VideoCaptureParams params; + base::flat_map<ClientType, VideoCaptureParams> capture_params; params.requested_format = {gfx::Size(kDefaultWidth, kDefaultHeight), float{kDefaultMaxFrameRate}, PIXEL_FORMAT_I420}; - return params; + capture_params[ClientType::kPreviewClient] = params; + return capture_params; } } // namespace @@ -162,7 +164,7 @@ camera_device_delegate_ = std::make_unique<CameraDeviceDelegate>( devices_info[0].descriptor, camera_hal_delegate_, - device_delegate_thread_.task_runner(), nullptr, client_type_); + device_delegate_thread_.task_runner(), nullptr); } void GetNumberOfFakeCameras(
diff --git a/media/capture/video/chromeos/camera_hal_delegate.cc b/media/capture/video/chromeos/camera_hal_delegate.cc index c1041dc0..903c535 100644 --- a/media/capture/video/chromeos/camera_hal_delegate.cc +++ b/media/capture/video/chromeos/camera_hal_delegate.cc
@@ -194,39 +194,16 @@ return nullptr; } - if (camera_app_device_bridge) { - auto* camera_app_device = camera_app_device_bridge->GetCameraAppDevice( - device_descriptor.device_id); - // Since the cleanup callback will be triggered when VideoCaptureDevice died - // and |camera_app_device_bridge| is actually owned by - // VideoCaptureServiceImpl, it should be safe to assume - // |camera_app_device_bridge| is still valid here. - auto cleanup_callback = base::BindOnce( - [](const std::string& device_id, CameraAppDeviceBridgeImpl* bridge) { - bridge->OnDeviceClosed(device_id); - }, - device_descriptor.device_id, camera_app_device_bridge); - auto delegate = std::make_unique<VideoCaptureDeviceChromeOSDelegate>( - std::move(task_runner_for_screen_observer), device_descriptor, this, - camera_app_device, std::move(cleanup_callback)); - return std::make_unique<VideoCaptureDeviceChromeOSHalv3>( - std::move(delegate)); - } else { - auto delegate = std::make_unique<VideoCaptureDeviceChromeOSDelegate>( - std::move(task_runner_for_screen_observer), device_descriptor, this, - nullptr, base::DoNothing()); - return std::make_unique<VideoCaptureDeviceChromeOSHalv3>( - std::move(delegate)); - } + auto* delegate = GetVCDDelegate(task_runner_for_screen_observer, + device_descriptor, camera_app_device_bridge); + return std::make_unique<VideoCaptureDeviceChromeOSHalv3>(delegate); } void CameraHalDelegate::GetSupportedFormats( - int camera_id, + const cros::mojom::CameraInfoPtr& camera_info, VideoCaptureFormats* supported_formats) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - const cros::mojom::CameraInfoPtr& camera_info = camera_info_[camera_id]; - base::flat_set<int32_t> candidate_fps_set = GetAvailableFramerates(camera_info); @@ -371,7 +348,8 @@ desc.set_control_support(GetControlSupport(camera_info)); device_id_to_camera_id_[desc.device_id] = camera_id; devices_info.emplace_back(desc); - GetSupportedFormats(camera_id, &devices_info.back().supported_formats); + GetSupportedFormats(camera_info_[camera_id], + &devices_info.back().supported_formats); } } @@ -464,6 +442,47 @@ return it->second; } +VideoCaptureDeviceChromeOSDelegate* CameraHalDelegate::GetVCDDelegate( + scoped_refptr<base::SingleThreadTaskRunner> task_runner_for_screen_observer, + const VideoCaptureDeviceDescriptor& device_descriptor, + CameraAppDeviceBridgeImpl* camera_app_device_bridge) { + auto camera_id = GetCameraIdFromDeviceId(device_descriptor.device_id); + auto it = vcd_delegate_map_.find(camera_id); + if (it == vcd_delegate_map_.end() || it->second->HasDeviceClient() == 0) { + std::unique_ptr<VideoCaptureDeviceChromeOSDelegate> delegate; + if (camera_app_device_bridge) { + auto* camera_app_device = camera_app_device_bridge->GetCameraAppDevice( + device_descriptor.device_id); + // Since the cleanup callback will be triggered when VideoCaptureDevice + // died and |camera_app_device_bridge| is actually owned by + // VideoCaptureServiceImpl, it should be safe to assume + // |camera_app_device_bridge| is still valid here. + auto cleanup_callback = base::BindOnce( + [](const std::string& device_id, int camera_id, + CameraAppDeviceBridgeImpl* bridge, + base::flat_map< + int, std::unique_ptr<VideoCaptureDeviceChromeOSDelegate>>* + vcd_delegate_map) { + bridge->OnDeviceClosed(device_id); + vcd_delegate_map->erase(camera_id); + }, + device_descriptor.device_id, camera_id, camera_app_device_bridge, + &vcd_delegate_map_); + + delegate = std::make_unique<VideoCaptureDeviceChromeOSDelegate>( + std::move(task_runner_for_screen_observer), device_descriptor, this, + camera_app_device, std::move(cleanup_callback)); + } else { + delegate = std::make_unique<VideoCaptureDeviceChromeOSDelegate>( + std::move(task_runner_for_screen_observer), device_descriptor, this, + nullptr, base::DoNothing()); + } + vcd_delegate_map_[camera_id] = std::move(delegate); + return vcd_delegate_map_[camera_id].get(); + } + return it->second.get(); +} + void CameraHalDelegate::SetCameraModuleOnIpcThread( mojo::PendingRemote<cros::mojom::CameraModule> camera_module) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); @@ -490,6 +509,7 @@ external_camera_info_updated_.Signal(); // Clear all cached camera info, especially external cameras. + base::AutoLock lock(camera_info_lock_); camera_info_.clear(); pending_external_camera_info_.clear(); } @@ -523,6 +543,8 @@ void CameraHalDelegate::OnGotNumberOfCamerasOnIpcThread(int32_t num_cameras) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); + + base::AutoLock lock(camera_info_lock_); if (num_cameras < 0) { builtin_camera_info_updated_.Signal(); LOG(ERROR) << "Failed to get number of cameras: " << num_cameras; @@ -544,6 +566,8 @@ void CameraHalDelegate::OnSetCallbacksOnIpcThread(int32_t result) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); + + base::AutoLock lock(camera_info_lock_); if (result) { num_builtin_cameras_ = 0; builtin_camera_info_updated_.Signal(); @@ -595,6 +619,7 @@ // |camera_info_| might contain some entries for external cameras as well, // we should check all built-in cameras explicitly. bool all_updated = [&]() { + camera_info_lock_.AssertAcquired(); for (size_t i = 0; i < num_builtin_cameras_; i++) { if (camera_info_.find(i) == camera_info_.end()) { return false;
diff --git a/media/capture/video/chromeos/camera_hal_delegate.h b/media/capture/video/chromeos/camera_hal_delegate.h index ccce7e1..34d4ddd 100644 --- a/media/capture/video/chromeos/camera_hal_delegate.h +++ b/media/capture/video/chromeos/camera_hal_delegate.h
@@ -9,6 +9,7 @@ #include <string> #include <unordered_map> +#include "base/containers/flat_map.h" #include "base/macros.h" #include "base/sequence_checker.h" #include "base/single_thread_task_runner.h" @@ -30,6 +31,7 @@ class CameraAppDeviceBridgeImpl; class CameraBufferFactory; +class VideoCaptureDeviceChromeOSDelegate; // CameraHalDelegate is the component which does Mojo IPCs to the camera HAL // process on Chrome OS to access the module-level camera functionalities such @@ -98,9 +100,15 @@ void OnRegisteredCameraHalClient(int32_t result); - void GetSupportedFormats(int camera_id, + void GetSupportedFormats(const cros::mojom::CameraInfoPtr& camera_info, VideoCaptureFormats* supported_formats); + VideoCaptureDeviceChromeOSDelegate* GetVCDDelegate( + scoped_refptr<base::SingleThreadTaskRunner> + task_runner_for_screen_observer, + const VideoCaptureDeviceDescriptor& device_descriptor, + CameraAppDeviceBridgeImpl* camera_app_device_bridge); + void SetCameraModuleOnIpcThread( mojo::PendingRemote<cros::mojom::CameraModule> camera_module); @@ -174,9 +182,10 @@ // conditions. For external cameras, the |camera_info_| would be read nad // updated in CameraDeviceStatusChange, which is also protected by // |camera_info_lock_|. - size_t num_builtin_cameras_; base::Lock camera_info_lock_; - std::unordered_map<int, cros::mojom::CameraInfoPtr> camera_info_; + size_t num_builtin_cameras_ GUARDED_BY(camera_info_lock_); + std::unordered_map<int, cros::mojom::CameraInfoPtr> camera_info_ + GUARDED_BY(camera_info_lock_); // A map from |VideoCaptureDeviceDescriptor.device_id| to camera id, which is // updated in GetDeviceDescriptors() and queried in @@ -204,6 +213,9 @@ // information of vendor tags. Bound to |ipc_task_runner_|. VendorTagOpsDelegate vendor_tag_ops_delegate_; + base::flat_map<int, std::unique_ptr<VideoCaptureDeviceChromeOSDelegate>> + vcd_delegate_map_; + DISALLOW_COPY_AND_ASSIGN(CameraHalDelegate); };
diff --git a/media/capture/video/chromeos/request_manager.cc b/media/capture/video/chromeos/request_manager.cc index 7dedadf0..7f7f5b4 100644 --- a/media/capture/video/chromeos/request_manager.cc +++ b/media/capture/video/chromeos/request_manager.cc
@@ -42,8 +42,7 @@ std::unique_ptr<CameraBufferFactory> camera_buffer_factory, BlobifyCallback blobify_callback, scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner, - CameraAppDeviceImpl* camera_app_device, - ClientType client_type) + CameraAppDeviceImpl* camera_app_device) : callback_ops_(this, std::move(callback_ops_receiver)), capture_interface_(std::move(capture_interface)), device_context_(device_context), @@ -52,15 +51,13 @@ stream_buffer_manager_( new StreamBufferManager(device_context_, video_capture_use_gmb_, - std::move(camera_buffer_factory), - client_type)), + std::move(camera_buffer_factory))), blobify_callback_(std::move(blobify_callback)), ipc_task_runner_(std::move(ipc_task_runner)), capturing_(false), partial_result_count_(1), first_frame_shutter_time_(base::TimeTicks()), - camera_app_device_(std::move(camera_app_device)), - client_type_(client_type) { + camera_app_device_(std::move(camera_app_device)) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); DCHECK(callback_ops_.is_bound()); DCHECK(device_context_); @@ -80,7 +77,7 @@ RequestManager::~RequestManager() = default; void RequestManager::SetUpStreamsAndBuffers( - VideoCaptureFormat capture_format, + base::flat_map<ClientType, VideoCaptureParams> capture_params, const cros::mojom::CameraMetadataPtr& static_metadata, std::vector<cros::mojom::Camera3StreamPtr> streams) { // The partial result count metadata is optional; defaults to 1 in case it @@ -107,7 +104,7 @@ } stream_buffer_manager_->SetUpStreamsAndBuffers( - capture_format, static_metadata, std::move(streams)); + capture_params, static_metadata, std::move(streams)); } cros::mojom::Camera3StreamPtr RequestManager::GetStreamConfiguration( @@ -269,11 +266,13 @@ // 2. Capture (YuvOutput) // 3. Preview + Capture (YuvOutput) // 4. Reprocess (YuvInput + BlobOutput) + // 5. Preview + Recording (YuvOutput) // // For device without reprocess capability: // 1. Preview // 2. Capture (BlobOutput) // 3. Preview + Capture (BlobOutput) + // 4. Preview + Recording (YuvOutput) std::set<StreamType> stream_types; cros::mojom::CameraMetadataPtr settings; TakePhotoCallback callback = base::NullCallback(); @@ -283,6 +282,7 @@ bool is_reprocess_request = false; bool is_preview_request = false; bool is_oneshot_request = false; + bool is_recording_request = false; // First, check if there are pending reprocess tasks. is_reprocess_request = TryPrepareReprocessRequest( @@ -300,7 +300,12 @@ TryPrepareOneShotRequest(&stream_types, &settings, &callback); } - if (!is_reprocess_request && !is_oneshot_request && !is_preview_request) { + if (is_preview_request) { + is_recording_request = TryPrepareRecordingRequest(&stream_types); + } + + if (!is_reprocess_request && !is_oneshot_request && !is_preview_request && + !is_recording_request) { // We have to keep the pipeline full. if (preview_buffers_queued_ < pipeline_depth_) { ipc_task_runner_->PostTask( @@ -450,6 +455,17 @@ return true; } +bool RequestManager::TryPrepareRecordingRequest( + std::set<StreamType>* stream_types) { + if (!stream_buffer_manager_->IsRecordingSupported() || + !stream_buffer_manager_->HasFreeBuffers({StreamType::kRecordingOutput})) { + return false; + } + + stream_types->insert({StreamType::kRecordingOutput}); + return true; +} + void RequestManager::OnProcessedCaptureRequest(int32_t result) { DCHECK(ipc_task_runner_->BelongsToCurrentThread()); @@ -790,8 +806,10 @@ // Deliver the captured data to client. if (stream_buffer->status == cros::mojom::Camera3BufferStatus::CAMERA3_BUFFER_STATUS_OK) { - if (stream_type == StreamType::kPreviewOutput) { - SubmitCapturedPreviewBuffer(frame_number, buffer_ipc_id); + if (stream_type == StreamType::kPreviewOutput || + stream_type == StreamType::kRecordingOutput) { + SubmitCapturedPreviewRecordingBuffer(frame_number, buffer_ipc_id, + stream_type); } else if (stream_type == StreamType::kJpegOutput) { SubmitCapturedJpegBuffer(frame_number, buffer_ipc_id); } else if (stream_type == StreamType::kYUVOutput) { @@ -827,14 +845,17 @@ PrepareCaptureRequest(); } -void RequestManager::SubmitCapturedPreviewBuffer(uint32_t frame_number, - uint64_t buffer_ipc_id) { +void RequestManager::SubmitCapturedPreviewRecordingBuffer( + uint32_t frame_number, + uint64_t buffer_ipc_id, + StreamType stream_type) { const CaptureResult& pending_result = pending_results_[frame_number]; + auto client_type = kStreamClientTypeMap[static_cast<int>(stream_type)]; if (video_capture_use_gmb_) { VideoCaptureFormat format; base::Optional<VideoCaptureDevice::Client::Buffer> buffer = stream_buffer_manager_->AcquireBufferForClientById( - StreamType::kPreviewOutput, buffer_ipc_id, &format); + stream_type, buffer_ipc_id, &format); CHECK(buffer); // TODO: Figure out the right color space for the camera frame. We may need @@ -866,22 +887,21 @@ metadata.rotation = VideoRotation::VIDEO_ROTATION_0; } device_context_->SubmitCapturedVideoCaptureBuffer( - client_type_, std::move(*buffer), format, pending_result.reference_time, + client_type, std::move(*buffer), format, pending_result.reference_time, pending_result.timestamp, metadata); // |buffer| ownership is transferred to client, so we need to reserve a // new video buffer. - stream_buffer_manager_->ReserveBuffer(StreamType::kPreviewOutput); + stream_buffer_manager_->ReserveBuffer(stream_type); } else { gfx::GpuMemoryBuffer* gmb = stream_buffer_manager_->GetGpuMemoryBufferById( - StreamType::kPreviewOutput, buffer_ipc_id); + stream_type, buffer_ipc_id); CHECK(gmb); device_context_->SubmitCapturedGpuMemoryBuffer( - client_type_, gmb, - stream_buffer_manager_->GetStreamCaptureFormat( - StreamType::kPreviewOutput), + client_type, gmb, + stream_buffer_manager_->GetStreamCaptureFormat(stream_type), pending_result.reference_time, pending_result.timestamp); - stream_buffer_manager_->ReleaseBufferFromCaptureResult( - StreamType::kPreviewOutput, buffer_ipc_id); + stream_buffer_manager_->ReleaseBufferFromCaptureResult(stream_type, + buffer_ipc_id); } }
diff --git a/media/capture/video/chromeos/request_manager.h b/media/capture/video/chromeos/request_manager.h index f5d4fdad..3d9a6d0 100644 --- a/media/capture/video/chromeos/request_manager.h +++ b/media/capture/video/chromeos/request_manager.h
@@ -12,6 +12,7 @@ #include <set> #include <vector> +#include "base/containers/flat_map.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" #include "media/capture/mojom/image_capture.mojom.h" @@ -107,14 +108,13 @@ std::unique_ptr<CameraBufferFactory> camera_buffer_factory, BlobifyCallback blobify_callback, scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner, - CameraAppDeviceImpl* camera_app_device, - ClientType client_type); + CameraAppDeviceImpl* camera_app_device); ~RequestManager() override; // Sets up the stream context and allocate buffers according to the // configuration specified in |streams|. void SetUpStreamsAndBuffers( - VideoCaptureFormat capture_format, + base::flat_map<ClientType, VideoCaptureParams> capture_params, const cros::mojom::CameraMetadataPtr& static_metadata, std::vector<cros::mojom::Camera3StreamPtr> streams); @@ -227,6 +227,8 @@ cros::mojom::CameraMetadataPtr* settings, TakePhotoCallback* callback); + bool TryPrepareRecordingRequest(std::set<StreamType>* stream_types); + // Callback for ProcessCaptureRequest(). void OnProcessedCaptureRequest(int32_t result); @@ -257,8 +259,9 @@ void SubmitCaptureResult(uint32_t frame_number, StreamType stream_type, cros::mojom::Camera3StreamBufferPtr stream_buffer); - void SubmitCapturedPreviewBuffer(uint32_t frame_number, - uint64_t buffer_ipc_id); + void SubmitCapturedPreviewRecordingBuffer(uint32_t frame_number, + uint64_t buffer_ipc_id, + StreamType stream_type); void SubmitCapturedJpegBuffer(uint32_t frame_number, uint64_t buffer_ipc_id); // If there are some metadata set by SetCaptureMetadata() or @@ -364,8 +367,6 @@ CameraAppDeviceImpl* camera_app_device_; // Weak. - ClientType client_type_; - base::WeakPtrFactory<RequestManager> weak_ptr_factory_{this}; DISALLOW_IMPLICIT_CONSTRUCTORS(RequestManager);
diff --git a/media/capture/video/chromeos/request_manager_unittest.cc b/media/capture/video/chromeos/request_manager_unittest.cc index 6227b6f3..429769a 100644 --- a/media/capture/video/chromeos/request_manager_unittest.cc +++ b/media/capture/video/chromeos/request_manager_unittest.cc
@@ -87,6 +87,9 @@ void SetUp() override { quit_ = false; client_type_ = ClientType::kPreviewClient; + VideoCaptureParams params; + params.requested_format = kDefaultCaptureFormat; + capture_params_[client_type_] = params; device_context_ = std::make_unique<CameraDeviceContext>(); if (device_context_->AddClient( client_type_, @@ -100,7 +103,7 @@ [](const uint8_t* buffer, const uint32_t bytesused, const VideoCaptureFormat& capture_format, const int rotation) { return mojom::Blob::New(); }), - base::ThreadTaskRunnerHandle::Get(), nullptr, client_type_); + base::ThreadTaskRunnerHandle::Get(), nullptr); } } @@ -284,6 +287,7 @@ mojo::Remote<cros::mojom::Camera3CallbackOps> mock_callback_ops_; std::unique_ptr<CameraDeviceContext> device_context_; ClientType client_type_; + base::flat_map<ClientType, VideoCaptureParams> capture_params_; private: std::unique_ptr<base::RunLoop> run_loop_; @@ -300,8 +304,7 @@ .WillRepeatedly(Invoke(this, &RequestManagerTest::ProcessCaptureRequest)); request_manager_->SetUpStreamsAndBuffers( - kDefaultCaptureFormat, - GetFakeStaticMetadata(/* partial_result_count */ 1), + capture_params_, GetFakeStaticMetadata(/* partial_result_count */ 1), PrepareCaptureStream(/* max_buffers */ 1)); request_manager_->StartPreview(cros::mojom::CameraMetadata::New()); @@ -343,8 +346,7 @@ })); request_manager_->SetUpStreamsAndBuffers( - kDefaultCaptureFormat, - GetFakeStaticMetadata(/* partial_result_count */ 3), + capture_params_, GetFakeStaticMetadata(/* partial_result_count */ 3), PrepareCaptureStream(/* max_buffers */ 1)); request_manager_->StartPreview(cros::mojom::CameraMetadata::New()); @@ -375,8 +377,7 @@ })); request_manager_->SetUpStreamsAndBuffers( - kDefaultCaptureFormat, - GetFakeStaticMetadata(/* partial_result_count */ 1), + capture_params_, GetFakeStaticMetadata(/* partial_result_count */ 1), PrepareCaptureStream(/* max_buffers */ 1)); request_manager_->StartPreview(cros::mojom::CameraMetadata::New()); @@ -415,8 +416,7 @@ .WillRepeatedly(Invoke(this, &RequestManagerTest::ProcessCaptureRequest)); request_manager_->SetUpStreamsAndBuffers( - kDefaultCaptureFormat, - GetFakeStaticMetadata(/* partial_result_count */ 1), + capture_params_, GetFakeStaticMetadata(/* partial_result_count */ 1), PrepareCaptureStream(/* max_buffers */ 1)); request_manager_->StartPreview(cros::mojom::CameraMetadata::New()); @@ -456,8 +456,7 @@ .WillRepeatedly(Invoke(this, &RequestManagerTest::ProcessCaptureRequest)); request_manager_->SetUpStreamsAndBuffers( - kDefaultCaptureFormat, - GetFakeStaticMetadata(/* partial_result_count */ 2), + capture_params_, GetFakeStaticMetadata(/* partial_result_count */ 2), PrepareCaptureStream(/* max_buffers */ 1)); request_manager_->StartPreview(cros::mojom::CameraMetadata::New()); @@ -499,8 +498,7 @@ .WillRepeatedly(Invoke(this, &RequestManagerTest::ProcessCaptureRequest)); request_manager_->SetUpStreamsAndBuffers( - kDefaultCaptureFormat, - GetFakeStaticMetadata(/* partial_result_count */ 1), + capture_params_, GetFakeStaticMetadata(/* partial_result_count */ 1), PrepareCaptureStream(/* max_buffers */ 1)); request_manager_->StartPreview(cros::mojom::CameraMetadata::New());
diff --git a/media/capture/video/chromeos/stream_buffer_manager.cc b/media/capture/video/chromeos/stream_buffer_manager.cc index 611d054..471b1bb 100644 --- a/media/capture/video/chromeos/stream_buffer_manager.cc +++ b/media/capture/video/chromeos/stream_buffer_manager.cc
@@ -27,12 +27,10 @@ StreamBufferManager::StreamBufferManager( CameraDeviceContext* device_context, bool video_capture_use_gmb, - std::unique_ptr<CameraBufferFactory> camera_buffer_factory, - ClientType client_type) + std::unique_ptr<CameraBufferFactory> camera_buffer_factory) : device_context_(device_context), video_capture_use_gmb_(video_capture_use_gmb), - camera_buffer_factory_(std::move(camera_buffer_factory)), - client_type_(client_type) { + camera_buffer_factory_(std::move(camera_buffer_factory)) { if (video_capture_use_gmb_) { gmb_support_ = std::make_unique<gpu::GpuMemoryBufferSupport>(); } @@ -155,8 +153,9 @@ } else { // We have to reserve a new buffer because the size is different. Buffer rotated_buffer; + auto client_type = kStreamClientTypeMap[static_cast<int>(stream_type)]; if (!device_context_->ReserveVideoCaptureBufferFromPool( - client_type_, format->frame_size, format->pixel_format, + client_type, format->frame_size, format->pixel_format, &rotated_buffer)) { DLOG(WARNING) << "Failed to reserve video capture buffer"; original_gmb->Unmap(); @@ -221,7 +220,7 @@ } void StreamBufferManager::SetUpStreamsAndBuffers( - VideoCaptureFormat capture_format, + base::flat_map<ClientType, VideoCaptureParams> capture_params, const cros::mojom::CameraMetadataPtr& static_metadata, std::vector<cros::mojom::Camera3StreamPtr> streams) { DestroyCurrentStreamsAndBuffers(); @@ -249,11 +248,14 @@ // flags of the stream. StreamType stream_type = StreamIdToStreamType(stream->id); auto stream_context = std::make_unique<StreamContext>(); - stream_context->capture_format = capture_format; + auto client_type = kStreamClientTypeMap[static_cast<int>(stream_type)]; + stream_context->capture_format = + capture_params[client_type].requested_format; stream_context->stream = std::move(stream); switch (stream_type) { case StreamType::kPreviewOutput: + case StreamType::kRecordingOutput: stream_context->buffer_dimension = gfx::Size( stream_context->stream->width, stream_context->stream->height); stream_context->buffer_usage = @@ -378,6 +380,11 @@ return stream_context_.find(StreamType::kYUVOutput) != stream_context_.end(); } +bool StreamBufferManager::IsRecordingSupported() { + return stream_context_.find(StreamType::kRecordingOutput) != + stream_context_.end(); +} + // static uint64_t StreamBufferManager::GetBufferIpcId(StreamType stream_type, int key) { uint64_t id = 0; @@ -441,8 +448,9 @@ return; } Buffer vcd_buffer; + auto client_type = kStreamClientTypeMap[static_cast<int>(stream_type)]; if (!device_context_->ReserveVideoCaptureBufferFromPool( - client_type_, stream_context->buffer_dimension, + client_type, stream_context->buffer_dimension, stream_context->capture_format.pixel_format, &vcd_buffer)) { DLOG(WARNING) << "Failed to reserve video capture buffer"; return;
diff --git a/media/capture/video/chromeos/stream_buffer_manager.h b/media/capture/video/chromeos/stream_buffer_manager.h index 50ed6a3..ba62fbe 100644 --- a/media/capture/video/chromeos/stream_buffer_manager.h +++ b/media/capture/video/chromeos/stream_buffer_manager.h
@@ -14,6 +14,7 @@ #include <unordered_map> #include <vector> +#include "base/containers/flat_map.h" #include "base/containers/queue.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" @@ -51,8 +52,7 @@ StreamBufferManager( CameraDeviceContext* device_context, bool video_capture_use_gmb, - std::unique_ptr<CameraBufferFactory> camera_buffer_factory, - ClientType client_type); + std::unique_ptr<CameraBufferFactory> camera_buffer_factory); ~StreamBufferManager(); void ReserveBuffer(StreamType stream_type); @@ -84,7 +84,7 @@ // Sets up the stream context and allocate buffers according to the // configuration specified in |stream|. void SetUpStreamsAndBuffers( - VideoCaptureFormat capture_format, + base::flat_map<ClientType, VideoCaptureParams> capture_params, const cros::mojom::CameraMetadataPtr& static_metadata, std::vector<cros::mojom::Camera3StreamPtr> streams); @@ -105,6 +105,8 @@ bool IsReprocessSupported(); + bool IsRecordingSupported(); + private: friend class RequestManagerTest; @@ -164,8 +166,6 @@ std::unique_ptr<CameraBufferFactory> camera_buffer_factory_; - ClientType client_type_; - base::WeakPtrFactory<StreamBufferManager> weak_ptr_factory_{this}; DISALLOW_IMPLICIT_CONSTRUCTORS(StreamBufferManager);
diff --git a/media/capture/video/chromeos/vendor_tag_ops_delegate.cc b/media/capture/video/chromeos/vendor_tag_ops_delegate.cc index 2ce163e..013b267 100644 --- a/media/capture/video/chromeos/vendor_tag_ops_delegate.cc +++ b/media/capture/video/chromeos/vendor_tag_ops_delegate.cc
@@ -13,7 +13,7 @@ VendorTagOpsDelegate::VendorTagOpsDelegate( scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner) - : ipc_task_runner_(ipc_task_runner) {} + : ipc_task_runner_(ipc_task_runner), is_initializing_(false) {} VendorTagOpsDelegate::~VendorTagOpsDelegate() = default; @@ -28,17 +28,29 @@ void VendorTagOpsDelegate::Initialize() { DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence()); + + base::AutoLock lock(lock_); + is_initializing_ = true; vendor_tag_ops_->GetTagCount(base::BindOnce( &VendorTagOpsDelegate::OnGotTagCount, base::Unretained(this))); } void VendorTagOpsDelegate::Reset() { DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence()); + + base::AutoLock lock(lock_); vendor_tag_ops_.reset(); pending_info_.clear(); name_map_.clear(); tag_map_.clear(); initialized_.Reset(); + is_initializing_ = false; +} + +void VendorTagOpsDelegate::StopInitialization() { + base::AutoLock lock(lock_); + initialized_.Signal(); + is_initializing_ = false; } void VendorTagOpsDelegate::RemovePending(uint32_t tag) { @@ -47,7 +59,7 @@ DCHECK_EQ(removed, 1u); if (pending_info_.empty()) { DVLOG(1) << "VendorTagOpsDelegate initialized"; - initialized_.Signal(); + StopInitialization(); } } @@ -55,13 +67,13 @@ DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence()); if (tag_count == -1) { LOG(ERROR) << "Failed to get tag count"; - initialized_.Signal(); + StopInitialization(); return; } if (tag_count == 0) { // There is no vendor tag, we are done here. - initialized_.Signal(); + StopInitialization(); return; } @@ -134,6 +146,13 @@ const VendorTagInfo* VendorTagOpsDelegate::GetInfoByName( const std::string& full_name) { + { + base::AutoLock lock(lock_); + if (!is_initializing_ && !initialized_.IsSignaled()) { + LOG(WARNING) << "VendorTagOps is accessed before calling Initialize()"; + return nullptr; + } + } initialized_.Wait(); auto it = name_map_.find(full_name); if (it == name_map_.end()) { @@ -144,6 +163,13 @@ const VendorTagInfo* VendorTagOpsDelegate::GetInfoByTag( cros::mojom::CameraMetadataTag tag) { + { + base::AutoLock lock(lock_); + if (!is_initializing_ && !initialized_.IsSignaled()) { + LOG(WARNING) << "VendorTagOps is accessed before calling Initialize()"; + return nullptr; + } + } initialized_.Wait(); auto it = tag_map_.find(tag); if (it == tag_map_.end()) {
diff --git a/media/capture/video/chromeos/vendor_tag_ops_delegate.h b/media/capture/video/chromeos/vendor_tag_ops_delegate.h index 206394f..cd963e0 100644 --- a/media/capture/video/chromeos/vendor_tag_ops_delegate.h +++ b/media/capture/video/chromeos/vendor_tag_ops_delegate.h
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/synchronization/lock.h" #include "media/capture/video/chromeos/mojom/camera_common.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -41,6 +42,7 @@ const VendorTagInfo* GetInfoByTag(cros::mojom::CameraMetadataTag tag); private: + void StopInitialization(); void RemovePending(uint32_t tag); void OnGotTagCount(int32_t tag_count); @@ -63,6 +65,9 @@ std::map<cros::mojom::CameraMetadataTag, VendorTagInfo> tag_map_; base::WaitableEvent initialized_; + + base::Lock lock_; + bool is_initializing_ GUARDED_BY(lock_); }; } // namespace media
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc index b8b8a3b..9d5ef8da 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc +++ b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.cc
@@ -123,60 +123,76 @@ camera_app_device_(camera_app_device), cleanup_callback_(std::move(cleanup_callback)), power_manager_client_proxy_( - base::MakeRefCounted<PowerManagerClientProxy>()), - client_type_(ClientType::kPreviewClient) { + base::MakeRefCounted<PowerManagerClientProxy>()) { power_manager_client_proxy_->Init(weak_ptr_factory_.GetWeakPtr(), capture_task_runner_, std::move(ui_task_runner)); } -VideoCaptureDeviceChromeOSDelegate::~VideoCaptureDeviceChromeOSDelegate() { +VideoCaptureDeviceChromeOSDelegate::~VideoCaptureDeviceChromeOSDelegate() {} + +void VideoCaptureDeviceChromeOSDelegate::Shutdown() { DCHECK(capture_task_runner_->BelongsToCurrentThread()); - DCHECK(!camera_device_ipc_thread_.IsRunning()); - screen_observer_delegate_->RemoveObserver(); - power_manager_client_proxy_->Shutdown(); - std::move(cleanup_callback_).Run(); + if (!HasDeviceClient()) { + DCHECK(!camera_device_ipc_thread_.IsRunning()); + screen_observer_delegate_->RemoveObserver(); + power_manager_client_proxy_->Shutdown(); + std::move(cleanup_callback_).Run(); + } } -// VideoCaptureDevice implementation. +bool VideoCaptureDeviceChromeOSDelegate::HasDeviceClient() { + return device_context_ && device_context_->HasClient(); +} + void VideoCaptureDeviceChromeOSDelegate::AllocateAndStart( const VideoCaptureParams& params, - std::unique_ptr<Client> client) { + std::unique_ptr<VideoCaptureDevice::Client> client, + ClientType client_type) { DCHECK(capture_task_runner_->BelongsToCurrentThread()); DCHECK(!camera_device_delegate_); - TRACE_EVENT0("camera", "Start Device"); - if (!camera_device_ipc_thread_.Start()) { - std::string error_msg = "Failed to start device thread"; - LOG(ERROR) << error_msg; - client->OnError( - media::VideoCaptureError::kCrosHalV3FailedToStartDeviceThread, - FROM_HERE, error_msg); - return; - } - capture_params_ = params; - device_context_ = std::make_unique<CameraDeviceContext>(); - if (device_context_->AddClient(client_type_, std::move(client))) { - camera_device_delegate_ = std::make_unique<CameraDeviceDelegate>( - device_descriptor_, camera_hal_delegate_, - camera_device_ipc_thread_.task_runner(), camera_app_device_, - client_type_); - OpenDevice(); + if (!HasDeviceClient()) { + TRACE_EVENT0("camera", "Start Device"); + if (!camera_device_ipc_thread_.Start()) { + std::string error_msg = "Failed to start device thread"; + LOG(ERROR) << error_msg; + client->OnError( + media::VideoCaptureError::kCrosHalV3FailedToStartDeviceThread, + FROM_HERE, error_msg); + return; + } + + device_context_ = std::make_unique<CameraDeviceContext>(); + if (device_context_->AddClient(client_type, std::move(client))) { + capture_params_[client_type] = params; + camera_device_delegate_ = std::make_unique<CameraDeviceDelegate>( + device_descriptor_, camera_hal_delegate_, + camera_device_ipc_thread_.task_runner(), camera_app_device_); + OpenDevice(); + } + } else { + if (device_context_->AddClient(client_type, std::move(client))) { + capture_params_[client_type] = params; + ReconfigureStreams(); + } } } -void VideoCaptureDeviceChromeOSDelegate::StopAndDeAllocate() { +void VideoCaptureDeviceChromeOSDelegate::StopAndDeAllocate( + ClientType client_type) { DCHECK(capture_task_runner_->BelongsToCurrentThread()); - if (!camera_device_delegate_) { - return; + DCHECK(!camera_device_delegate_); + device_context_->RemoveClient(client_type); + if (!HasDeviceClient()) { + CloseDevice(base::UnguessableToken()); + camera_device_ipc_thread_.Stop(); + camera_device_delegate_.reset(); + device_context_.reset(); } - CloseDevice(base::UnguessableToken()); - camera_device_ipc_thread_.Stop(); - camera_device_delegate_.reset(); - device_context_->RemoveClient(client_type_); - device_context_.reset(); } -void VideoCaptureDeviceChromeOSDelegate::TakePhoto(TakePhotoCallback callback) { +void VideoCaptureDeviceChromeOSDelegate::TakePhoto( + VideoCaptureDevice::TakePhotoCallback callback) { DCHECK(capture_task_runner_->BelongsToCurrentThread()); DCHECK(camera_device_delegate_); camera_device_ipc_thread_.task_runner()->PostTask( @@ -186,7 +202,7 @@ } void VideoCaptureDeviceChromeOSDelegate::GetPhotoState( - GetPhotoStateCallback callback) { + VideoCaptureDevice::GetPhotoStateCallback callback) { DCHECK(capture_task_runner_->BelongsToCurrentThread()); camera_device_ipc_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&CameraDeviceDelegate::GetPhotoState, @@ -196,7 +212,7 @@ void VideoCaptureDeviceChromeOSDelegate::SetPhotoOptions( mojom::PhotoSettingsPtr settings, - SetPhotoOptionsCallback callback) { + VideoCaptureDevice::SetPhotoOptionsCallback callback) { DCHECK(capture_task_runner_->BelongsToCurrentThread()); camera_device_ipc_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&CameraDeviceDelegate::SetPhotoOptions, @@ -224,6 +240,20 @@ camera_device_delegate_->GetWeakPtr(), rotation_)); } +void VideoCaptureDeviceChromeOSDelegate::ReconfigureStreams() { + DCHECK(capture_task_runner_->BelongsToCurrentThread()); + DCHECK(camera_device_delegate_); + + camera_device_ipc_thread_.task_runner()->PostTask( + FROM_HERE, + base::BindOnce(&CameraDeviceDelegate::ReconfigureStreams, + camera_device_delegate_->GetWeakPtr(), capture_params_)); + camera_device_ipc_thread_.task_runner()->PostTask( + FROM_HERE, + base::BindOnce(&CameraDeviceDelegate::SetRotation, + camera_device_delegate_->GetWeakPtr(), rotation_)); +} + void VideoCaptureDeviceChromeOSDelegate::CloseDevice( base::UnguessableToken unblock_suspend_token) { DCHECK(capture_task_runner_->BelongsToCurrentThread());
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h index 2b82e40..80aaac3d 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h +++ b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h
@@ -7,9 +7,11 @@ #include <memory> +#include "base/containers/flat_map.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" +#include "base/synchronization/lock.h" #include "base/threading/thread.h" #include "media/capture/video/chromeos/camera_device_context.h" #include "media/capture/video/chromeos/display_rotation_observer.h" @@ -29,10 +31,9 @@ class CameraHalDelegate; class CameraDeviceDelegate; -// Implementation of VideoCaptureDevice for ChromeOS with CrOS camera HALv3. +// Implementation of delegate for ChromeOS with CrOS camera HALv3. class CAPTURE_EXPORT VideoCaptureDeviceChromeOSDelegate final - : public VideoCaptureDevice, - public DisplayRotationObserver { + : public DisplayRotationObserver { public: VideoCaptureDeviceChromeOSDelegate( scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, @@ -41,22 +42,25 @@ CameraAppDeviceImpl* camera_app_device, base::OnceClosure cleanup_callback); - ~VideoCaptureDeviceChromeOSDelegate() final; + ~VideoCaptureDeviceChromeOSDelegate(); + void Shutdown(); + bool HasDeviceClient(); - // VideoCaptureDevice implementation. void AllocateAndStart(const VideoCaptureParams& params, - std::unique_ptr<Client> client) final; - void StopAndDeAllocate() final; - void TakePhoto(TakePhotoCallback callback) final; - void GetPhotoState(GetPhotoStateCallback callback) final; + std::unique_ptr<VideoCaptureDevice::Client> client, + ClientType client_type); + void StopAndDeAllocate(ClientType client_type); + void TakePhoto(VideoCaptureDevice::TakePhotoCallback callback); + void GetPhotoState(VideoCaptureDevice::GetPhotoStateCallback callback); void SetPhotoOptions(mojom::PhotoSettingsPtr settings, - SetPhotoOptionsCallback callback) final; + VideoCaptureDevice::SetPhotoOptionsCallback callback); private: // Helper to interact with PowerManagerClient on DBus original thread. class PowerManagerClientProxy; void OpenDevice(); + void ReconfigureStreams(); void CloseDevice(base::UnguessableToken unblock_suspend_token); // DisplayRotationDelegate implementation. @@ -79,7 +83,9 @@ // |capture_task_runner_|. base::Thread camera_device_ipc_thread_; - VideoCaptureParams capture_params_; + // Map client type to VideoCaptureParams. + base::flat_map<ClientType, VideoCaptureParams> capture_params_; + // |device_context_| is created and owned by // VideoCaptureDeviceChromeOSDelegate and is only accessed by // |camera_device_delegate_|. @@ -103,9 +109,6 @@ scoped_refptr<PowerManagerClientProxy> power_manager_client_proxy_; - // The client type in CameraDeviceContext. - ClientType client_type_; - base::WeakPtrFactory<VideoCaptureDeviceChromeOSDelegate> weak_ptr_factory_{ this};
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc index 34a6eaef..7e24d63a4 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc +++ b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.cc
@@ -9,21 +9,22 @@ namespace media { VideoCaptureDeviceChromeOSHalv3::VideoCaptureDeviceChromeOSHalv3( - std::unique_ptr<VideoCaptureDeviceChromeOSDelegate> delegate) - : vcd_delegate_(std::move(delegate)) {} + VideoCaptureDeviceChromeOSDelegate* delegate) + : vcd_delegate_(delegate), client_type_(ClientType::kPreviewClient) {} VideoCaptureDeviceChromeOSHalv3::~VideoCaptureDeviceChromeOSHalv3() { + vcd_delegate_->Shutdown(); } // VideoCaptureDevice implementation. void VideoCaptureDeviceChromeOSHalv3::AllocateAndStart( const VideoCaptureParams& params, std::unique_ptr<Client> client) { - vcd_delegate_->AllocateAndStart(params, std::move(client)); + vcd_delegate_->AllocateAndStart(params, std::move(client), client_type_); } void VideoCaptureDeviceChromeOSHalv3::StopAndDeAllocate() { - vcd_delegate_->StopAndDeAllocate(); + vcd_delegate_->StopAndDeAllocate(client_type_); } void VideoCaptureDeviceChromeOSHalv3::TakePhoto(TakePhotoCallback callback) {
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h index b20f76f2..fde6525 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h +++ b/media/capture/video/chromeos/video_capture_device_chromeos_halv3.h
@@ -7,7 +7,9 @@ #include <memory> +#include "media/capture/video/chromeos/camera_device_context.h" #include "media/capture/video/video_capture_device.h" +#include "media/capture/video/video_capture_device_descriptor.h" namespace media { @@ -18,7 +20,7 @@ : public VideoCaptureDevice { public: explicit VideoCaptureDeviceChromeOSHalv3( - std::unique_ptr<VideoCaptureDeviceChromeOSDelegate> delegate); + VideoCaptureDeviceChromeOSDelegate* delegate); ~VideoCaptureDeviceChromeOSHalv3() final; @@ -32,7 +34,9 @@ SetPhotoOptionsCallback callback) final; private: - std::unique_ptr<VideoCaptureDeviceChromeOSDelegate> vcd_delegate_; + VideoCaptureDeviceChromeOSDelegate* vcd_delegate_; + + ClientType client_type_; DISALLOW_IMPLICIT_CONSTRUCTORS(VideoCaptureDeviceChromeOSHalv3); };
diff --git a/media/cast/README.md b/media/cast/README.md new file mode 100644 index 0000000..5d28612 --- /dev/null +++ b/media/cast/README.md
@@ -0,0 +1,28 @@ +# media/cast/ + +This directory contains a collection of components related to streaming using +the Cast Streaming Protocol (over UDP network sockets). They encode/decode raw +audio or video frames, and send/receive encoded data reliably over a local area +network. + +NOTE: This implementation is **deprecated**, and to be replaced soon by the one +found in `../../third_party/openscreen/src/cast/streaming/`. Contact +jophba@chromium.org for details. + +# Directory Breakdown + +* common/ - Collection of shared utility code and constants. + +* logging/ - Packet/Frame logging, for study/experimentation of the protocol at + runtime. + +* net/ - Wire-level packetization and pacing. + +* receiver/ - A minimal receiver implementation, used only for end-to-end + testing. + +* sender/ - Encoder front-ends and frame-level sender implementation for + audio/video. + +* test/ - A collection of end-to-end tests, experiments, benchmarks, and related + utility code.
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc index eea169c..ac043a7 100644 --- a/media/gpu/windows/d3d11_video_decoder.cc +++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -554,7 +554,7 @@ current_buffer_ = nullptr; if (!accelerated_video_decoder_->Flush()) { // This will also signal error |current_decode_cb_|. - NotifyError("Flush failed"); + NotifyError(StatusCode::kAcceleratorFlushFailed); return; } // Pictures out output synchronously during Flush. Signal the decode @@ -651,11 +651,12 @@ picture_buffers_.clear(); } else if (result == media::AcceleratedVideoDecoder::kTryAgain) { LOG(ERROR) << "Try again is not supported"; - NotifyError("Try again is not supported"); + NotifyError(StatusCode::kTryAgainNotSupported); return; } else { - LOG(ERROR) << "VDA Error " << result; - NotifyError("Accelerated decode failed"); + std::ostringstream message; + message << "VDA Error " << result; + NotifyError(Status(StatusCode::kDecoderFailedDecode, message.str())); return; } } @@ -898,13 +899,15 @@ TRACE_EVENT0("gpu", "D3D11VideoDecoder::NotifyError"); state_ = State::kError; - // TODO(tmathmeyer) - Remove this after plumbing Status through the - // decode_cb and input_buffer_queue cb's. - MEDIA_LOG(ERROR, media_log_) - << "D3D11VideoDecoder error: " << std::hex << reason.code(); - - if (init_cb_) + if (init_cb_) { std::move(init_cb_).Run(reason); + } else { + // TODO(tmathmeyer) - Remove this after plumbing Status through the + // decode_cb and input_buffer_queue cb's. + // Let the init handler set the error string if this is an init failure. + MEDIA_LOG(ERROR, media_log_) << "D3D11VideoDecoder error: 0x" << std::hex + << reason.code() << reason.message(); + } current_buffer_ = nullptr; if (current_decode_cb_)
diff --git a/media/media_options.gni b/media/media_options.gni index a37ae0c..bd85ac8 100644 --- a/media/media_options.gni +++ b/media/media_options.gni
@@ -97,7 +97,7 @@ # Enable logging override, e.g. enable DVLOGs at build time. enable_logging_override = is_chromecast - enable_dav1d_decoder = !is_android && !is_ios + enable_dav1d_decoder = !is_ios # Enable browser managed persistent metadata storage for EME persistent # session and persistent usage record session.
diff --git a/net/android/network_library.cc b/net/android/network_library.cc index 2d9d6d9..c7d06c3f2 100644 --- a/net/android/network_library.cc +++ b/net/android/network_library.cc
@@ -130,16 +130,15 @@ return signal_strength; } -internal::ConfigParsePosixResult GetDnsServers( - std::vector<IPEndPoint>* dns_servers, - bool* dns_over_tls_active, - std::string* dns_over_tls_hostname) { +bool GetDnsServers(std::vector<IPEndPoint>* dns_servers, + bool* dns_over_tls_active, + std::string* dns_over_tls_hostname) { JNIEnv* env = AttachCurrentThread(); // Get the DNS status for the active network. ScopedJavaLocalRef<jobject> result = Java_AndroidNetworkLibrary_getDnsStatus(env, nullptr /* network */); if (result.is_null()) - return internal::CONFIG_PARSE_POSIX_NO_NAMESERVERS; + return false; // Parse the DNS servers. std::vector<std::vector<uint8_t>> dns_servers_data; @@ -155,8 +154,7 @@ *dns_over_tls_hostname = base::android::ConvertJavaStringToUTF8( Java_DnsStatus_getPrivateDnsServerName(env, result)); - return dns_servers->size() ? internal::CONFIG_PARSE_POSIX_OK - : internal::CONFIG_PARSE_POSIX_NO_NAMESERVERS; + return !dns_servers->empty(); } bool ReportBadDefaultNetwork() {
diff --git a/net/android/network_library.h b/net/android/network_library.h index e861700..d5410cc 100644 --- a/net/android/network_library.h +++ b/net/android/network_library.h
@@ -18,7 +18,6 @@ #include "net/base/ip_endpoint.h" #include "net/base/mime_util.h" #include "net/base/net_export.h" -#include "net/dns/dns_config_service_posix.h" #include "net/socket/socket_descriptor.h" namespace net { @@ -92,12 +91,10 @@ // settings. |dns_over_tls_hostname| will only be non-empty if // |dns_over_tls_active| is true. // Only callable on Marshmallow and newer releases. -// Returns CONFIG_PARSE_POSIX_OK upon success, -// CONFIG_PARSE_POSIX_NO_NAMESERVERS if no DNS servers found. -NET_EXPORT_PRIVATE internal::ConfigParsePosixResult GetDnsServers( - std::vector<IPEndPoint>* dns_servers, - bool* dns_over_tls_active, - std::string* dns_over_tls_hostname); +// Returns false when a valid server config could not be read. +NET_EXPORT_PRIVATE bool GetDnsServers(std::vector<IPEndPoint>* dns_servers, + bool* dns_over_tls_active, + std::string* dns_over_tls_hostname); // Reports to the framework that the current default network appears to have // connectivity issues. This may serve as a signal for the OS to consider
diff --git a/net/base/port_util.cc b/net/base/port_util.cc index 12bfd9a..bf5a0a7 100644 --- a/net/base/port_util.cc +++ b/net/base/port_util.cc
@@ -73,7 +73,6 @@ 532, // netnews 540, // uucp 548, // AFP (Apple Filing Protocol) - 554, // rtsp 556, // remotefs 563, // nntp+ssl 587, // smtp (rfc6409)
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index 729883ce..a08893c6 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -428,14 +428,11 @@ if (parsed_cookie.IsSameParty()) base::UmaHistogramBoolean("Cookie.IsSamePartyValid", is_same_party_valid); - // TODO(chlily): Log metrics. if (!status->IsInclude()) return nullptr; CookieSameSiteString samesite_string = CookieSameSiteString::kUnspecified; CookieSameSite samesite = parsed_cookie.SameSite(&samesite_string); - RecordCookieSameSiteAttributeValueHistogram(samesite_string, - parsed_cookie.IsSameParty()); CookieSourceScheme source_scheme = url.SchemeIsCryptographic() ? CookieSourceScheme::kSecure @@ -449,9 +446,16 @@ parsed_cookie.IsHttpOnly(), samesite, parsed_cookie.Priority(), parsed_cookie.IsSameParty(), source_scheme, source_port)); - DCHECK(cc->IsCanonical()); - // TODO(chlily): Log metrics. + if (!cc->IsCanonical()) { + status->AddExclusionReason( + net::CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE); + return nullptr; + } + + RecordCookieSameSiteAttributeValueHistogram(samesite_string, + parsed_cookie.IsSameParty()); + return cc; } @@ -772,6 +776,7 @@ CookieInclusionStatus::EXCLUDE_SAMEPARTY_CROSS_PARTY_CONTEXT); FALLTHROUGH; case CookieSamePartyStatus::kEnforceSamePartyInclude: { + status.AddWarningReason(CookieInclusionStatus::WARN_TREATED_AS_SAMEPARTY); // Remove any SameSite exclusion reasons, since SameParty overrides // SameSite. DCHECK(!status.HasExclusionReason( @@ -789,10 +794,23 @@ CookieInclusionStatus::EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX, }); } + + // Update metrics. + if (status.HasOnlyExclusionReason( + CookieInclusionStatus::EXCLUDE_SAMEPARTY_CROSS_PARTY_CONTEXT) && + included_by_samesite) { + status.AddWarningReason( + CookieInclusionStatus::WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE); + } if (status.IsInclude()) { UMA_HISTOGRAM_BOOLEAN( "Cookie.SamePartyReadIncluded.InclusionUnderSameSite", included_by_samesite); + if (!included_by_samesite) { + status.AddWarningReason( + CookieInclusionStatus:: + WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE); + } } break; } @@ -947,6 +965,8 @@ FALLTHROUGH; case CookieSamePartyStatus::kEnforceSamePartyInclude: { DCHECK(IsSameParty()); + access_result.status.AddWarningReason( + CookieInclusionStatus::WARN_TREATED_AS_SAMEPARTY); // Remove any SameSite exclusion reasons, since SameParty overrides // SameSite. DCHECK(!access_result.status.HasExclusionReason( @@ -965,10 +985,23 @@ CookieInclusionStatus::EXCLUDE_SAMESITE_UNSPECIFIED_TREATED_AS_LAX, }); } + + // Update metrics. + if (access_result.status.HasOnlyExclusionReason( + CookieInclusionStatus::EXCLUDE_SAMEPARTY_CROSS_PARTY_CONTEXT) && + included_by_samesite) { + access_result.status.AddWarningReason( + CookieInclusionStatus::WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE); + } if (access_result.status.IsInclude()) { UMA_HISTOGRAM_BOOLEAN( "Cookie.SamePartySetIncluded.InclusionUnderSameSite", included_by_samesite); + if (!included_by_samesite) { + access_result.status.AddWarningReason( + CookieInclusionStatus:: + WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE); + } } break; }
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h index 0c25758da..38808e4 100644 --- a/net/cookies/canonical_cookie.h +++ b/net/cookies/canonical_cookie.h
@@ -60,27 +60,6 @@ CanonicalCookie(); CanonicalCookie(const CanonicalCookie& other); - // This constructor does not validate or canonicalize their inputs; - // the resulting CanonicalCookies should not be relied on to be canonical - // unless the caller has done appropriate validation and canonicalization - // themselves. - // NOTE: Prefer using CreateSanitizedCookie() over directly using this - // constructor. - CanonicalCookie(const std::string& name, - const std::string& value, - const std::string& domain, - const std::string& path, - const base::Time& creation, - const base::Time& expiration, - const base::Time& last_access, - bool secure, - bool httponly, - CookieSameSite same_site, - CookiePriority priority, - bool same_party, - CookieSourceScheme scheme_secure = CookieSourceScheme::kUnset, - int source_port = url::PORT_UNSPECIFIED); - ~CanonicalCookie(); // Supports the default copy constructor. @@ -371,6 +350,27 @@ private: FRIEND_TEST_ALL_PREFIXES(CanonicalCookieTest, TestPrefixHistograms); + // This constructor does not validate or canonicalize their inputs; + // the resulting CanonicalCookies should not be relied on to be canonical + // unless the caller has done appropriate validation and canonicalization + // themselves. + // NOTE: Prefer using CreateSanitizedCookie() over directly using this + // constructor. + CanonicalCookie(const std::string& name, + const std::string& value, + const std::string& domain, + const std::string& path, + const base::Time& creation, + const base::Time& expiration, + const base::Time& last_access, + bool secure, + bool httponly, + CookieSameSite same_site, + CookiePriority priority, + bool same_party, + CookieSourceScheme scheme_secure = CookieSourceScheme::kUnset, + int source_port = url::PORT_UNSPECIFIED); + // The special cookie prefixes as defined in // https://tools.ietf.org/html/draft-west-cookie-prefixes //
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc index dbdf396..921eb226 100644 --- a/net/cookies/canonical_cookie_unittest.cc +++ b/net/cookies/canonical_cookie_unittest.cc
@@ -194,6 +194,21 @@ cookie = CanonicalCookie::Create(GURL("http://fool/;/"), "*", creation_time, server_time); EXPECT_TRUE(cookie.get()); + + // Control characters in name or value. + CookieInclusionStatus status; + cookie = + CanonicalCookie::Create(GURL("http://www.example.com/test/foo.html"), + "\b=foo", creation_time, server_time, &status); + EXPECT_FALSE(cookie.get()); + EXPECT_TRUE(status.HasExclusionReason( + CookieInclusionStatus::ExclusionReason::EXCLUDE_FAILURE_TO_STORE)); + cookie = + CanonicalCookie::Create(GURL("http://www.example.com/test/foo.html"), + "bar=\b", creation_time, server_time, &status); + EXPECT_FALSE(cookie.get()); + EXPECT_TRUE(status.HasExclusionReason( + CookieInclusionStatus::ExclusionReason::EXCLUDE_FAILURE_TO_STORE)); } TEST(CanonicalCookieTest, Create) { @@ -3557,7 +3572,8 @@ kCookieableSchemes), MatchesCookieAccessResult( CookieInclusionStatus::MakeFromReasonsForTesting( - {CookieInclusionStatus::EXCLUDE_SAMEPARTY_CROSS_PARTY_CONTEXT}), + {CookieInclusionStatus::EXCLUDE_SAMEPARTY_CROSS_PARTY_CONTEXT}, + {CookieInclusionStatus::WARN_TREATED_AS_SAMEPARTY}), _, _, true)); }
diff --git a/net/cookies/cookie_inclusion_status.cc b/net/cookies/cookie_inclusion_status.cc index 3eb96fc5..8eb4f75 100644 --- a/net/cookies/cookie_inclusion_status.cc +++ b/net/cookies/cookie_inclusion_status.cc
@@ -263,6 +263,10 @@ base::StrAppend(&out, {"WARN_LAX_CROSS_DOWNGRADE_LAX_SAMESITE, "}); if (HasWarningReason(WARN_SECURE_ACCESS_GRANTED_NON_CRYPTOGRAPHIC)) base::StrAppend(&out, {"WARN_SECURE_ACCESS_GRANTED_NON_CRYPTOGRAPHIC, "}); + if (HasWarningReason(WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE)) + base::StrAppend(&out, {"WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE, "}); + if (HasWarningReason(WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE)) + base::StrAppend(&out, {"WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE, "}); // Strip trailing comma and space. out.erase(out.end() - 2, out.end());
diff --git a/net/cookies/cookie_inclusion_status.h b/net/cookies/cookie_inclusion_status.h index 5836029..d46d01f 100644 --- a/net/cookies/cookie_inclusion_status.h +++ b/net/cookies/cookie_inclusion_status.h
@@ -151,6 +151,24 @@ // TODO(chlily): Add metrics for how often and where this occurs. WARN_SECURE_ACCESS_GRANTED_NON_CRYPTOGRAPHIC = 8, + // The cookie was treated as SameParty. This is different from looking at + // whether the cookie has the SameParty attribute, since we may choose to + // ignore that attribute for one reason or another. E.g., we ignore the + // SameParty attribute if the site is not a member of a nontrivial + // First-Party Set. + WARN_TREATED_AS_SAMEPARTY = 9, + + // The cookie was excluded solely for SameParty reasons (i.e. it was in + // cross-party context), but would have been included by SameSite. (This can + // only occur in cross-party, cross-site contexts, for cookies that are + // 'SameParty; SameSite=None'.) + WARN_SAMEPARTY_EXCLUSION_OVERRULED_SAMESITE = 10, + + // The cookie was included due to SameParty, even though it would have been + // excluded by SameSite. (This can only occur in same-party, cross-site + // contexts, for cookies that are 'SameParty; SameSite=Lax'.) + WARN_SAMEPARTY_INCLUSION_OVERRULED_SAMESITE = 11, + // This should be kept last. NUM_WARNING_REASONS };
diff --git a/net/dns/dns_config_service.cc b/net/dns/dns_config_service.cc index a0f1fccb..d475626 100644 --- a/net/dns/dns_config_service.cc +++ b/net/dns/dns_config_service.cc
@@ -7,7 +7,6 @@ #include <string> #include "base/check_op.h" -#include "base/metrics/histogram_macros.h" #include "base/notreached.h" namespace net { @@ -53,12 +52,6 @@ void DnsConfigService::InvalidateConfig() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::TimeTicks now = base::TimeTicks::Now(); - if (!last_invalidate_config_time_.is_null()) { - UMA_HISTOGRAM_LONG_TIMES("AsyncDNS.ConfigNotifyInterval", - now - last_invalidate_config_time_); - } - last_invalidate_config_time_ = now; if (!have_config_) return; have_config_ = false; @@ -67,12 +60,6 @@ void DnsConfigService::InvalidateHosts() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::TimeTicks now = base::TimeTicks::Now(); - if (!last_invalidate_hosts_time_.is_null()) { - UMA_HISTOGRAM_LONG_TIMES("AsyncDNS.HostsNotifyInterval", - now - last_invalidate_hosts_time_); - } - last_invalidate_hosts_time_ = now; if (!have_hosts_) return; have_hosts_ = false; @@ -83,17 +70,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(config.IsValid()); - bool changed = false; if (!config.EqualsIgnoreHosts(dns_config_)) { dns_config_.CopyIgnoreHosts(config); need_update_ = true; - changed = true; } - if (!changed && !last_sent_empty_time_.is_null()) { - UMA_HISTOGRAM_LONG_TIMES("AsyncDNS.UnchangedConfigInterval", - base::TimeTicks::Now() - last_sent_empty_time_); - } - UMA_HISTOGRAM_BOOLEAN("AsyncDNS.ConfigChange", changed); have_config_ = true; if (have_hosts_ || watch_failed_) @@ -103,17 +83,10 @@ void DnsConfigService::OnHostsRead(const DnsHosts& hosts) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - bool changed = false; if (hosts != dns_config_.hosts) { dns_config_.hosts = hosts; need_update_ = true; - changed = true; } - if (!changed && !last_sent_empty_time_.is_null()) { - UMA_HISTOGRAM_LONG_TIMES("AsyncDNS.UnchangedHostsInterval", - base::TimeTicks::Now() - last_sent_empty_time_); - } - UMA_HISTOGRAM_BOOLEAN("AsyncDNS.HostsChange", changed); have_hosts_ = true; if (have_config_ || watch_failed_) @@ -145,7 +118,6 @@ need_update_ = true; // Empty config is considered invalid. last_sent_empty_ = true; - last_sent_empty_time_ = base::TimeTicks::Now(); callback_.Run(DnsConfig()); }
diff --git a/net/dns/dns_config_service.h b/net/dns/dns_config_service.h index 67ae529..c0af67e4 100644 --- a/net/dns/dns_config_service.h +++ b/net/dns/dns_config_service.h
@@ -57,15 +57,6 @@ virtual void RefreshConfig(); protected: - enum WatchStatus { - DNS_CONFIG_WATCH_STARTED = 0, - DNS_CONFIG_WATCH_FAILED_TO_START_CONFIG, - DNS_CONFIG_WATCH_FAILED_TO_START_HOSTS, - DNS_CONFIG_WATCH_FAILED_CONFIG, - DNS_CONFIG_WATCH_FAILED_HOSTS, - DNS_CONFIG_WATCH_MAX, - }; - // Immediately attempts to read the current configuration. virtual void ReadNow() = 0; // Registers system watchers. Returns true iff succeeds. @@ -108,12 +99,6 @@ // Set when |timer_| expires. bool last_sent_empty_; - // Initialized and updated on Invalidate* call. - base::TimeTicks last_invalidate_config_time_; - base::TimeTicks last_invalidate_hosts_time_; - // Initialized and updated when |timer_| expires. - base::TimeTicks last_sent_empty_time_; - // Started in Invalidate*, cleared in On*Read. base::OneShotTimer timer_;
diff --git a/net/dns/dns_config_service_posix.cc b/net/dns/dns_config_service_posix.cc index bd838cb..19c038fe 100644 --- a/net/dns/dns_config_service_posix.cc +++ b/net/dns/dns_config_service_posix.cc
@@ -15,8 +15,6 @@ #include "base/lazy_instance.h" #include "base/location.h" #include "base/logging.h" -#include "base/macros.h" -#include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -145,31 +143,25 @@ } #endif // defined(OS_ANDROID) -ConfigParsePosixResult ReadDnsConfig(DnsConfig* dns_config) { +bool ReadDnsConfig(DnsConfig* dns_config) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); dns_config->unhandled_options = false; #if !defined(OS_ANDROID) - ConfigParsePosixResult result; + bool success = false; // TODO(fuchsia): Use res_ninit() when it's implemented on Fuchsia. #if defined(OS_OPENBSD) || defined(OS_FUCHSIA) // Note: res_ninit in glibc always returns 0 and sets RES_INIT. // res_init behaves the same way. memset(&_res, 0, sizeof(_res)); - if (res_init() == 0) { - result = ConvertResStateToDnsConfig(_res, dns_config); - } else { - result = CONFIG_PARSE_POSIX_RES_INIT_FAILED; - } + if (res_init() == 0) + success = ConvertResStateToDnsConfig(_res, dns_config); #else // all other OS_POSIX struct __res_state res; memset(&res, 0, sizeof(res)); - if (res_ninit(&res) == 0) { - result = ConvertResStateToDnsConfig(res, dns_config); - } else { - result = CONFIG_PARSE_POSIX_RES_INIT_FAILED; - } - // Prefer res_ndestroy where available. + if (res_ninit(&res) == 0) + success = ConvertResStateToDnsConfig(res, dns_config); + // Prefer res_ndestroy where available. #if defined(OS_APPLE) || defined(OS_FREEBSD) res_ndestroy(&res); #else @@ -178,21 +170,12 @@ #endif // defined(OS_OPENBSD) #if defined(OS_MAC) - ConfigParsePosixResult error = DnsConfigWatcher::CheckDnsConfig(); - switch (error) { - case CONFIG_PARSE_POSIX_OK: - break; - case CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS: - LOG(WARNING) << "dns_config has unhandled options!"; - dns_config->unhandled_options = true; - FALLTHROUGH; - default: - return error; - } + if (!DnsConfigWatcher::CheckDnsConfig(&dns_config->unhandled_options)) + return false; #endif // defined(OS_MAC) // Override |fallback_period| value to match default setting on Windows. dns_config->fallback_period = kDnsDefaultFallbackPeriod; - return result; + return success; #else // defined(OS_ANDROID) dns_config->nameservers.clear(); @@ -205,7 +188,7 @@ if (IsVpnPresent()) { dns_config->unhandled_options = true; - return CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS; + return true; } // NOTE(pauljensen): __system_property_get and the net.dns1/2 properties are @@ -217,14 +200,14 @@ __system_property_get("net.dns2", property_value); std::string dns2_string = property_value; if (dns1_string.empty() && dns2_string.empty()) - return CONFIG_PARSE_POSIX_NO_NAMESERVERS; + return false; IPAddress dns1_address; IPAddress dns2_address; bool parsed1 = dns1_address.AssignFromIPLiteral(dns1_string); bool parsed2 = dns2_address.AssignFromIPLiteral(dns2_string); if (!parsed1 && !parsed2) - return CONFIG_PARSE_POSIX_BAD_ADDRESS; + return false; if (parsed1) { IPEndPoint dns1(dns1_address, dns_protocol::kDefaultPort); @@ -235,7 +218,7 @@ dns_config->nameservers.push_back(dns2); } - return CONFIG_PARSE_POSIX_OK; + return true; #endif // !defined(OS_ANDROID) } @@ -252,9 +235,6 @@ base::Unretained(this)))) { LOG(ERROR) << "DNS config watch failed to start."; success = false; - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_TO_START_CONFIG, - DNS_CONFIG_WATCH_MAX); } // Hosts file should never change on Android or iOS (and watching it on Android // is problematic; see http://crbug.com/600442), so don't watch it there. @@ -265,9 +245,6 @@ base::Unretained(this)))) { LOG(ERROR) << "DNS hosts watch failed to start."; success = false; - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_TO_START_HOSTS, - DNS_CONFIG_WATCH_MAX); } #endif // !defined(OS_ANDROID) && !defined(OS_IOS) return success; @@ -315,26 +292,7 @@ DETACH_FROM_SEQUENCE(sequence_checker_); } - void DoWork() override { - base::TimeTicks start_time = base::TimeTicks::Now(); - ConfigParsePosixResult result = ReadDnsConfig(&dns_config_); - switch (result) { - case CONFIG_PARSE_POSIX_MISSING_OPTIONS: - case CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS: - DCHECK(dns_config_.unhandled_options); - FALLTHROUGH; - case CONFIG_PARSE_POSIX_OK: - success_ = true; - break; - default: - success_ = false; - break; - } - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.ConfigParsePosix", - result, CONFIG_PARSE_POSIX_MAX); - UMA_HISTOGRAM_TIMES("AsyncDNS.ConfigParseDuration", - base::TimeTicks::Now() - start_time); - } + void DoWork() override { success_ = ReadDnsConfig(&dns_config_); } void OnWorkFinished() override { DCHECK(!IsCancelled()); @@ -375,13 +333,9 @@ ~HostsReader() override {} void DoWork() override { - base::TimeTicks start_time = base::TimeTicks::Now(); base::ScopedBlockingCall scoped_blocking_call( FROM_HERE, base::BlockingType::MAY_BLOCK); success_ = ParseHostsFile(file_path_hosts_, &hosts_); - UMA_HISTOGRAM_BOOLEAN("AsyncDNS.HostParseResult", success_); - UMA_HISTOGRAM_TIMES("AsyncDNS.HostsParseDuration", - base::TimeTicks::Now() - start_time); } void OnWorkFinished() override { @@ -431,8 +385,6 @@ CreateReaders(); // TODO(szym): re-start watcher if that makes sense. http://crbug.com/116139 watcher_.reset(new Watcher(this)); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", DNS_CONFIG_WATCH_STARTED, - DNS_CONFIG_WATCH_MAX); return watcher_->Watch(); } @@ -443,9 +395,6 @@ } else { LOG(ERROR) << "DNS config watch failed."; set_watch_failed(true); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_CONFIG, - DNS_CONFIG_WATCH_MAX); } } @@ -456,9 +405,6 @@ } else { LOG(ERROR) << "DNS hosts watch failed."; set_watch_failed(true); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_HOSTS, - DNS_CONFIG_WATCH_MAX); } } @@ -471,12 +417,12 @@ } #if !defined(OS_ANDROID) -ConfigParsePosixResult ConvertResStateToDnsConfig(const struct __res_state& res, - DnsConfig* dns_config) { +bool ConvertResStateToDnsConfig(const struct __res_state& res, + DnsConfig* dns_config) { DCHECK(dns_config); if (!(res.options & RES_INIT)) - return CONFIG_PARSE_POSIX_RES_INIT_UNSET; + return false; dns_config->nameservers.clear(); @@ -490,7 +436,7 @@ if (!ipe.FromSockAddr( reinterpret_cast<const struct sockaddr*>(&addresses[i]), sizeof addresses[i])) { - return CONFIG_PARSE_POSIX_BAD_ADDRESS; + return false; } dns_config->nameservers.push_back(ipe); } @@ -513,10 +459,10 @@ addr = reinterpret_cast<const struct sockaddr*>(res._u._ext.nsaddrs[i]); addr_len = sizeof *res._u._ext.nsaddrs[i]; } else { - return CONFIG_PARSE_POSIX_BAD_EXT_STRUCT; + return false; } if (!ipe.FromSockAddr(addr, addr_len)) - return CONFIG_PARSE_POSIX_BAD_ADDRESS; + return false; dns_config->nameservers.push_back(ipe); } #else // !(defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_APPLE) || @@ -527,7 +473,7 @@ if (!ipe.FromSockAddr( reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]), sizeof res.nsaddr_list[i])) { - return CONFIG_PARSE_POSIX_BAD_ADDRESS; + return false; } dns_config->nameservers.push_back(ipe); } @@ -555,25 +501,25 @@ const unsigned kRequiredOptions = RES_RECURSE | RES_DEFNAMES | RES_DNSRCH; if ((res.options & kRequiredOptions) != kRequiredOptions) { dns_config->unhandled_options = true; - return CONFIG_PARSE_POSIX_MISSING_OPTIONS; + return true; } const unsigned kUnhandledOptions = RES_USEVC | RES_IGNTC | RES_USE_DNSSEC; if (res.options & kUnhandledOptions) { dns_config->unhandled_options = true; - return CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS; + return true; } if (dns_config->nameservers.empty()) - return CONFIG_PARSE_POSIX_NO_NAMESERVERS; + return false; // If any name server is 0.0.0.0, assume the configuration is invalid. // TODO(szym): Measure how often this happens. http://crbug.com/125599 for (unsigned i = 0; i < dns_config->nameservers.size(); ++i) { if (dns_config->nameservers[i].address().IsZero()) - return CONFIG_PARSE_POSIX_NULL_ADDRESS; + return false; } - return CONFIG_PARSE_POSIX_OK; + return true; } #endif // !defined(OS_ANDROID)
diff --git a/net/dns/dns_config_service_posix.h b/net/dns/dns_config_service_posix.h index d2f89611..12fa1037 100644 --- a/net/dns/dns_config_service_posix.h +++ b/net/dns/dns_config_service_posix.h
@@ -17,6 +17,7 @@ #include "base/files/file_path.h" #include "base/gtest_prod_util.h" #include "base/macros.h" +#include "base/optional.h" #include "net/base/net_export.h" #include "net/dns/dns_config_service.h" @@ -65,24 +66,12 @@ DISALLOW_COPY_AND_ASSIGN(DnsConfigServicePosix); }; -enum ConfigParsePosixResult { - CONFIG_PARSE_POSIX_OK = 0, - CONFIG_PARSE_POSIX_RES_INIT_FAILED, - CONFIG_PARSE_POSIX_RES_INIT_UNSET, - CONFIG_PARSE_POSIX_BAD_ADDRESS, - CONFIG_PARSE_POSIX_BAD_EXT_STRUCT, - CONFIG_PARSE_POSIX_NULL_ADDRESS, - CONFIG_PARSE_POSIX_NO_NAMESERVERS, - CONFIG_PARSE_POSIX_MISSING_OPTIONS, - CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS, - CONFIG_PARSE_POSIX_NO_DNSINFO, - CONFIG_PARSE_POSIX_MAX // Bounding values for enumeration. -}; - #if !defined(OS_ANDROID) -// Fills in |dns_config| from |res|. -ConfigParsePosixResult NET_EXPORT_PRIVATE ConvertResStateToDnsConfig( - const struct __res_state& res, DnsConfig* dns_config); +// Fills in |dns_config| from |res|. Returns false iff a valid config could not +// be determined. +bool NET_EXPORT_PRIVATE +ConvertResStateToDnsConfig(const struct __res_state& res, + DnsConfig* dns_config); #endif } // namespace internal
diff --git a/net/dns/dns_config_service_posix_unittest.cc b/net/dns/dns_config_service_posix_unittest.cc index e8ce230a..da0c68e 100644 --- a/net/dns/dns_config_service_posix_unittest.cc +++ b/net/dns/dns_config_service_posix_unittest.cc
@@ -149,8 +149,7 @@ DnsConfig config; EXPECT_FALSE(config.IsValid()); InitializeResState(&res); - ASSERT_EQ(internal::CONFIG_PARSE_POSIX_OK, - internal::ConvertResStateToDnsConfig(res, &config)); + ASSERT_TRUE(internal::ConvertResStateToDnsConfig(res, &config)); CloseResState(&res); EXPECT_TRUE(config.IsValid()); @@ -177,13 +176,11 @@ res.nscount = 2; DnsConfig config; - EXPECT_EQ(internal::CONFIG_PARSE_POSIX_NULL_ADDRESS, - internal::ConvertResStateToDnsConfig(res, &config)); + EXPECT_FALSE(internal::ConvertResStateToDnsConfig(res, &config)); sa.sin_addr.s_addr = 0xDEADBEEF; res.nsaddr_list[0] = sa; - EXPECT_EQ(internal::CONFIG_PARSE_POSIX_OK, - internal::ConvertResStateToDnsConfig(res, &config)); + EXPECT_TRUE(internal::ConvertResStateToDnsConfig(res, &config)); } TEST(DnsConfigServicePosixTest, DestroyWhileJobsWorking) {
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc index 1d6dcaf..8e385ab 100644 --- a/net/dns/dns_config_service_win.cc +++ b/net/dns/dns_config_service_win.cc
@@ -17,7 +17,6 @@ #include "base/logging.h" #include "base/macros.h" #include "base/memory/free_deleter.h" -#include "base/metrics/histogram_macros.h" #include "base/sequence_checker.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_piece.h" @@ -69,15 +68,6 @@ L"SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters\\" L"DnsConnectionsProxies"; -enum HostsParseWinResult { - HOSTS_PARSE_WIN_OK = 0, - HOSTS_PARSE_WIN_UNREADABLE_HOSTS_FILE, - HOSTS_PARSE_WIN_COMPUTER_NAME_FAILED, - HOSTS_PARSE_WIN_IPHELPER_FAILED, - HOSTS_PARSE_WIN_BAD_ADDRESS, - HOSTS_PARSE_WIN_MAX // Bounding values for enumeration. -}; - // Convenience for reading values using RegKey. class RegistryReader { public: @@ -155,7 +145,7 @@ } // Reads DnsSystemSettings from IpHelper and registry. -ConfigParseWinResult ReadSystemSettings(DnsSystemSettings* settings) { +bool ReadSystemSettings(DnsSystemSettings* settings) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); settings->addresses = ReadIpHelper(GAA_FLAG_SKIP_ANYCAST | @@ -163,7 +153,7 @@ GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_FRIENDLY_NAME); if (!settings->addresses.get()) - return CONFIG_PARSE_WIN_READ_IPHELPER; + return false; RegistryReader tcpip_reader(kTcpipPath); RegistryReader tcpip6_reader(kTcpip6Path); @@ -172,32 +162,32 @@ RegistryReader primary_dns_suffix_reader(kPrimaryDnsSuffixPath); if (!policy_reader.ReadString(L"SearchList", &settings->policy_search_list)) { - return CONFIG_PARSE_WIN_READ_POLICY_SEARCHLIST; + return false; } if (!tcpip_reader.ReadString(L"SearchList", &settings->tcpip_search_list)) - return CONFIG_PARSE_WIN_READ_TCPIP_SEARCHLIST; + return false; if (!tcpip_reader.ReadString(L"Domain", &settings->tcpip_domain)) - return CONFIG_PARSE_WIN_READ_DOMAIN; + return false; if (!ReadDevolutionSetting(policy_reader, &settings->policy_devolution)) - return CONFIG_PARSE_WIN_READ_POLICY_DEVOLUTION; + return false; if (!ReadDevolutionSetting(dnscache_reader, &settings->dnscache_devolution)) - return CONFIG_PARSE_WIN_READ_DNSCACHE_DEVOLUTION; + return false; if (!ReadDevolutionSetting(tcpip_reader, &settings->tcpip_devolution)) - return CONFIG_PARSE_WIN_READ_TCPIP_DEVOLUTION; + return false; if (!policy_reader.ReadDword(L"AppendToMultiLabelName", &settings->append_to_multi_label_name)) { - return CONFIG_PARSE_WIN_READ_APPEND_MULTILABEL; + return false; } if (!primary_dns_suffix_reader.ReadString(L"PrimaryDnsSuffix", &settings->primary_dns_suffix)) { - return CONFIG_PARSE_WIN_READ_PRIMARY_SUFFIX; + return false; } base::win::RegistryKeyIterator nrpt_rules(HKEY_LOCAL_MACHINE, kNrptPath); @@ -213,12 +203,12 @@ settings->have_proxy = (dns_connections.SubkeyCount() > 0 || dns_connections_proxies.SubkeyCount() > 0); - return CONFIG_PARSE_WIN_OK; + return true; } // Default address of "localhost" and local computer name can be overridden // by the HOSTS file, but if it's not there, then we need to fill it in. -HostsParseWinResult AddLocalhostEntries(DnsHosts* hosts) { +bool AddLocalhostEntries(DnsHosts* hosts) { IPAddress loopback_ipv4 = IPAddress::IPv4Localhost(); IPAddress loopback_ipv6 = IPAddress::IPv6Localhost(); @@ -233,7 +223,7 @@ std::string localname; if (!GetComputerNameExW(ComputerNameDnsHostname, buffer, &size) || !ParseDomainASCII(buffer, &localname)) { - return HOSTS_PARSE_WIN_COMPUTER_NAME_FAILED; + return false; } localname = base::ToLowerASCII(localname); @@ -243,13 +233,13 @@ hosts->count(DnsHostsKey(localname, ADDRESS_FAMILY_IPV6)) > 0; if (have_ipv4 && have_ipv6) - return HOSTS_PARSE_WIN_OK; + return true; std::unique_ptr<IP_ADAPTER_ADDRESSES, base::FreeDeleter> addresses = ReadIpHelper(GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_FRIENDLY_NAME); if (!addresses.get()) - return HOSTS_PARSE_WIN_IPHELPER_FAILED; + return false; // The order of adapters is the network binding order, so stick to the // first good adapter for each family. @@ -267,7 +257,7 @@ IPEndPoint ipe; if (!ipe.FromSockAddr(address->Address.lpSockaddr, address->Address.iSockaddrLength)) { - return HOSTS_PARSE_WIN_BAD_ADDRESS; + return false; } if (!have_ipv4 && (ipe.GetFamily() == ADDRESS_FAMILY_IPV4)) { have_ipv4 = true; @@ -278,7 +268,7 @@ } } } - return HOSTS_PARSE_WIN_OK; + return true; } // Watches a single registry key for changes. @@ -505,9 +495,8 @@ return !output->empty(); } -ConfigParseWinResult ConvertSettingsToDnsConfig( - const DnsSystemSettings& settings, - DnsConfig* config) { +bool ConvertSettingsToDnsConfig(const DnsSystemSettings& settings, + DnsConfig* config) { bool uses_vpn = false; *config = DnsConfig(); @@ -543,7 +532,7 @@ ipe = IPEndPoint(ipe.address(), dns_protocol::kDefaultPort); config->nameservers.push_back(ipe); } else { - return CONFIG_PARSE_WIN_BAD_ADDRESS; + return false; } } @@ -558,7 +547,7 @@ } if (config->nameservers.empty()) - return CONFIG_PARSE_WIN_NO_NAMESERVERS; // No point continuing. + return false; // No point continuing. // Windows always tries a multi-label name "as is" before using suffixes. config->ndots = 1; @@ -575,14 +564,11 @@ config->use_local_ipv6 = true; } - ConfigParseWinResult result = CONFIG_PARSE_WIN_OK; - if (settings.have_name_resolution_policy || settings.have_proxy || uses_vpn) { + if (settings.have_name_resolution_policy || settings.have_proxy || uses_vpn) config->unhandled_options = true; - result = CONFIG_PARSE_WIN_UNHANDLED_OPTIONS; - } ConfigureSuffixSearch(settings, config); - return result; + return true; } // Watches registry and HOSTS file for changes. Must live on a sequence which @@ -603,9 +589,6 @@ if (!tcpip_watcher_.Watch(kTcpipPath, callback)) { LOG(ERROR) << "DNS registry watch failed to start."; success = false; - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_TO_START_CONFIG, - DNS_CONFIG_WATCH_MAX); } // Watch for IPv6 nameservers. @@ -624,9 +607,6 @@ base::FilePathWatcher::Type::kNonRecursive, base::BindRepeating(&Watcher::OnHostsChanged, base::Unretained(this)))) { - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_TO_START_HOSTS, - DNS_CONFIG_WATCH_MAX); LOG(ERROR) << "DNS hosts watch failed to start."; success = false; } else { @@ -671,17 +651,10 @@ ~ConfigReader() override {} void DoWork() override { - base::TimeTicks start_time = base::TimeTicks::Now(); DnsSystemSettings settings = {}; - ConfigParseWinResult result = ReadSystemSettings(&settings); - if (result == CONFIG_PARSE_WIN_OK) - result = ConvertSettingsToDnsConfig(settings, &dns_config_); - success_ = (result == CONFIG_PARSE_WIN_OK || - result == CONFIG_PARSE_WIN_UNHANDLED_OPTIONS); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.ConfigParseWin", - result, CONFIG_PARSE_WIN_MAX); - UMA_HISTOGRAM_TIMES("AsyncDNS.ConfigParseDuration", - base::TimeTicks::Now() - start_time); + success_ = false; + if (ReadSystemSettings(&settings)) + success_ = ConvertSettingsToDnsConfig(settings, &dns_config_); } void OnWorkFinished() override { @@ -718,18 +691,11 @@ ~HostsReader() override {} void DoWork() override { - base::TimeTicks start_time = base::TimeTicks::Now(); base::ScopedBlockingCall scoped_blocking_call( FROM_HERE, base::BlockingType::MAY_BLOCK); - HostsParseWinResult result = HOSTS_PARSE_WIN_UNREADABLE_HOSTS_FILE; + success_ = false; if (ParseHostsFile(path_, &hosts_)) - result = AddLocalhostEntries(&hosts_); - success_ = (result == HOSTS_PARSE_WIN_OK); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.HostsParseWin", - result, HOSTS_PARSE_WIN_MAX); - UMA_HISTOGRAM_BOOLEAN("AsyncDNS.HostParseResult", success_); - UMA_HISTOGRAM_TIMES("AsyncDNS.HostsParseDuration", - base::TimeTicks::Now() - start_time); + success_ = AddLocalhostEntries(&hosts_); } void OnWorkFinished() override { @@ -774,8 +740,6 @@ hosts_reader_ = base::MakeRefCounted<HostsReader>(this); // TODO(szym): re-start watcher if that makes sense. http://crbug.com/116139 watcher_.reset(new Watcher(this)); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", DNS_CONFIG_WATCH_STARTED, - DNS_CONFIG_WATCH_MAX); return watcher_->Watch(); } @@ -785,9 +749,6 @@ if (!succeeded) { LOG(ERROR) << "DNS config watch failed."; set_watch_failed(true); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_CONFIG, - DNS_CONFIG_WATCH_MAX); } } @@ -798,9 +759,6 @@ } else { LOG(ERROR) << "DNS hosts watch failed."; set_watch_failed(true); - UMA_HISTOGRAM_ENUMERATION("AsyncDNS.WatchStatus", - DNS_CONFIG_WATCH_FAILED_HOSTS, - DNS_CONFIG_WATCH_MAX); } }
diff --git a/net/dns/dns_config_service_win.h b/net/dns/dns_config_service_win.h index 6c7e3df9..de1d1ac5 100644 --- a/net/dns/dns_config_service_win.h +++ b/net/dns/dns_config_service_win.h
@@ -114,27 +114,11 @@ bool have_proxy = false; }; -enum ConfigParseWinResult { - CONFIG_PARSE_WIN_OK = 0, - CONFIG_PARSE_WIN_READ_IPHELPER, - CONFIG_PARSE_WIN_READ_POLICY_SEARCHLIST, - CONFIG_PARSE_WIN_READ_TCPIP_SEARCHLIST, - CONFIG_PARSE_WIN_READ_DOMAIN, - CONFIG_PARSE_WIN_READ_POLICY_DEVOLUTION, - CONFIG_PARSE_WIN_READ_DNSCACHE_DEVOLUTION, - CONFIG_PARSE_WIN_READ_TCPIP_DEVOLUTION, - CONFIG_PARSE_WIN_READ_APPEND_MULTILABEL, - CONFIG_PARSE_WIN_READ_PRIMARY_SUFFIX, - CONFIG_PARSE_WIN_BAD_ADDRESS, - CONFIG_PARSE_WIN_NO_NAMESERVERS, - CONFIG_PARSE_WIN_UNHANDLED_OPTIONS, - CONFIG_PARSE_WIN_MAX // Bounding values for enumeration. -}; - -// Fills in |dns_config| from |settings|. Exposed for tests. -ConfigParseWinResult NET_EXPORT_PRIVATE ConvertSettingsToDnsConfig( - const DnsSystemSettings& settings, - DnsConfig* dns_config); +// Fills in |dns_config| from |settings|. Exposed for tests. Returns false if a +// valid config could not be determined. +bool NET_EXPORT_PRIVATE +ConvertSettingsToDnsConfig(const DnsSystemSettings& settings, + DnsConfig* dns_config); // Service for reading and watching Windows system DNS settings. This object is // not thread-safe and methods may perform blocking I/O so methods must be
diff --git a/net/dns/dns_config_service_win_unittest.cc b/net/dns/dns_config_service_win_unittest.cc index 070df338..4ab74766 100644 --- a/net/dns/dns_config_service_win_unittest.cc +++ b/net/dns/dns_config_service_win_unittest.cc
@@ -184,14 +184,11 @@ } DnsConfig config; - internal::ConfigParseWinResult result = - internal::ConvertSettingsToDnsConfig(settings, &config); - internal::ConfigParseWinResult expected_result = - expected_nameservers.empty() ? internal::CONFIG_PARSE_WIN_NO_NAMESERVERS - : internal::CONFIG_PARSE_WIN_OK; - EXPECT_EQ(expected_result, result); + bool success = internal::ConvertSettingsToDnsConfig(settings, &config); + bool expected_success = !expected_nameservers.empty(); + EXPECT_EQ(expected_success, success); EXPECT_EQ(expected_nameservers, config.nameservers); - if (result == internal::CONFIG_PARSE_WIN_OK) { + if (success) { ASSERT_EQ(1u, config.search.size()); EXPECT_EQ(t.expected_suffix, config.search[0]); } @@ -393,8 +390,7 @@ settings.tcpip_devolution = t.input_settings.tcpip_devolution; DnsConfig config; - EXPECT_EQ(internal::CONFIG_PARSE_WIN_OK, - internal::ConvertSettingsToDnsConfig(settings, &config)); + EXPECT_TRUE(internal::ConvertSettingsToDnsConfig(settings, &config)); std::vector<std::string> expected_search; for (size_t j = 0; !t.expected_search[j].empty(); ++j) { expected_search.push_back(t.expected_search[j]); @@ -421,8 +417,7 @@ settings.addresses = CreateAdapterAddresses(infos); settings.append_to_multi_label_name = t.input; DnsConfig config; - EXPECT_EQ(internal::CONFIG_PARSE_WIN_OK, - internal::ConvertSettingsToDnsConfig(settings, &config)); + EXPECT_TRUE(internal::ConvertSettingsToDnsConfig(settings, &config)); EXPECT_EQ(t.expected_output, config.append_to_multi_label_name); } } @@ -437,10 +432,9 @@ const struct TestCase { bool have_nrpt; bool unhandled_options; - internal::ConfigParseWinResult result; } cases[] = { - { false, false, internal::CONFIG_PARSE_WIN_OK }, - { true, true, internal::CONFIG_PARSE_WIN_UNHANDLED_OPTIONS }, + {false, false}, + {true, true}, }; for (const auto& t : cases) { @@ -448,8 +442,7 @@ settings.addresses = CreateAdapterAddresses(infos); settings.have_name_resolution_policy = t.have_nrpt; DnsConfig config; - EXPECT_EQ(t.result, - internal::ConvertSettingsToDnsConfig(settings, &config)); + EXPECT_TRUE(internal::ConvertSettingsToDnsConfig(settings, &config)); EXPECT_EQ(t.unhandled_options, config.unhandled_options); EXPECT_EQ(t.have_nrpt, config.use_local_ipv6); } @@ -465,10 +458,9 @@ const struct TestCase { bool have_proxy; bool unhandled_options; - internal::ConfigParseWinResult result; } cases[] = { - {false, false, internal::CONFIG_PARSE_WIN_OK}, - {true, true, internal::CONFIG_PARSE_WIN_UNHANDLED_OPTIONS}, + {false, false}, + {true, true}, }; for (const auto& t : cases) { @@ -476,8 +468,7 @@ settings.addresses = CreateAdapterAddresses(infos); settings.have_proxy = t.have_proxy; DnsConfig config; - EXPECT_EQ(t.result, - internal::ConvertSettingsToDnsConfig(settings, &config)); + EXPECT_TRUE(internal::ConvertSettingsToDnsConfig(settings, &config)); EXPECT_EQ(t.unhandled_options, config.unhandled_options); } } @@ -493,8 +484,7 @@ internal::DnsSystemSettings settings; settings.addresses = CreateAdapterAddresses(infos); DnsConfig config; - EXPECT_EQ(internal::CONFIG_PARSE_WIN_UNHANDLED_OPTIONS, - internal::ConvertSettingsToDnsConfig(settings, &config)); + EXPECT_TRUE(internal::ConvertSettingsToDnsConfig(settings, &config)); EXPECT_TRUE(config.unhandled_options); }
diff --git a/net/dns/dns_config_watcher_mac.cc b/net/dns/dns_config_watcher_mac.cc index b65be94..bb175d7 100644 --- a/net/dns/dns_config_watcher_mac.cc +++ b/net/dns/dns_config_watcher_mac.cc
@@ -78,13 +78,15 @@ } // static -ConfigParsePosixResult DnsConfigWatcher::CheckDnsConfig() { +bool DnsConfigWatcher::CheckDnsConfig(bool* out_unhandled_options) { + DCHECK(out_unhandled_options); + if (!GetDnsInfoApi().dns_configuration_copy) - return CONFIG_PARSE_POSIX_NO_DNSINFO; + return false; std::unique_ptr<dns_config_t, DnsConfigTDeleter> dns_config( GetDnsInfoApi().dns_configuration_copy()); if (!dns_config) - return CONFIG_PARSE_POSIX_NO_DNSINFO; + return false; // TODO(szym): Parse dns_config_t for resolvers rather than res_state. // DnsClient can't handle domain-specific unscoped resolvers. @@ -97,9 +99,9 @@ continue; ++num_resolvers; } - if (num_resolvers > 1) - return CONFIG_PARSE_POSIX_UNHANDLED_OPTIONS; - return CONFIG_PARSE_POSIX_OK; + + *out_unhandled_options = num_resolvers > 1; + return true; } } // namespace internal
diff --git a/net/dns/dns_config_watcher_mac.h b/net/dns/dns_config_watcher_mac.h index a6399363..9151a52 100644 --- a/net/dns/dns_config_watcher_mac.h +++ b/net/dns/dns_config_watcher_mac.h
@@ -6,7 +6,6 @@ #define NET_DNS_DNS_CONFIG_WATCHER_MAC_H_ #include "base/callback_forward.h" -#include "net/dns/dns_config_service_posix.h" #include "net/dns/notify_watcher_mac.h" namespace net { @@ -17,9 +16,8 @@ public: bool Watch(const base::RepeatingCallback<void(bool succeeded)>& callback); - // Returns an error if the DNS configuration is invalid. - // Returns CONFIG_PARSE_POSIX_OK otherwise. - static ConfigParsePosixResult CheckDnsConfig(); + // Returns false iff a valid config could not be determined. + static bool CheckDnsConfig(bool* out_unhandled_options); private: NotifyWatcherMac watcher_;
diff --git a/net/dns/dns_session.cc b/net/dns/dns_session.cc index d6fed319..996a515f 100644 --- a/net/dns/dns_session.cc +++ b/net/dns/dns_session.cc
@@ -10,7 +10,6 @@ #include <utility> #include "base/bind.h" -#include "base/metrics/histogram_macros.h" #include "base/rand_util.h" #include "base/stl_util.h" #include "net/dns/dns_config.h" @@ -28,10 +27,7 @@ rand_callback_(base::BindRepeating(rand_int_callback, 0, std::numeric_limits<uint16_t>::max())), - net_log_(net_log) { - UMA_HISTOGRAM_CUSTOM_COUNTS("AsyncDNS.ServerCount", - config_.nameservers.size(), 1, 10, 11); -} + net_log_(net_log) {} DnsSession::~DnsSession() = default;
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index aa5901f..52e8997 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -75,7 +75,6 @@ "GlobalSignRootCA_R2" ], "bad_static_spki_hashes": [ - "GlobalSignRootCA", "GlobalSignExtendedValidationCA", "GlobalSignExtendedValidationCA_G2", "GlobalSignExtendedValidationCA_SHA256_G2"
diff --git a/net/quic/quic_transport_client.h b/net/quic/quic_transport_client.h index eaa79b6..9f873d1 100644 --- a/net/quic/quic_transport_client.h +++ b/net/quic/quic_transport_client.h
@@ -156,6 +156,11 @@ } void OnStopSendingReceived( const quic::QuicStopSendingFrame& /*frame*/) override {} + void OnNewConnectionIdSent( + const quic::QuicConnectionId& /*server_connection_id*/, + const quic::QuicConnectionId& /*new_connecition_id*/) override {} + void OnConnectionIdRetired( + const quic::QuicConnectionId& /*server_connection_id*/) override {} private: // State of the connection establishment process.
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc index 3ada2318..4a4fb96 100644 --- a/pdf/out_of_process_instance.cc +++ b/pdf/out_of_process_instance.cc
@@ -129,7 +129,12 @@ constexpr char kJSBookmarksData[] = "bookmarksData"; // Metadata (Plugin -> Page) constexpr char kJSMetadataType[] = "metadata"; +constexpr char kJSMetadataData[] = "metadataData"; constexpr char kJSTitle[] = "title"; +constexpr char kJSAuthor[] = "author"; +constexpr char kJSSubject[] = "subject"; +constexpr char kJSCreator[] = "creator"; +constexpr char kJSProducer[] = "producer"; constexpr char kJSCanSerializeDocument[] = "canSerializeDocument"; // Get password (Plugin -> Page) constexpr char kJSGetPasswordType[] = "getPassword"; @@ -758,24 +763,24 @@ } void OutOfProcessInstance::DidChangeView(const pp::View& view) { - pp::Rect view_rect(view.GetRect()); + gfx::Rect view_rect = RectFromPPRect(view.GetRect()); float old_device_scale = device_scale(); float new_device_scale = view.GetDeviceScale(); - pp::Size view_device_size(view_rect.width() * new_device_scale, - view_rect.height() * new_device_scale); + gfx::Size view_device_size(view_rect.width() * new_device_scale, + view_rect.height() * new_device_scale); - if (view_device_size != plugin_size_ || new_device_scale != device_scale() || - view_rect.point() != plugin_offset_) { + if (view_device_size != plugin_size() || new_device_scale != device_scale() || + view_rect.origin() != plugin_offset()) { set_device_scale(new_device_scale); - plugin_dip_size_ = view_rect.size(); - plugin_size_ = view_device_size; - plugin_offset_ = view_rect.point(); + set_plugin_dip_size(view_rect.size()); + set_plugin_size(view_device_size); + set_plugin_offset(view_rect.origin()); - paint_manager().SetSize(SizeFromPPSize(view_device_size), device_scale()); + paint_manager().SetSize(view_device_size, device_scale()); const gfx::Size old_image_data_size = SizeFromPPSize(image_data_.size()); - gfx::Size new_image_data_size = PaintManager::GetNewContextSize( - old_image_data_size, SizeFromPPSize(plugin_size_)); + gfx::Size new_image_data_size = + PaintManager::GetNewContextSize(old_image_data_size, plugin_size()); if (new_image_data_size != old_image_data_size) { image_data_ = pp::ImageData(this, PP_IMAGEDATAFORMAT_BGRA_PREMUL, PPSizeFromSize(new_image_data_size), false); @@ -785,7 +790,7 @@ } if (image_data_.is_null()) { - DCHECK(plugin_size_.IsEmpty()); + DCHECK(plugin_size().IsEmpty()); return; } @@ -913,9 +918,9 @@ void OutOfProcessInstance::SendAccessibilityViewportInfo() { PP_PrivateAccessibilityViewportInfo viewport_info; - viewport_info.scroll.x = -plugin_offset_.x(); + viewport_info.scroll.x = -plugin_offset().x(); viewport_info.scroll.y = - -top_toolbar_height_in_viewport_coords() - plugin_offset_.y(); + -top_toolbar_height_in_viewport_coords() - plugin_offset().y(); viewport_info.offset.x = available_area_.x() / (device_scale() * zoom()); viewport_info.offset.y = available_area_.y() / (device_scale() * zoom()); @@ -1115,7 +1120,7 @@ std::vector<PaintReadyRect>* ready, std::vector<gfx::Rect>* pending) { if (image_data_.is_null()) { - DCHECK(plugin_size_.IsEmpty()); + DCHECK(plugin_size().IsEmpty()); return; } if (first_paint()) { @@ -1133,8 +1138,7 @@ for (const auto& paint_rect : paint_rects) { // Intersect with plugin area since there could be pending invalidates from // when the plugin area was larger. - gfx::Rect rect = gfx::IntersectRects( - paint_rect, gfx::Rect(SizeFromPPSize(plugin_size_))); + gfx::Rect rect = gfx::IntersectRects(paint_rect, gfx::Rect(plugin_size())); if (rect.IsEmpty()) continue; @@ -1161,7 +1165,7 @@ : engine()->GetPageScreenRect(0).y(); if (rect.y() < first_page_ypos) { gfx::Rect region = gfx::IntersectRects( - rect, gfx::Rect(gfx::Size(plugin_size_.width(), first_page_ypos))); + rect, gfx::Rect(gfx::Size(plugin_size().width(), first_page_ypos))); ready->push_back(PaintReadyRect(region, image_data_)); FillRect(region, GetBackgroundColor()); } @@ -1191,8 +1195,8 @@ background_parts_.clear(); int left_width = available_area_.x(); int right_start = available_area_.right(); - int right_width = abs(plugin_size_.width() - available_area_.right()); - int bottom = std::min(available_area_.bottom(), plugin_size_.height()); + int right_width = abs(plugin_size().width() - available_area_.right()); + int bottom = std::min(available_area_.bottom(), plugin_size().height()); // Add the left, right, and bottom rectangles. Note: we assume only // horizontal centering. @@ -1203,8 +1207,8 @@ part.location = pp::Rect(right_start, 0, right_width, bottom); if (!part.location.IsEmpty()) background_parts_.push_back(part); - part.location = - pp::Rect(0, bottom, plugin_size_.width(), plugin_size_.height() - bottom); + part.location = pp::Rect(0, bottom, plugin_size().width(), + plugin_size().height() - bottom); if (!part.location.IsEmpty()) background_parts_.push_back(part); } @@ -1835,7 +1839,7 @@ engine()->SetGrayscale(dict.Get(pp::Var(kJSPrintPreviewGrayscale)).AsBool()); engine()->New(url_.c_str(), /*headers=*/nullptr); - paint_manager().InvalidateRect(gfx::Rect(SizeFromPPSize(plugin_size_))); + paint_manager().InvalidateRect(gfx::Rect(plugin_size())); } void OutOfProcessInstance::HandleSaveAttachmentMessage( @@ -2008,7 +2012,7 @@ // position on screen of the paint. gfx::Vector2d paint_offset; - if (plugin_size_.width() > GetDocumentPixelWidth() * zoom_ratio) { + if (plugin_size().width() > GetDocumentPixelWidth() * zoom_ratio) { // We want to keep the paint in the middle but it must stay in the same // position relative to the scroll bars. paint_offset = gfx::Vector2d(0, (1 - zoom_ratio) * pinch_center.y()); @@ -2019,10 +2023,10 @@ pinch_vector = gfx::Vector2d(); last_bitmap_smaller_ = true; } else if (last_bitmap_smaller_) { - pinch_center = pp::Point((plugin_size_.width() / device_scale()) / 2, - (plugin_size_.height() / device_scale()) / 2); + pinch_center = pp::Point((plugin_size().width() / device_scale()) / 2, + (plugin_size().height() / device_scale()) / 2); const double zoom_when_doc_covers_plugin_width = - zoom() * plugin_size_.width() / GetDocumentPixelWidth(); + zoom() * plugin_size().width() / GetDocumentPixelWidth(); paint_offset = gfx::Vector2d( (1 - new_zoom / zoom_when_doc_covers_plugin_width) * pinch_center.x(), (1 - zoom_ratio) * pinch_center.y()); @@ -2092,7 +2096,7 @@ } document_load_state_ = LOAD_STATE_FAILED; - paint_manager().InvalidateRect(gfx::Rect(SizeFromPPSize(plugin_size_))); + paint_manager().InvalidateRect(gfx::Rect(plugin_size())); // Send a progress value of -1 to indicate a failure. SendLoadingProgress(-1); @@ -2183,7 +2187,7 @@ if (zoom() != old_zoom || device_scale() != old_device_scale) engine()->ZoomUpdated(zoom() * device_scale()); - available_area_ = gfx::Rect(SizeFromPPSize(plugin_size_)); + available_area_ = gfx::Rect(plugin_size()); int doc_width = GetDocumentPixelWidth(); if (doc_width < available_area_.width()) { available_area_.Offset((available_area_.width() - doc_width) / 2, 0); @@ -2201,7 +2205,7 @@ if (document_size().IsEmpty()) return; - paint_manager().InvalidateRect(gfx::Rect(SizeFromPPSize(plugin_size_))); + paint_manager().InvalidateRect(gfx::Rect(plugin_size())); if (accessibility_state_ == ACCESSIBILITY_STATE_LOADED) SendAccessibilityViewportInfo(); @@ -2374,14 +2378,31 @@ pp::VarDictionary metadata_message; metadata_message.Set(pp::Var(kType), pp::Var(kJSMetadataType)); - const std::string& title = engine()->GetDocumentMetadata().title; - if (!base::TrimWhitespace(base::UTF8ToUTF16(title), base::TRIM_ALL).empty()) - metadata_message.Set(pp::Var(kJSTitle), pp::Var(title)); + const DocumentMetadata& document_metadata = engine()->GetDocumentMetadata(); + pp::VarDictionary metadata_data; - metadata_message.Set( + if (!document_metadata.title.empty()) + metadata_data.Set(pp::Var(kJSTitle), pp::Var(document_metadata.title)); + + if (!document_metadata.author.empty()) + metadata_data.Set(pp::Var(kJSAuthor), pp::Var(document_metadata.author)); + + if (!document_metadata.subject.empty()) + metadata_data.Set(pp::Var(kJSSubject), pp::Var(document_metadata.subject)); + + if (!document_metadata.creator.empty()) + metadata_data.Set(pp::Var(kJSCreator), pp::Var(document_metadata.creator)); + + if (!document_metadata.producer.empty()) { + metadata_data.Set(pp::Var(kJSProducer), + pp::Var(document_metadata.producer)); + } + + metadata_data.Set( pp::Var(kJSCanSerializeDocument), pp::Var(IsSaveDataSizeValid(engine()->GetLoadedByteSize()))); + metadata_message.Set(pp::Var(kJSMetadataData), metadata_data); PostMessage(metadata_message); } @@ -2420,11 +2441,12 @@ pp::FloatPoint OutOfProcessInstance::BoundScrollOffsetToDocument( const pp::FloatPoint& scroll_offset) { float max_x = std::max( - document_size().width() * float{zoom()} - plugin_dip_size_.width(), 0.0f); + document_size().width() * float{zoom()} - plugin_dip_size().width(), + 0.0f); float x = base::ClampToRange(scroll_offset.x(), 0.0f, max_x); float min_y = -top_toolbar_height_in_viewport_coords(); float max_y = std::max( - document_size().height() * float{zoom()} - plugin_dip_size_.height(), + document_size().height() * float{zoom()} - plugin_dip_size().height(), min_y); float y = base::ClampToRange(scroll_offset.y(), min_y, max_y); return pp::FloatPoint(x, y);
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h index d66a82a..eec17f78 100644 --- a/pdf/out_of_process_instance.h +++ b/pdf/out_of_process_instance.h
@@ -347,15 +347,9 @@ // The current cursor. PP_CursorType_Dev cursor_ = PP_CURSORTYPE_POINTER; - // Size, in pixels, of plugin rectangle. - pp::Size plugin_size_; - // Size, in DIPs, of plugin rectangle. - pp::Size plugin_dip_size_; // Remaining area, in pixels, to render the pdf in after accounting for // horizontal centering. gfx::Rect available_area_; - // Positional offset, in CSS pixels, of the plugin rectangle. - pp::Point plugin_offset_; // The scroll offset in CSS pixels. pp::Point scroll_offset_;
diff --git a/pdf/pdf_view_plugin_base.h b/pdf/pdf_view_plugin_base.h index acc8380..b7182abb 100644 --- a/pdf/pdf_view_plugin_base.h +++ b/pdf/pdf_view_plugin_base.h
@@ -91,6 +91,15 @@ const gfx::Size& document_size() const { return document_size_; } void set_document_size(const gfx::Size& size) { document_size_ = size; } + const gfx::Size& plugin_size() const { return plugin_size_; } + void set_plugin_size(const gfx::Size& size) { plugin_size_ = size; } + + const gfx::Size& plugin_dip_size() const { return plugin_dip_size_; } + void set_plugin_dip_size(const gfx::Size& size) { plugin_dip_size_ = size; } + + const gfx::Point& plugin_offset() const { return plugin_offset_; } + void set_plugin_offset(const gfx::Point& offset) { plugin_offset_ = offset; } + void SetBackgroundColor(uint32_t background_color) { background_color_ = background_color; } @@ -124,6 +133,15 @@ // high and there are 10 pages, the height will be 8000). gfx::Size document_size_; + // Size, in pixels, of plugin rectangle. + gfx::Size plugin_size_; + + // Size, in DIPs, of plugin rectangle. + gfx::Size plugin_dip_size_; + + // Positional offset, in CSS pixels, of the plugin rectangle. + gfx::Point plugin_offset_; + // The background color of the PDF viewer. uint32_t background_color_ = 0;
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index baa08e3d..3bb90f3 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -3950,19 +3950,22 @@ // Document information dictionary entries doc_metadata_.version = GetDocumentVersion(); - doc_metadata_.title = GetMetadataByField("Title"); - doc_metadata_.author = GetMetadataByField("Author"); - doc_metadata_.subject = GetMetadataByField("Subject"); - doc_metadata_.creator = GetMetadataByField("Creator"); - doc_metadata_.producer = GetMetadataByField("Producer"); + doc_metadata_.title = GetTrimmedMetadataByField("Title"); + doc_metadata_.author = GetTrimmedMetadataByField("Author"); + doc_metadata_.subject = GetTrimmedMetadataByField("Subject"); + doc_metadata_.creator = GetTrimmedMetadataByField("Creator"); + doc_metadata_.producer = GetTrimmedMetadataByField("Producer"); } -std::string PDFiumEngine::GetMetadataByField(FPDF_BYTESTRING field) const { +std::string PDFiumEngine::GetTrimmedMetadataByField( + FPDF_BYTESTRING field) const { DCHECK(doc()); - return base::UTF16ToUTF8(CallPDFiumWideStringBufferApi( + base::string16 metadata = CallPDFiumWideStringBufferApi( base::BindRepeating(&FPDF_GetMetaText, doc(), field), - /*check_expected_size=*/false)); + /*check_expected_size=*/false); + + return base::UTF16ToUTF8(base::TrimWhitespace(metadata, base::TRIM_ALL)); } PdfVersion PDFiumEngine::GetDocumentVersion() const {
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h index 39b957d..2bbdba1 100644 --- a/pdf/pdfium/pdfium_engine.h +++ b/pdf/pdfium/pdfium_engine.h
@@ -608,9 +608,9 @@ // document is loaded. void LoadDocumentMetadata(); - // Retrieves the unparsed value of |field| in the document information - // dictionary. - std::string GetMetadataByField(FPDF_BYTESTRING field) const; + // Retrieves the value of |field| in the document information dictionary. + // Trims whitespace characters from the retrieved value. + std::string GetTrimmedMetadataByField(FPDF_BYTESTRING field) const; // Retrieves the version of the PDF (e.g. 1.4 or 2.0) as an enum. PdfVersion GetDocumentVersion() const;
diff --git a/pdf/test/data/document_info.in b/pdf/test/data/document_info.in index e058b2c4..061890a8 100644 --- a/pdf/test/data/document_info.in +++ b/pdf/test/data/document_info.in
@@ -18,13 +18,13 @@ endobj {{object 4 0}} << /Author (Chromium Authors) - /CreationDate (D:20200205153912+00'00') + /CreationDate (D:20200205153912+00'00' ) /Creator (Your Preferred Text Editor) /Keywords (testing,chromium,pdfium,document,info) /ModDate (D:20200206094234+00'00') /Producer (fixup_pdf_template.py) /Subject (Testing) - /Title (Sample PDF Document Info) + /Title ( Sample PDF Document Info ) >> endobj {{xref}}
diff --git a/pdf/test/data/document_info.pdf b/pdf/test/data/document_info.pdf index db5918f..48e0c98 100644 --- a/pdf/test/data/document_info.pdf +++ b/pdf/test/data/document_info.pdf
@@ -19,13 +19,13 @@ endobj 4 0 obj << /Author (Chromium Authors) - /CreationDate (D:20200205153912+00'00') + /CreationDate (D:20200205153912+00'00' ) /Creator (Your Preferred Text Editor) /Keywords (testing,chromium,pdfium,document,info) /ModDate (D:20200206094234+00'00') /Producer (fixup_pdf_template.py) /Subject (Testing) - /Title (Sample PDF Document Info) + /Title ( Sample PDF Document Info ) >> endobj xref @@ -41,5 +41,5 @@ /Size 5 >> startxref -526 +533 %%EOF
diff --git a/remoting/host/audio_capturer_mac.cc b/remoting/host/audio_capturer_mac.cc index 48b4894..b2f688d 100644 --- a/remoting/host/audio_capturer_mac.cc +++ b/remoting/host/audio_capturer_mac.cc
@@ -33,6 +33,7 @@ constexpr float kBufferTimeDurationSec = 0.01f; // 10ms constexpr size_t kBufferByteSize = kSampleRate * kBytesPerFrame * kBufferTimeDurationSec; +constexpr int kAudioSilenceThreshold = 0; // Total delay: kBufferTimeDurationSec * kNumberBuffers constexpr int kNumberBuffers = 2; @@ -94,7 +95,8 @@ } // namespace AudioCapturerMac::AudioCapturerMac(const std::string& audio_device_uid) - : audio_device_uid_(audio_device_uid) { + : audio_device_uid_(audio_device_uid), + silence_detector_(kAudioSilenceThreshold) { DETACH_FROM_SEQUENCE(sequence_checker_); DCHECK(!audio_device_uid.empty()); @@ -170,15 +172,17 @@ DCHECK_EQ(input_queue_, aq); DCHECK(callback_); - // TODO(yuweih): Add silence detection and drop empty packets. - - auto packet = std::make_unique<AudioPacket>(); - packet->add_data(buffer->mAudioData, buffer->mAudioDataByteSize); - packet->set_encoding(AudioPacket::ENCODING_RAW); - packet->set_sampling_rate(kSampleRate); - packet->set_bytes_per_sample(AudioPacket::BYTES_PER_SAMPLE_2); - packet->set_channels(AudioPacket::CHANNELS_STEREO); - callback_.Run(std::move(packet)); + if (!silence_detector_.IsSilence( + reinterpret_cast<const int16_t*>(buffer->mAudioData), + buffer->mAudioDataByteSize / sizeof(int16_t) / kChannelsPerFrame)) { + auto packet = std::make_unique<AudioPacket>(); + packet->add_data(buffer->mAudioData, buffer->mAudioDataByteSize); + packet->set_encoding(AudioPacket::ENCODING_RAW); + packet->set_sampling_rate(kSampleRate); + packet->set_bytes_per_sample(AudioPacket::BYTES_PER_SAMPLE_2); + packet->set_channels(AudioPacket::CHANNELS_STEREO); + callback_.Run(std::move(packet)); + } // Recycle the buffer. // Only the first 2 params are needed for recording. @@ -242,6 +246,8 @@ } is_started_ = true; + silence_detector_.Reset(kSampleRate, kChannelsPerFrame); + return true; }
diff --git a/remoting/host/audio_capturer_mac.h b/remoting/host/audio_capturer_mac.h index a875e984..27e9b9f 100644 --- a/remoting/host/audio_capturer_mac.h +++ b/remoting/host/audio_capturer_mac.h
@@ -15,6 +15,7 @@ #include "base/sequence_checker.h" #include "base/sequenced_task_runner.h" #include "remoting/host/audio_capturer.h" +#include "remoting/host/audio_silence_detector.h" namespace remoting { @@ -57,6 +58,7 @@ std::string audio_device_uid_; AudioStreamBasicDescription stream_description_; + AudioSilenceDetector silence_detector_; PacketCapturedCallback callback_; AudioQueueRef input_queue_ = nullptr; bool is_started_ = false;
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb index 31da413..b994ec08 100644 --- a/remoting/resources/remoting_strings_am.xtb +++ b/remoting/resources/remoting_strings_am.xtb
@@ -24,6 +24,7 @@ «<ph name="SERVICE_SCRIPT_NAME" />» አስቀድሞ ምልክት ከተደረገበት ምልክቱን ያንሱትና እንደገና ምልክት ያድርጉበት።</translation> <translation id="225614027745146050">እንኳን ደህና መጡ</translation> <translation id="2320166752086256636">የቁልፍ ሰሌዳን ደብቅ</translation> +<translation id="2333212046079545895">የቅጂ መብት 2021 Google LLC.። ሁሉም መብቶች የተጠበቁ ናቸው።</translation> <translation id="2359808026110333948">ቀጥል</translation> <translation id="2366718077645204424">አስተናጋጁን መድረስ አልተቻለም። ይሄ በሚጠቀሙት አውታረ መረብ ላይ ባለ ውቅር ምክንያት ሳይሆን አይቀርም።</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> ለመጨረሻ ጊዜ መስመር ላይ የታየው በ<ph name="RELATIVE_TIMESTAMP" />።</translation>
diff --git a/remoting/resources/remoting_strings_be.xtb b/remoting/resources/remoting_strings_be.xtb index 73d0da5f..d1ce9eb 100644 --- a/remoting/resources/remoting_strings_be.xtb +++ b/remoting/resources/remoting_strings_be.xtb
@@ -24,6 +24,7 @@ Калі птушка побач з параметрам "<ph name="SERVICE_SCRIPT_NAME" />" была ўжо пастаўлена, зніміце яе і пастаўце зноў.</translation> <translation id="225614027745146050">Вітаем</translation> <translation id="2320166752086256636">Схаваць клавіятуру</translation> +<translation id="2333212046079545895">Аўтарскае права належыць Google LLC, 2021. Усе правы абаронены.</translation> <translation id="2359808026110333948">Працягнуць</translation> <translation id="2366718077645204424">Не ўдалося звязацца з хостам. Магчыма, праблема з канфігурацыяй сеткі, якой вы карыстаецеся.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Апошні выхад у інтэрнэт: <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_bn.xtb b/remoting/resources/remoting_strings_bn.xtb index 06a8ad0..36969a5 100644 --- a/remoting/resources/remoting_strings_bn.xtb +++ b/remoting/resources/remoting_strings_bn.xtb
@@ -24,6 +24,7 @@ '<ph name="SERVICE_SCRIPT_NAME" />' বিকল্পে আগে থেকেই টিক চিহ্ন দেওয়া থাকলে, সেটি সরিয়ে আবার টিক দিন।</translation> <translation id="225614027745146050">স্বাগতম</translation> <translation id="2320166752086256636">কীবোর্ড লুকান</translation> +<translation id="2333212046079545895">কপিরাইট ২০২১ Google LLC. সর্বস্বত্ব সংরক্ষিত।</translation> <translation id="2359808026110333948">চালিয়ে যান</translation> <translation id="2366718077645204424">হোস্টে পৌঁছাতে পারেনি৷ আপনার ব্যবহার করা নেটওয়ার্কের কনফিগারেশনের কারণে সম্ভবত এটি হয়েছে৷</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> অনলাইনে সর্বশেষ <ph name="RELATIVE_TIMESTAMP" /> দেখা গেছে।</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb index 6b25ad2..185937c 100644 --- a/remoting/resources/remoting_strings_ca.xtb +++ b/remoting/resources/remoting_strings_ca.xtb
@@ -24,6 +24,7 @@ Si la casella <ph name="SERVICE_SCRIPT_NAME" /> ja està marcada, desmarca-la i torna-la a marcar.</translation> <translation id="225614027745146050">Et donem la benvinguda</translation> <translation id="2320166752086256636">Amaga el teclat</translation> +<translation id="2333212046079545895">Copyright 2021 Google LLC. Tots els drets reservats.</translation> <translation id="2359808026110333948">Continua</translation> <translation id="2366718077645204424">No es pot connectar amb l'amfitrió. Probablement, això passa a causa de la configuració de la xarxa que esteu fent servir.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> L'última connexió va ser <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_cs.xtb b/remoting/resources/remoting_strings_cs.xtb index 1226a49..4b7c0c9 100644 --- a/remoting/resources/remoting_strings_cs.xtb +++ b/remoting/resources/remoting_strings_cs.xtb
@@ -24,6 +24,7 @@ Pokud je položka <ph name="SERVICE_SCRIPT_NAME" /> již zaškrtnutá, zrušte její zaškrtnutí a poté ji zaškrtněte znovu.</translation> <translation id="225614027745146050">Vítejte</translation> <translation id="2320166752086256636">Skrýt klávesnici</translation> +<translation id="2333212046079545895">Copyright 2021 Google LLC. Všechna práva vyhrazena.</translation> <translation id="2359808026110333948">Pokračovat</translation> <translation id="2366718077645204424">Hostitele nelze nalézt. Pravděpodobnou příčinou je aktuální konfigurace sítě.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Naposledy online: <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_eu.xtb b/remoting/resources/remoting_strings_eu.xtb index 034e5c45..73cee8b7 100644 --- a/remoting/resources/remoting_strings_eu.xtb +++ b/remoting/resources/remoting_strings_eu.xtb
@@ -24,6 +24,7 @@ "<ph name="SERVICE_SCRIPT_NAME" />" dagoeneko markatuta badago, desmarkatu, eta marka ezazu berriro.</translation> <translation id="225614027745146050">Ongi etorri</translation> <translation id="2320166752086256636">Ezkutatu teklatua</translation> +<translation id="2333212046079545895">Copyright 2021 Google LLC. Eskubide guztiak erreserbatuta.</translation> <translation id="2359808026110333948">Jarraitu</translation> <translation id="2366718077645204424">Ezin da ostalariarekin konektatu. Agian erabiltzen ari zaren sarearen konfigurazioarengatik izan daiteke.zoo</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Azken konexio-data <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_fa.xtb b/remoting/resources/remoting_strings_fa.xtb index 312c69b..2c4a2751 100644 --- a/remoting/resources/remoting_strings_fa.xtb +++ b/remoting/resources/remoting_strings_fa.xtb
@@ -24,6 +24,7 @@ اگر «<ph name="SERVICE_SCRIPT_NAME" />» قبلاً علامت زده شده است، علامت آن را بردارید و دوباره علامت بزنید.</translation> <translation id="225614027745146050">خوش آمدید</translation> <translation id="2320166752086256636">پنهان کردن صفحهکلید</translation> +<translation id="2333212046079545895">حق نسخهبرداری ۲۰۲۱ Google LLC. کلیه حقوق محفوظ است.</translation> <translation id="2359808026110333948">ادامه</translation> <translation id="2366718077645204424">دسترسی به میزبان امکانپذیر نیست. این احتمالاً به دلیل پیکربندی شبکهای است که استفاده میکنید.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> آخرین حضور آنلاین <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb index 1f3065f..530ce15 100644 --- a/remoting/resources/remoting_strings_fi.xtb +++ b/remoting/resources/remoting_strings_fi.xtb
@@ -24,6 +24,7 @@ Jos <ph name="SERVICE_SCRIPT_NAME" /> on jo valittuna, poista valinta ja valitse se uudelleen.</translation> <translation id="225614027745146050">Tervetuloa</translation> <translation id="2320166752086256636">Piilota näppäimistö</translation> +<translation id="2333212046079545895">Copyright 2021 Google LLC. Kaikki oikeudet pidätetään.</translation> <translation id="2359808026110333948">Jatka</translation> <translation id="2366718077645204424">Isäntään ei saatu yhteyttä. Tämä johtuu luultavasti käyttämäsi verkon määrityksistä.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Havaittiin verkossa viimeksi <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_fr-CA.xtb b/remoting/resources/remoting_strings_fr-CA.xtb index eaa6c19a..252ee3f 100644 --- a/remoting/resources/remoting_strings_fr-CA.xtb +++ b/remoting/resources/remoting_strings_fr-CA.xtb
@@ -24,6 +24,7 @@ Si l'option « <ph name="SERVICE_SCRIPT_NAME" /> » est déjà cochée, décochez-la, puis cochez-la de nouveau.</translation> <translation id="225614027745146050">Bienvenue</translation> <translation id="2320166752086256636">Masquer le clavier</translation> +<translation id="2333212046079545895">Droits d'auteur 2021 Google LLC. Tous droits réservés.</translation> <translation id="2359808026110333948">Continuer</translation> <translation id="2366718077645204424">Impossible d'accéder à l'hôte, probablement en raison de la configuration réseau que vous utilisez.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Dernière connexion <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_gl.xtb b/remoting/resources/remoting_strings_gl.xtb index 3ec455b..654d086 100644 --- a/remoting/resources/remoting_strings_gl.xtb +++ b/remoting/resources/remoting_strings_gl.xtb
@@ -24,6 +24,7 @@ Se a caixa que hai a carón de <ph name="SERVICE_SCRIPT_NAME" /> xa está seleccionada, desmárcaa e márcaa de novo.</translation> <translation id="225614027745146050">Dámosche a benvida</translation> <translation id="2320166752086256636">Ocultar teclado</translation> +<translation id="2333212046079545895">Copyright 2021 Google LLC. Reservados todos os dereitos.</translation> <translation id="2359808026110333948">Continuar</translation> <translation id="2366718077645204424">Non se pode conectar co host. A causa é probablemente á configuración da rede que estás usando.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Última conexión en liña <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_hy.xtb b/remoting/resources/remoting_strings_hy.xtb index 4d0eb1f..00e6fbd 100644 --- a/remoting/resources/remoting_strings_hy.xtb +++ b/remoting/resources/remoting_strings_hy.xtb
@@ -24,6 +24,7 @@ Եթե «<ph name="SERVICE_SCRIPT_NAME" />» պարամետրն արդեն նշված է, ապանշեք ու նորից նշեք այն։</translation> <translation id="225614027745146050">Ողջույն</translation> <translation id="2320166752086256636">Թաքցնել ստեղնաշարը</translation> +<translation id="2333212046079545895">© 2021 Google LLC։ Բոլոր իրավունքները պահպանված են։</translation> <translation id="2359808026110333948">Շարունակել</translation> <translation id="2366718077645204424">Հնարավոր չէ կապ հաստատել խնամորդի հետ: Հավանաբար, սա ձեր ցանցի կազմաձևումների պատճառով է:</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Վերջին անգամ առցանց է եղել <ph name="RELATIVE_TIMESTAMP" />:</translation>
diff --git a/remoting/resources/remoting_strings_lt.xtb b/remoting/resources/remoting_strings_lt.xtb index d35533b5..f3bbc6b 100644 --- a/remoting/resources/remoting_strings_lt.xtb +++ b/remoting/resources/remoting_strings_lt.xtb
@@ -24,6 +24,7 @@ Jei parinktis „<ph name="SERVICE_SCRIPT_NAME" />“ jau pažymėta, atžymėkite ją ir pažymėkite iš naujo.</translation> <translation id="225614027745146050">Sveiki</translation> <translation id="2320166752086256636">Slėpti klaviatūrą</translation> +<translation id="2333212046079545895">Autorių teisės „Google LLC“, 2021 m. Visos teisės saugomos.</translation> <translation id="2359808026110333948">Tęskite</translation> <translation id="2366718077645204424">Neįmanoma pasiekti prieglobos. Taip greičiausiai nutiko dėl naudojamo tinklo konfigūracijos.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Paskutinį kartą matyta prisijungus <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_mk.xtb b/remoting/resources/remoting_strings_mk.xtb index 41d2d1c..6518d6b 100644 --- a/remoting/resources/remoting_strings_mk.xtb +++ b/remoting/resources/remoting_strings_mk.xtb
@@ -24,6 +24,7 @@ Ако „<ph name="SERVICE_SCRIPT_NAME" />“ е веќе избрано, поништете го изборот и повторно изберете го.</translation> <translation id="225614027745146050">Добре дојдовте</translation> <translation id="2320166752086256636">Сoкриј ја тастатурата</translation> +<translation id="2333212046079545895">Авторски права за 2021 г. на Google LLC. Сите права се задржани.</translation> <translation id="2359808026110333948">Продолжи</translation> <translation id="2366718077645204424">Не може да се добие домаќинот. Тоа е веројатно поради конфигурацијата на мрежата што ја користите.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Последен пат онлајн <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb index 7ca100e..417ed3df 100644 --- a/remoting/resources/remoting_strings_ml.xtb +++ b/remoting/resources/remoting_strings_ml.xtb
@@ -24,6 +24,7 @@ '<ph name="SERVICE_SCRIPT_NAME" />' എന്നതിൽ മുമ്പേ ചെക്ക്മാർക്ക് ഇട്ടിട്ടുണ്ടെങ്കിൽ, അത് അൺചെക്ക് ചെയ്ത ശേഷം വീണ്ടും ചെക്ക് മാർക്കിടുക.</translation> <translation id="225614027745146050">സ്വാഗതം</translation> <translation id="2320166752086256636">കീബോർഡ് മറയ്ക്കുക</translation> +<translation id="2333212046079545895">പകർപ്പവകാശം 2021 Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</translation> <translation id="2359808026110333948">തുടരുക</translation> <translation id="2366718077645204424">ഹോസ്റ്റിൽ എത്തിച്ചേരാനായില്ല. ഇത് നിങ്ങൾ ഉപയോഗിക്കുന്ന നെറ്റ്വർക്കിന്റെ കോൺഫിഗറേഷൻ കാരണമാകാം.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> അവസാനമായി ഓൺലൈനിൽ കണ്ടത് <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb index 5011857..44a43fc 100644 --- a/remoting/resources/remoting_strings_ro.xtb +++ b/remoting/resources/remoting_strings_ro.xtb
@@ -24,6 +24,7 @@ Dacă opțiunea „<ph name="SERVICE_SCRIPT_NAME" />” este deja bifată, debifeaz-o și bifeaz-o din nou.</translation> <translation id="225614027745146050">Bun venit</translation> <translation id="2320166752086256636">Ascunde tastatura</translation> +<translation id="2333212046079545895">Drept de autor 2021 Google LLC. Toate drepturile rezervate.</translation> <translation id="2359808026110333948">Continuă</translation> <translation id="2366718077645204424">Gazda nu poate fi accesată. Acest lucru este cauzat, probabil, de configurația rețelei pe care o utilizați.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Ultima dată online <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_si.xtb b/remoting/resources/remoting_strings_si.xtb index 06db24a..98ef3d9d 100644 --- a/remoting/resources/remoting_strings_si.xtb +++ b/remoting/resources/remoting_strings_si.xtb
@@ -24,6 +24,7 @@ '<ph name="SERVICE_SCRIPT_NAME" />' දැනටමත් ලකුණු කර තිබේ නම්, එය ලකුණු නොකර නැවත ලකුණු කරන්න.</translation> <translation id="225614027745146050">ආයුබෝවන්</translation> <translation id="2320166752086256636">යතුරු පුවරුව සඟවන්න</translation> +<translation id="2333212046079545895">ප්රකාශන හිමිකම 2020 Google LLC. සියලු හිමිකම් ඇවිරිණි.</translation> <translation id="2359808026110333948">කරගෙන යන්න</translation> <translation id="2366718077645204424">අනුග්රාහක වෙත ළඟා විය නොහැකි විය. මීට හේතු විය හැක්කේ ඔබ භාවිතා කරන ජාලයේ වින්යාසකරණය වේ.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> අවසන් වරට සබැඳිව දැක්කේ <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_sk.xtb b/remoting/resources/remoting_strings_sk.xtb index d01faf2a..1696db4 100644 --- a/remoting/resources/remoting_strings_sk.xtb +++ b/remoting/resources/remoting_strings_sk.xtb
@@ -24,6 +24,7 @@ Ak je políčko <ph name="SERVICE_SCRIPT_NAME" /> už začiarknuté, začiarknutie zrušte a potom ho znova začiarknite.</translation> <translation id="225614027745146050">Vitajte</translation> <translation id="2320166752086256636">Skryť klávesnicu</translation> +<translation id="2333212046079545895">Copyright 2021 Google LLC. Všetky práva vyhradené.</translation> <translation id="2359808026110333948">Pokračovať</translation> <translation id="2366718077645204424">Hostiteľa sa nepodarilo nájsť. Pravdepodobne je to spôsobené konfiguráciou siete, ktorú používate.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Naposledy bol(a) online <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/remoting/resources/remoting_strings_sq.xtb b/remoting/resources/remoting_strings_sq.xtb index 5b910e0..d1307eb 100644 --- a/remoting/resources/remoting_strings_sq.xtb +++ b/remoting/resources/remoting_strings_sq.xtb
@@ -24,6 +24,7 @@ Nëse "<ph name="SERVICE_SCRIPT_NAME" />" është e zgjedhur tashmë, anulo zgjedhjen e saj dhe më pas zgjidhe përsëri.</translation> <translation id="225614027745146050">Mirë se erdhe</translation> <translation id="2320166752086256636">Fshih tastierën</translation> +<translation id="2333212046079545895">Të drejtat e autorit 2021 Google LLC. Të gjitha të drejtat të rezervuara.</translation> <translation id="2359808026110333948">Vazhdo</translation> <translation id="2366718077645204424">Strehuesi nuk mund të arrihet. Kjo ndodh ndoshta për shkak të konfigurimit të rrjetit që po përdor.</translation> <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" /> Parë për herë të fundit në linjë <ph name="RELATIVE_TIMESTAMP" />.</translation>
diff --git a/services/network/origin_policy/origin_policy_parser.cc b/services/network/origin_policy/origin_policy_parser.cc index b52f32a0..291ead6 100644 --- a/services/network/origin_policy/origin_policy_parser.cc +++ b/services/network/origin_policy/origin_policy_parser.cc
@@ -45,14 +45,6 @@ if (base::Value* features = json->FindDictKey("features")) { ParseFeatures(*features); } - - if (base::Value* isolation = - json->FindKeyOfType("isolation", base::Value::Type::BOOLEAN)) { - if (isolation->GetBool()) - policy_contents_->isolation_optin_hints = IsolationOptInHints::NO_HINTS; - } else if (base::Value* isolation = json->FindDictKey("isolation")) { - ParseIsolation(*isolation); - } } bool OriginPolicyParser::ParseIds(const base::Value& json) { @@ -104,25 +96,6 @@ } } -// The parsing is based on the example at -// https://github.com/domenic/origin-isolation#example. -void OriginPolicyParser::ParseIsolation(const base::Value& policy) { - IsolationOptInHints hints = IsolationOptInHints::NO_HINTS; - for (const auto& key_value : policy.DictItems()) { - // If we hit a key with a non-boolean value, skip it. - if (!key_value.second.is_bool()) - continue; - if (key_value.second.GetBool()) { - IsolationOptInHints dict_hint = - GetIsolationOptInHintFromString(key_value.first); - // If we hit a key we don't recognise, it will just return NO_HINTS and - // have no effect. - hints |= dict_hint; - } - } - policy_contents_->isolation_optin_hints = hints; -} - // https://wicg.github.io/origin-policy/#valid-origin-policy-id bool OriginPolicyParser::IsValidOriginPolicyId(const std::string& id) { return !id.empty() && std::none_of(id.begin(), id.end(), [](char ch) {
diff --git a/services/network/origin_policy/origin_policy_parser.h b/services/network/origin_policy/origin_policy_parser.h index 6aa027b..5d5a326 100644 --- a/services/network/origin_policy/origin_policy_parser.h +++ b/services/network/origin_policy/origin_policy_parser.h
@@ -38,7 +38,6 @@ bool ParseIds(const base::Value&); void ParseContentSecurity(const base::Value&); void ParseFeatures(const base::Value&); - void ParseIsolation(const base::Value&); static bool IsValidOriginPolicyId(const std::string&);
diff --git a/services/network/origin_policy/origin_policy_parser_unittest.cc b/services/network/origin_policy/origin_policy_parser_unittest.cc index a9284a2..a92c217 100644 --- a/services/network/origin_policy/origin_policy_parser_unittest.cc +++ b/services/network/origin_policy/origin_policy_parser_unittest.cc
@@ -19,7 +19,6 @@ void AssertEmptyPolicy( const network::OriginPolicyContentsPtr& policy_contents) { ASSERT_FALSE(policy_contents->feature_policy.has_value()); - ASSERT_FALSE(policy_contents->isolation_optin_hints.has_value()); ASSERT_EQ(0u, policy_contents->ids.size()); ASSERT_EQ(0u, policy_contents->content_security_policies.size()); ASSERT_EQ(0u, policy_contents->content_security_policies_report_only.size()); @@ -547,108 +546,4 @@ ASSERT_FALSE(policy_contents->feature_policy.has_value()); } -namespace { - -void TestHintsHelper(const std::vector<std::string>& target_hints) { - std::string hints_substr; - for (auto hint_str : target_hints) { - hints_substr += base::StringPrintf("%s\"%s\": true", - (!hints_substr.empty() ? ", " : ""), - hint_str.c_str()); - } - std::string manifest_string = - base::StringPrintf("{ \"ids\": [\"my-policy\"], \"isolation\": { %s }}", - hints_substr.c_str()); - auto policy_contents = OriginPolicyParser::Parse(manifest_string); - - ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); - for (auto target_hint_str : target_hints) { - IsolationOptInHints target_hint = - GetIsolationOptInHintFromString(target_hint_str); - EXPECT_EQ(target_hint, - target_hint & policy_contents->isolation_optin_hints.value()); - } -} - -} // namespace - -TEST(OriginPolicyParser, IsolationOptInNoIsolationKey) { - auto policy_contents = - OriginPolicyParser::Parse(R"({ "ids": ["my-policy"] })"); - ASSERT_FALSE(policy_contents->isolation_optin_hints.has_value()); -} - -TEST(OriginPolicyParser, IsolationOptInNoDictTrue) { - auto policy_contents = OriginPolicyParser::Parse(R"({ - "ids": ["my-policy"], - "isolation": true - })"); - ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); - EXPECT_EQ(IsolationOptInHints::NO_HINTS, - policy_contents->isolation_optin_hints.value()); -} - -TEST(OriginPolicyParser, IsolationOptInNoDictFalse) { - auto policy_contents = OriginPolicyParser::Parse(R"({ - "ids": ["my-policy"], - "isolation": false - })"); - - ASSERT_FALSE(OriginPolicyParser::Parse(R"({ "isolation": false })") - ->isolation_optin_hints.has_value()); -} - -TEST(OriginPolicyParser, IsolationOptInEmptyDict) { - TestHintsHelper({}); -} - -TEST(OriginPolicyParser, IsolationOptInTestOneHint) { - TestHintsHelper({"prefer_isolated_event_loop"}); - TestHintsHelper({"prefer_isolated_memory"}); - TestHintsHelper({"for_side_channel_protection"}); - TestHintsHelper({"for_memory_measurement"}); -} - -TEST(OriginPolicyParser, IsolationOptInTestTwoHints) { - TestHintsHelper({"prefer_isolated_event_loop", "prefer_isolated_memory"}); - TestHintsHelper( - {"prefer_isolated_event_loop", "for_side_channel_protection"}); - TestHintsHelper({"prefer_isolated_event_loop", "for_memory_measurement"}); - TestHintsHelper({"prefer_isolated_memory", "for_side_channel_protection"}); - TestHintsHelper({"prefer_isolated_memory", "for_memory_measurement"}); - TestHintsHelper({"for_side_channel_protection", "for_memory_measurement"}); -} - -TEST(OriginPolicyParser, IsolationOptInTestThreeHints) { - TestHintsHelper({"prefer_isolated_event_loop", "prefer_isolated_memory", - "for_side_channel_protection"}); -} - -TEST(OriginPolicyParser, IsolationOptInIgnoreUnrecognisedKeys) { - std::string manifest_string = R"( { - "ids": ["my-policy"], - "isolation": { - "prefer_isolated_event_loop": true, - "foo": true - } - } )"; - auto policy_contents = OriginPolicyParser::Parse(manifest_string); - ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); - EXPECT_EQ(IsolationOptInHints::PREFER_ISOLATED_EVENT_LOOP, - policy_contents->isolation_optin_hints.value()); -} - -TEST(OriginPolicyParser, IsolationOptInIgnoreFalseValues) { - std::string manifest_string = R"( { - "ids": ["my-policy"], - "isolation": { - "prefer_isolated_event_loop": false - } - } )"; - auto policy_contents = OriginPolicyParser::Parse(manifest_string); - ASSERT_TRUE(policy_contents->isolation_optin_hints.has_value()); - EXPECT_EQ(IsolationOptInHints::NO_HINTS, - policy_contents->isolation_optin_hints.value()); -} - } // namespace network
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc index ea0388a..d177c05 100644 --- a/services/network/public/cpp/features.cc +++ b/services/network/public/cpp/features.cc
@@ -202,6 +202,9 @@ // Determines whether Trust Tokens issuance requests should be diverted, at the // corresponding issuers' request, to the operating system instead of sent // to the issuers' servers. +// +// WARNING: If you rename this param, you must update the corresponding flag +// entry in about_flags.cc. const base::FeatureParam<bool> kPlatformProvidedTrustTokenIssuance{ &kTrustTokens, "PlatformProvidedTrustTokenIssuance", false};
diff --git a/services/network/public/cpp/network_ipc_param_traits.h b/services/network/public/cpp/network_ipc_param_traits.h index a898d3f..f287d83b6 100644 --- a/services/network/public/cpp/network_ipc_param_traits.h +++ b/services/network/public/cpp/network_ipc_param_traits.h
@@ -140,7 +140,6 @@ IPC_STRUCT_TRAITS_MEMBER(feature_policy) IPC_STRUCT_TRAITS_MEMBER(content_security_policies) IPC_STRUCT_TRAITS_MEMBER(content_security_policies_report_only) - IPC_STRUCT_TRAITS_MEMBER(isolation_optin_hints) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(network::OriginPolicy)
diff --git a/services/network/public/cpp/origin_policy.cc b/services/network/public/cpp/origin_policy.cc index 4ecc285..e1d3d831 100644 --- a/services/network/public/cpp/origin_policy.cc +++ b/services/network/public/cpp/origin_policy.cc
@@ -26,14 +26,12 @@ const std::vector<std::string>& ids, const base::Optional<std::string>& feature_policy, const std::vector<std::string>& content_security_policies, - const std::vector<std::string>& content_security_policies_report_only, - const base::Optional<IsolationOptInHints>& isolation_optin_hints) + const std::vector<std::string>& content_security_policies_report_only) : ids(ids), feature_policy(feature_policy), content_security_policies(content_security_policies), content_security_policies_report_only( - content_security_policies_report_only), - isolation_optin_hints(isolation_optin_hints) {} + content_security_policies_report_only) {} OriginPolicyContents& OriginPolicyContents::operator=( const OriginPolicyContents& other) = default; @@ -42,8 +40,7 @@ return ids == other.ids && feature_policy == other.feature_policy && content_security_policies == other.content_security_policies && content_security_policies_report_only == - other.content_security_policies_report_only && - isolation_optin_hints == other.isolation_optin_hints; + other.content_security_policies_report_only; } OriginPolicyContentsPtr OriginPolicyContents::ClonePtr() {
diff --git a/services/network/public/cpp/origin_policy.h b/services/network/public/cpp/origin_policy.h index bb4cec8..6bec8d2a 100644 --- a/services/network/public/cpp/origin_policy.h +++ b/services/network/public/cpp/origin_policy.h
@@ -50,8 +50,7 @@ const std::vector<std::string>& ids, const base::Optional<std::string>& feature_policy, const std::vector<std::string>& content_security_policies, - const std::vector<std::string>& content_security_policies_report_only, - const base::Optional<IsolationOptInHints>& isolation_optin_hints); + const std::vector<std::string>& content_security_policies_report_only); OriginPolicyContents(const OriginPolicyContents& other); OriginPolicyContents& operator=(const OriginPolicyContents& other); @@ -92,11 +91,6 @@ // a "report" disposition. // https://w3c.github.io/webappsec-csp/#policy-disposition std::vector<std::string> content_security_policies_report_only; - - // This field, if present, indicates that the origin is opting in to - // origin-based isolation. The int contains zero or more flag bits indicating - // what the origin is hoping to achieve through isolation. - base::Optional<IsolationOptInHints> isolation_optin_hints; }; // Native implementation of mojom::OriginPolicy. This is done so we can pass
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 38b713d..18b0327 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -240,11 +240,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -254,7 +254,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -317,11 +317,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -331,7 +331,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -394,11 +394,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -408,7 +408,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -471,11 +471,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -485,7 +485,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -769,11 +769,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -783,7 +783,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -846,11 +846,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -860,7 +860,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -923,11 +923,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -937,7 +937,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1000,11 +1000,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -1014,7 +1014,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1298,11 +1298,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -1312,7 +1312,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1375,11 +1375,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -1389,7 +1389,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1452,11 +1452,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -1466,7 +1466,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1529,11 +1529,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -1543,7 +1543,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1827,11 +1827,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -1841,7 +1841,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1904,11 +1904,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -1918,7 +1918,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1981,11 +1981,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.143", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.145", "resultdb": { "enable": true }, @@ -1995,7 +1995,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.143" + "revision": "version:87.0.4280.145" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -2058,11 +2058,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.79", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.82", "resultdb": { "enable": true }, @@ -2072,7 +2072,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.79" + "revision": "version:88.0.4324.82" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 4ffa6340..2c3bc48 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -41673,6 +41673,116 @@ "--gs-results-bucket=chromium-result-details", "--recover-devices" ], + "experiment_percentage": 100, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_smoke_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_smoke_test", + "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--git-revision=${got_revision}", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter" + ], + "experiment_percentage": 50, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chrome-gold@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test": "chrome_public_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], "merge": { "args": [ "--bucket", @@ -41974,6 +42084,57 @@ "--gs-results-bucket=chromium-result-details", "--recover-devices" ], + "experiment_percentage": 100, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_unittests", + "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], "merge": { "args": [ "--bucket", @@ -42075,6 +42236,57 @@ }, "test": "webview_instrumentation_test_apk", "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" + }, + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "experiment_percentage": 100, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_ui_test_app_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "webview_ui_test_app_test_apk", + "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" } ] },
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json index ff10f32d..669f27e5 100644 --- a/testing/buildbot/chromium.angle.json +++ b/testing/buildbot/chromium.angle.json
@@ -858,6 +858,115 @@ "angle_unittests" ] }, + "ios-angle-builder": {}, + "ios-angle-intel": { + "gtest_tests": [ + { + "args": [ + "angle_end2end_tests", + "--gtest_filter=-*Vulkan_SwiftShader*", + "--platform", + "iPhone X", + "--version", + "14.0", + "--bot-mode", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12a7209", + "--xctest" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "angle_end2end_tests_iPhone X 14.0", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a" + } + ], + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12a7209", + "path": "Xcode.app" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "angle_end2end_tests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_end2end_tests/", + "use_isolated_scripts_api": true + }, + { + "args": [ + "angle_white_box_tests", + "--platform", + "iPhone X", + "--version", + "14.0", + "--bot-mode", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "12a7209", + "--xctest" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "angle_white_box_tests_iPhone X 14.0", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a" + } + ], + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:0a2e", + "os": "Mac-10.15.5" + } + ], + "named_caches": [ + { + "name": "xcode_ios_12a7209", + "path": "Xcode.app" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "angle_white_box_tests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_white_box_tests/", + "use_isolated_scripts_api": true + } + ] + }, "linux-angle-builder": {}, "linux-angle-chromium-builder": {}, "linux-angle-chromium-intel": { @@ -1031,43 +1140,6 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl2_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "8086:5912-19.0.2", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], @@ -1096,42 +1168,6 @@ "shards": 2 }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "8086:5912-19.0.2", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" } ] }, @@ -1306,43 +1342,6 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl2_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], @@ -1371,42 +1370,6 @@ "shards": 2 }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" } ] }, @@ -2617,7 +2580,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--webgl-conformance-version=2.0.1", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" ], @@ -2626,7 +2589,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl2_conformance_tests", + "name": "webgl2_conformance_gl_passthrough_tests", "resultdb": { "enable": true }, @@ -2765,7 +2728,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], "isolate_name": "telemetry_gpu_integration_test", @@ -2773,7 +2736,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl_conformance_tests", + "name": "webgl_conformance_validating_tests", "resultdb": { "enable": true }, @@ -2893,7 +2856,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--webgl-conformance-version=2.0.1", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" ], @@ -2902,7 +2865,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl2_conformance_tests", + "name": "webgl2_conformance_gl_passthrough_tests", "resultdb": { "enable": true }, @@ -3033,7 +2996,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], "isolate_name": "telemetry_gpu_integration_test", @@ -3041,7 +3004,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl_conformance_tests", + "name": "webgl_conformance_validating_tests", "resultdb": { "enable": true },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 1f4778b6..9b37184 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -10588,51 +10588,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "cast_unittests", "test_id_prefix": "ninja://media/cast:cast_unittests/" }, @@ -10715,28 +10670,6 @@ "os": "Android" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -10760,27 +10693,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -10802,27 +10714,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -11159,27 +11050,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" }, @@ -11633,45 +11503,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "cast_unittests", "test_id_prefix": "ninja://media/cast:cast_unittests/" }, @@ -11742,25 +11573,6 @@ "os": "Android" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -11781,24 +11593,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -11817,24 +11611,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -12123,24 +11899,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" }, @@ -12603,51 +12361,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "cast_unittests", "test_id_prefix": "ninja://media/cast:cast_unittests/" }, @@ -12730,28 +12443,6 @@ "os": "Android" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -12775,27 +12466,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -12817,27 +12487,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -13174,27 +12823,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" }, @@ -13687,51 +13315,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "cast_unittests", "test_id_prefix": "ninja://media/cast:cast_unittests/" }, @@ -13814,28 +13397,6 @@ "os": "Android" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -13859,27 +13420,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -13901,27 +13441,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -14258,27 +13777,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "walleye", - "os": "Android" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" }, @@ -50696,27 +50194,6 @@ "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -50783,25 +50260,6 @@ "os": "Ubuntu-16.04" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -50822,24 +50280,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -50858,24 +50298,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -51164,24 +50586,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" }, @@ -51573,27 +50977,6 @@ "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -51660,25 +51043,6 @@ "os": "Ubuntu-16.04" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -51699,24 +51063,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -51735,24 +51081,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -52041,24 +51369,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "services_unittests", "test_id_prefix": "ninja://services:services_unittests/" }, @@ -57964,27 +57274,6 @@ "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58051,25 +57340,6 @@ "os": "Mac-10.15" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -58090,24 +57360,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -58126,24 +57378,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -58432,24 +57666,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "sandbox_mac_unittests", "test_id_prefix": "ninja://sandbox/mac:sandbox_mac_unittests/" }, @@ -58860,27 +58076,6 @@ "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -58947,25 +58142,6 @@ "os": "Mac-10.15" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -58986,24 +58162,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -59022,24 +58180,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -59328,24 +58468,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-10.15" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "sandbox_mac_unittests", "test_id_prefix": "ninja://sandbox/mac:sandbox_mac_unittests/" }, @@ -59975,27 +59097,6 @@ "test_id_prefix": "ninja://chrome/browser/browser_switcher/bho:browser_switcher_bho_unittests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -60098,25 +59199,6 @@ "os": "Windows-10-18363" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -60155,24 +59237,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -60227,24 +59291,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -60601,24 +59647,6 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", "integrity": "high", "os": "Windows-10-18363" } @@ -61125,27 +60153,6 @@ "test_id_prefix": "ninja://chrome/browser/browser_switcher/bho:browser_switcher_bho_unittests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -61248,25 +60255,6 @@ "os": "Windows-10-18363" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -61305,24 +60293,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -61377,24 +60347,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -61751,24 +60703,6 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", "integrity": "high", "os": "Windows-10-18363" } @@ -62275,27 +61209,6 @@ "test_id_prefix": "ninja://chrome/browser/browser_switcher/bho:browser_switcher_bho_unittests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -62398,25 +61311,6 @@ "os": "Windows-10-18363" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -62455,24 +61349,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -62527,24 +61403,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -62901,24 +61759,6 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", "integrity": "high", "os": "Windows-10-18363" } @@ -63425,27 +62265,6 @@ "test_id_prefix": "ninja://chrome/browser/browser_switcher/bho:browser_switcher_bho_unittests/" }, { - "args": [ - "--gtest_filter=-*UsingRealWebcam*" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -63548,25 +62367,6 @@ "os": "Windows-10-18363" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "content_unittests", @@ -63605,24 +62405,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "crypto_unittests", "test_id_prefix": "ninja://crypto:crypto_unittests/" }, @@ -63677,24 +62459,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "gcm_unit_tests", "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" }, @@ -64051,24 +62815,6 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Windows-10-18363" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", "integrity": "high", "os": "Windows-10-18363" }
diff --git a/testing/buildbot/chromium.goma.fyi.json b/testing/buildbot/chromium.goma.fyi.json index 81e3447..730d138 100644 --- a/testing/buildbot/chromium.goma.fyi.json +++ b/testing/buildbot/chromium.goma.fyi.json
@@ -229,69 +229,6 @@ } ] }, - "Win7 Builder (dbg) Goma Canary": { - "additional_compile_targets": [ - "all" - ], - "gtest_tests": [ - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - } - ] - }, - "Win7 Builder Goma Canary": { - "additional_compile_targets": [ - "all", - "pdf_fuzzers" - ], - "gtest_tests": [ - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - } - ] - }, "android-archive-dbg-goma-canary": { "additional_compile_targets": [ "all",
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index bfe0aae4..53c264a 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -470,43 +470,6 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl2_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "8086:5912-19.0.2", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], @@ -535,42 +498,6 @@ "shards": 2 }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "8086:5912-19.0.2", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" } ] }, @@ -911,43 +838,6 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl2_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], @@ -976,42 +866,6 @@ "shards": 2 }, "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ - "webgl_conformance", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgl_conformance_validating_tests", - "resultdb": { - "enable": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "containment_type": "AUTO", - "dimension_sets": [ - { - "gpu": "10de:1cb3-418.56", - "os": "Ubuntu-19.04", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" } ] }, @@ -1200,7 +1054,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--webgl-conformance-version=2.0.1", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" ], @@ -1209,7 +1063,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl2_conformance_tests", + "name": "webgl2_conformance_gl_passthrough_tests", "resultdb": { "enable": true }, @@ -1340,7 +1194,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], "isolate_name": "telemetry_gpu_integration_test", @@ -1348,7 +1202,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl_conformance_tests", + "name": "webgl_conformance_validating_tests", "resultdb": { "enable": true }, @@ -1569,7 +1423,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", "--webgl-conformance-version=2.0.1", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" ], @@ -1578,7 +1432,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl2_conformance_tests", + "name": "webgl2_conformance_gl_passthrough_tests", "resultdb": { "enable": true }, @@ -1717,7 +1571,7 @@ "--browser=release", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" ], "isolate_name": "telemetry_gpu_integration_test", @@ -1725,7 +1579,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "webgl_conformance_tests", + "name": "webgl_conformance_validating_tests", "resultdb": { "enable": true },
diff --git a/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter b/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter index 7c57594..6cee29a6 100644 --- a/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter +++ b/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter
@@ -6,3 +6,8 @@ # Highly Flaky, even without Vulkan https://crbug.com/1134297 -All/DumpAccessibilityTreeTest.Accessibility* -All/ScrollBehaviorBrowserTest.OverflowScrollInterruptedByWheelScroll/1 + +# Consistent failures. https://crbug.com/1164594 +-SRC_ExternalClearKey/EncryptedMediaTest.Playback_VideoOnly_WebM_AV1_10bit/0 +-MSE_ExternalClearKey/EncryptedMediaTest.Playback_VideoOnly_WebM_AV1_10bit/0 +-MSE_ExternalClearKey/EncryptedMediaTest.Playback_VideoOnly_MP4_AV1_10bit/0 \ No newline at end of file
diff --git a/testing/buildbot/filters/lacros.browser_tests.filter b/testing/buildbot/filters/lacros.browser_tests.filter index b724e06a..db6d636 100644 --- a/testing/buildbot/filters/lacros.browser_tests.filter +++ b/testing/buildbot/filters/lacros.browser_tests.filter
@@ -1,218 +1,218 @@ -# TODO(crbug.com/1111979) Enable all tests on lacros. --AccessContextAuditBrowserTest.CheckSessionOnly --AccessContextAuditBrowserTest.PRE_RemoveRecords --AccessContextAuditBrowserTest.RemoveRecords --AdsPageLoadMetricsObserverBrowserTest.PageAdDensityIgnoreDisplayNoneFrame --AdsPageLoadMetricsObserverBrowserTest.PageAdDensityMultipleFrames --AdsPageLoadMetricsObserverBrowserTest.PageAdDensityRecordsPageMax --All/DownloadReferrerPolicyTest.SaveLinkAsReferrerPolicy* --All/HostedAppProcessModelTest.BackgroundPageWithAppCoveringDifferentSites/0 --All/HostedOrWebAppTest.CtrlClickLink/HostedApp --All/HostedOrWebAppTest.CtrlClickLink/WebApp --All/HostedOrWebAppTest.OpenLinkInNewTab* --All/IntentPickerBubbleViewBrowserTest.NavigationInAppWindowToInScopeLinkDoesNotShowIntentPicker* --All/MultiActionAPITest.PopupCreation/1 --All/MultiActionAPITest.SessionStorageDoesNotPersistBetweenOpenings/1 --All/PopupBrowserTest.MoveClampedToCurrentDisplay* --All/SystemWebAppLinkCaptureBrowserTest.IncognitoBrowserOmniboxLinkCapture* --All/SystemWebAppLinkCaptureBrowserTest.WindowOpenFromOtherSWA* --AppViewTest.KillGuestCommunicatingWithWrongAppView --AppViewTest.KillGuestWithInvalidInstanceID --AudioFocusWebContentsObserverBrowserTest.PlatformAppHasDifferentAudioFocus --AutofillProviderBrowserTest.FrameDetachedOnFormlessSubmission --AutofillProviderBrowserTestWithSkipFlagOn.InferredLabelChangeNotImpactFormComparing --AutomationApiTest.ForceLayout --AutomationManagerAuraBrowserTest.EventFromAction --AutoplayExtensionBrowserTest.AutoplayAllowedInIframe --BluetoothApiTest.* --BluetoothLowEnergyApiTest.* --BluetoothPrivateApiTest.* --BrowserActionApiTest.BrowserActionOpenPopupOnPopup --BrowserNavigatorTest.NavigateFromNoTabStripWindowToOptions --BrowserNavigatorTest.NavigateFromNTPToOptionsPageInSameTab --BrowserNavigatorTest.NavigateFromNTPToOptionsSingleton --BrowserNavigatorTest.SwitchToTabLatestWindow --BrowserTest.GetSizeForNewRenderView --BrowserTest.RestorePinnedTabs --BrowserViewTest.DevToolsUpdatesBrowserWindow --BrowserViewTest.F6CyclesThroughCaptionBubbleToo --BrowserViewTest.GetAccessibleTabModalDialogTitle --BrowserViewTest.GetAccessibleTabModalDialogTree --BrowsingDataRemoverBrowserTest.StorageRemovedFromDisk --CaptivePortalBrowserTest.SecureDnsErrorTriggersCheck --CaptivePortalBrowserTest.SlowLoadSecureDnsErrorAfterLogin --CaptivePortalBrowserTest.SlowLoadSecureDnsErrorWithCaptivePortal --ChromeSitePerProcessTest.PopupWindowFocus --ClientHintsBrowserTest.ClientHintsClearSession --ClipboardApiTest.Extension --ContentIndexTest.MetricsCollected --ContentSettingsTest.AllowCookiesForASessionUsingExceptions --ContentVerifierTest.PolicyCorrupted --ContextMenuBrowserTest.* --CrComponentsCertificateManagerV3Test.All --CrComponentsManagedFootnoteV3Test.All --CreativeOriginAdsPageLoadMetricsObserverBrowserTest.CreativeOriginStatusWithThrottlingNestedThrottled --CrSettingsAdvancedPageV3Test.Load --CrSettingsBasicPageV3Test.All --CrSettingsClearBrowsingDataV3Test.ClearBrowsingDataAllPlatforms --CrSettingsDownloadsPageV3Test.All --CrSettingsLanguagesPageV3Test.AddLanguagesDialog --CrSettingsLanguagesPageV3Test.LanguageMenu --CrSettingsLanguagesPageV3Test.Spellcheck --CrSettingsLanguagesV3Test.All --CrSettingsMainPageV3Test.MainPageV3 --CrSettingsRouteV3Test.DynamicParameters --CrSettingsRouteV3Test.NonExistentRoute --CrSettingsSiteDetailsV3Test.SiteDetails --CrSettingsSiteListEntryV3Test.All --CrSettingsSyncAccountControlV3Test.All --CustomTabBarViewBrowserTest.BackToAppButtonIsNotVisibleInOutOfScopePopups --CustomTabBarViewBrowserTest.IsNotCreatedInPopup --CustomTabBarViewBrowserTest.RightClickMenuShowsCopyUrl --DeclarativeContentApiTest.RulesPersistence --DeepScanningDialogDelegateBlockLargeFileTransferBrowserTest.Test/3 --DesktopCaptureApiTest.ChooseDesktopMedia --DiceManageAccountBrowserTest.ClearManagedProfileOnStartup --DownloadExtensionTest.DownloadExtensionTest_SearchEmptyQuery --DownloadTest.DownloadTest_History --DownloadWakeLockTest.WakeLockAcquireAndCancel --ExtensionLoadingTest.KeepAliveWithDevToolsOpenOnReload --ExtensionManagementApiBrowserTest.GetAllIncludesTerminated --ExtensionManagementApiEscalationTest.SetEnabled --ExtensionOverrideTest.SubframeNavigationInOverridenNTPDoesNotAffectFocus --ExtensionPreferenceApiTest.Standard --ExtensionsMenuViewBrowserTest.ClickingContextMenuButton --ExtensionWebRequestApiTest.WebSocketRequest --ExtensionWebRequestApiTest.WebSocketRequestAuthRequired --ExternalProtocolDialogBrowserTest.TestFocus --FeedbackTest.AnonymousUser --FeedbackTest.ExtraDiagnostics --FeedbackTest.ShowFeedback --FeedbackTest.ShowFeedbackFromAssistant --FeedbackTest.ShowLoginFeedback --FeedbackTest.SubmissionTest --FindInPageControllerTest.FindMovesOnTabClose_Issue1343052 --FindInPageControllerTest.FindMovesWhenObscuring --FolderUploadConfirmationViewTest.InitiallyFocusesCancel --GlobalErrorBubbleTest.InvokeUi_ExtensionDisabledGlobalError --GlobalErrorBubbleTest.InvokeUi_ExtensionDisabledGlobalErrorRemote --GlobalErrorBubbleTest.InvokeUi_ExternalInstallBubbleAlert --IconLoaderBrowserTest.LoadGroup --InlineLoginHelperBrowserTest.ForceSigninWithUserManager --KeepAliveDevToolsTest.KeepsAliveUntilBrowserClose --LiteVideoBrowserTest.SimplePlayback --LoadImageBrowserTest.LoadImageWithMap --LocalCardMigrationBrowserTestForNickname.CardIdentifierString/1 --MediaRouterUIBrowserTest.EphemeralToolbarIconForDialog --MediaRouterUIBrowserTest.OpenDialogFromAppMenu --MediaSessionPictureInPictureWindowControllerBrowserTest.PlayPauseButtonVisibility --MediaSessionPictureInPictureWindowControllerBrowserTest.PreviousTrackHandlerCalled --NotificationPermissionContextApiTest.Granted --NtpExtensionBubbleViewBrowserTest.InvokeUi_ntp_override --NtpExtensionBubbleViewBrowserTest.TestControlledNewTabPageMessageBubble --NtpExtensionBubbleViewBrowserTest.TestControlledNewTabPageMessageBubbleLearnMore --OmniboxPopupContentsViewTest.ClickOmnibox --OmniboxPopupContentsViewTest.PopupMatchesLocationBarBackground --OutOfProcessPPAPITest.FlashClipboard --OutOfProcessPPAPITest.NetAddress --OutOfProcessPPAPITest.Printing --OutOfProcessPPAPITest.URLRequest_CreateAndIsURLRequestInfo --PageInfoBubbleViewBrowserTest.FocusDoesNotReturnToContentsOnReloadPrompt --PageInfoBubbleViewBrowserTest.FocusReturnsToContentOnClose --PageLoadMetricsBrowserTest.MainFrameIntersectionsMainFrame --PaymentRequestCompletionStatusMetricsTest.UserAborted_TabClosed --PaymentRequestCreditCardEditorTest.EditingExpiredCard --PaymentRequestShippingAddressEditorTest.FocusFirstField_Name --PaymentRequestShippingAddressEditorTest.FocusFirstInvalidField_NotName --PDFExtensionJSTest.Bookmark/1 --PDFExtensionTestWithTestGuestViewManager* --PermissionRequestManagerWithBackForwardCacheBrowserTest.RequestsForPagesInCacheNotGrouped --PermissionsApiTest.AlwaysAllowed --PictureInPicturePixelComparisonBrowserTest.PlayAndPauseControls --PictureInPictureWindowControllerBrowserTest.* --PopupTrackerBrowserTest.PopupInWindow_IsWindowTrue --PopupTrackerBrowserTest.ShiftClick_HasTracker --PPAPINaClNewlibTest.TrueTypeFont --PPAPINaClPNaClNonSfiTest.TrueTypeFont --PresentationReceiverWindowControllerBrowserTest.CreatesWindow --PreservedWindowPlacement.Test --PrintPreviewDestinationSelectTest.ChangeIconDeprecationWarnings --PrintPreviewDestinationSelectTest.UpdateStatusDeprecationWarnings --PrintPreviewDestinationStoreTest.LoadAndSelectDestination --PrintPreviewModelSettingsAvailabilityTest.All --PrintPreviewModelTest.GetPrintTicket --PrintPreviewModelTest.SetStickySettings --PrintPreviewRestoreStateTest.SaveValues --ProfileHelperTest.OpenNewWindowForProfile --ProfileListDesktopBrowserTest.SwitchToProfile --ProfileManagerBrowserTest.EphemeralProfile --ProfileManagerBrowserTest.SwitchToProfile --RemoteCopyBrowserTest.ImageUrl --RemoteCopyBrowserTest.Text --RemoteCopyBrowserTest.TextThenImageUrl --RunInBackgroundTest.RunInBackgroundBasicTest --RuntimeAPIUpdateTest.TerminatedExtensionUpdateHasCorrectPreviousVersion --SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/3 --SafeBrowsingBlockingPageWithDelayedWarningsBrowserTest/SafeBrowsingBlockingPageDelayedWarningBrowserTest.JavaScriptDialog_WarningShown/3 --SafeBrowsingNetworkContext/NetworkContextConfigurationBrowserTest.Cache/0 --SaveCardBubbleViewsFullFormBrowserTest.StrikeDatabase_Local_AddStrikeIfBubbleDeclined --SaveCardBubbleViewsFullFormBrowserTestForManageCard.Local_Metrics_AcceptingFootnotePromoManageCards --SaveCardBubbleViewsFullFormBrowserTestForStatusChip.ClickingOnCreditCardIconInStatusChipReshowsBubble --SaveCardBubbleViewsFullFormBrowserTestForStatusChip.CreditCardIconShownInStatusChip --SaveCardBubbleViewsFullFormBrowserTestForStatusChip.Feedback_Success --SaveCardBubbleViewsFullFormBrowserTestForStatusChip.Local_ClickingSaveShowsSigninPromo --SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.StrikeDatabase_Upload_AddStrikeIfBubbleIgnored --SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Upload_SubmittingFormWithExpirationDateMonthAndCurrentYear --SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Upload_SubmittingFormWithMissingExpirationDateYearAndWithMonth --SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Upload_TransportMode_RequestedCardholderNameTextfieldIsPrefilledWithFocusName --SearchByImageBrowserTest.ImageSearchWithCorruptImage --SearchByImageBrowserTest.ImageSearchWithValidImage --SecurityStateTabHelperTestWithFormsDangerous.MarkHttpAsWarningAndDangerousOnFormEdits --SerialTest.NavigateWithChooserCrossOrigin --ServiceWorkerAndExtensionsMenu/BrowserActionApiLazyTest.IncognitoBasic/0 --SessionCrashedBubbleViewTest.InvokeUi_SessionCrashedBubble --SessionRestoreTest.RestoredTabsHaveCorrectInitialSize --SettingsA11yAccessibilityV3.Accessibility_* --SettingsA11yBasicV3.Basic_* --SettingsA11yManageProfileV3.ManageProfile_* --SettingsA11yPasswordsV3.Passwords_* --SettingsA11ySignoutV3.Signout_* --SSLUITest.DisplayedContentWithCertErrorsClearedOnNavigation --SSLUITest.InAppTestHTTPSExpiredCertAndPreviouslyProceeded --StartupBrowserCreatorExtensionsCheckupExperimentTest.ExtensionsCheckup --StartupBrowserCreatorTest.RestoreWithNoStartupWindow --SubresourceRedirectBrowserTest.TestBypassOn503LoadShedFailure --TabActivityWatcherTest.AllWindowMetricsArePopulated --TabGroupEditorBubbleViewDialogBrowserTest.InvokeUi_default --TabHoverCardBubbleViewBrowserTest.WidgetNotVisibleOnMousePressAfterTabFocus --TabHoverCardBubbleViewBrowserTest.WidgetVisibleOnKeyPressAfterTabFocus --TabRestoreTest.RestoreWindowBounds --TabSearchBubbleBrowserTest.InvokeUi_default --TabStripDragManagerTest.All --TabStripUIBrowserTest.ActivatingTabClosesEmbedder --TranslateLanguageBrowserTest.LanguageModelLogSucceed --TranslateLanguageBrowserTest.TranslateAndRevert --TranslateLanguageBrowserTestWithTranslateRecentTarget.RecentTargetLanguage --TranslateManagerBrowserTest.PageTranslationTimeoutError --WebAppBrowserTest.CopyURL --WebAppBrowserTest.InScopePWAPopupsHaveCorrectSize --WebAppBrowserTest.OffScopePWAPopupsHaveCorrectSize --WebAppEngagementBrowserTest.CommandLineWindow --WebAppLinkCapturingBrowserTest.AboutBlankNavigationReparented --WebRtcDesktopCaptureBrowserTest.RunsScreenshareFromOneTabToAnother --WebRtcGetDisplayMediaBrowserTestWithPicker.GetDisplayMediaVideo --WebRtcGetDisplayMediaBrowserTestWithPicker.GetDisplayMediaVideoAndAudio --WebViewTest.SelectShowHide --WebViewTest.Shim_TestDisplayNoneWebviewRemoveChild --WelcomeA11y.WelcomeFlow_listitem --WorkerTaskProviderBrowserTest.CreateTasksForMultiProfiles - -# crbug.com/1121486 -# Following tests were flaky. We disable them first until we have time to investigate. --DevToolsExtensionTest.HttpIframeInDevToolsExtensionDevtools --DevToolsSanityTest.* --FindInPageControllerTest.SingleOccurrence --MediaRouterUIBrowserTest.PinAndUnpinToolbarIcon --MultiActionAPITest.PopupCreation/* --PDFExtensionClipboardTest.CombinedShiftArrowPresses --PopupTrackerBrowserTest.ControlClick_HasTracker +# TODO(crbug.com/1111979) Enable all tests on lacros. +-AccessContextAuditBrowserTest.CheckSessionOnly +-AccessContextAuditBrowserTest.PRE_RemoveRecords +-AccessContextAuditBrowserTest.RemoveRecords +-AdsPageLoadMetricsObserverBrowserTest.PageAdDensityIgnoreDisplayNoneFrame +-AdsPageLoadMetricsObserverBrowserTest.PageAdDensityMultipleFrames +-AdsPageLoadMetricsObserverBrowserTest.PageAdDensityRecordsPageMax +-All/DownloadReferrerPolicyTest.SaveLinkAsReferrerPolicy* +-All/HostedAppProcessModelTest.BackgroundPageWithAppCoveringDifferentSites/0 +-All/HostedOrWebAppTest.CtrlClickLink/HostedApp +-All/HostedOrWebAppTest.CtrlClickLink/WebApp +-All/HostedOrWebAppTest.OpenLinkInNewTab* +-All/IntentPickerBubbleViewBrowserTest.NavigationInAppWindowToInScopeLinkDoesNotShowIntentPicker* +-All/MultiActionAPITest.PopupCreation/1 +-All/MultiActionAPITest.SessionStorageDoesNotPersistBetweenOpenings/1 +-All/PopupBrowserTest.MoveClampedToCurrentDisplay* +-All/SystemWebAppLinkCaptureBrowserTest.IncognitoBrowserOmniboxLinkCapture* +-All/SystemWebAppLinkCaptureBrowserTest.WindowOpenFromOtherSWA* +-AppViewTest.KillGuestCommunicatingWithWrongAppView +-AppViewTest.KillGuestWithInvalidInstanceID +-AudioFocusWebContentsObserverBrowserTest.PlatformAppHasDifferentAudioFocus +-AutofillProviderBrowserTest.FrameDetachedOnFormlessSubmission +-AutofillProviderBrowserTestWithSkipFlagOn.InferredLabelChangeNotImpactFormComparing +-AutomationApiTest.ForceLayout +-AutomationManagerAuraBrowserTest.EventFromAction +-AutoplayExtensionBrowserTest.AutoplayAllowedInIframe +-BluetoothApiTest.* +-BluetoothLowEnergyApiTest.* +-BluetoothPrivateApiTest.* +-BrowserActionApiTest.BrowserActionOpenPopupOnPopup +-BrowserNavigatorTest.NavigateFromNoTabStripWindowToOptions +-BrowserNavigatorTest.NavigateFromNTPToOptionsPageInSameTab +-BrowserNavigatorTest.NavigateFromNTPToOptionsSingleton +-BrowserNavigatorTest.SwitchToTabLatestWindow +-BrowserTest.GetSizeForNewRenderView +-BrowserTest.RestorePinnedTabs +-BrowserViewTest.DevToolsUpdatesBrowserWindow +-BrowserViewTest.F6CyclesThroughCaptionBubbleToo +-BrowserViewTest.GetAccessibleTabModalDialogTitle +-BrowserViewTest.GetAccessibleTabModalDialogTree +-BrowsingDataRemoverBrowserTest.StorageRemovedFromDisk +-CaptivePortalBrowserTest.SecureDnsErrorTriggersCheck +-CaptivePortalBrowserTest.SlowLoadSecureDnsErrorAfterLogin +-CaptivePortalBrowserTest.SlowLoadSecureDnsErrorWithCaptivePortal +-ChromeSitePerProcessTest.PopupWindowFocus +-ClientHintsBrowserTest.ClientHintsClearSession +-ClipboardApiTest.Extension +-ContentIndexTest.MetricsCollected +-ContentSettingsTest.AllowCookiesForASessionUsingExceptions +-ContentVerifierTest.PolicyCorrupted +-ContextMenuBrowserTest.* +-CrComponentsCertificateManagerV3Test.All +-CrComponentsManagedFootnoteV3Test.All +-CreativeOriginAdsPageLoadMetricsObserverBrowserTest.CreativeOriginStatusWithThrottlingNestedThrottled +-CrSettingsAdvancedPageV3Test.Load +-CrSettingsBasicPageV3Test.All +-CrSettingsClearBrowsingDataV3Test.ClearBrowsingDataAllPlatforms +-CrSettingsDownloadsPageV3Test.All +-CrSettingsLanguagesPageV3Test.AddLanguagesDialog +-CrSettingsLanguagesPageV3Test.LanguageMenu +-CrSettingsLanguagesPageV3Test.Spellcheck +-CrSettingsLanguagesV3Test.All +-CrSettingsMainPageV3Test.MainPageV3 +-CrSettingsRouteV3Test.DynamicParameters +-CrSettingsRouteV3Test.NonExistentRoute +-CrSettingsSiteDetailsV3Test.SiteDetails +-CrSettingsSiteListEntryV3Test.All +-CrSettingsSyncAccountControlV3Test.All +-CustomTabBarViewBrowserTest.BackToAppButtonIsNotVisibleInOutOfScopePopups +-CustomTabBarViewBrowserTest.IsNotCreatedInPopup +-CustomTabBarViewBrowserTest.RightClickMenuShowsCopyUrl +-DeclarativeContentApiTest.RulesPersistence +-DeepScanningDialogDelegateBlockLargeFileTransferBrowserTest.Test/3 +-DesktopCaptureApiTest.ChooseDesktopMedia +-DiceManageAccountBrowserTest.ClearManagedProfileOnStartup +-DownloadExtensionTest.DownloadExtensionTest_SearchEmptyQuery +-DownloadTest.DownloadTest_History +-DownloadWakeLockTest.WakeLockAcquireAndCancel +-ExtensionLoadingTest.KeepAliveWithDevToolsOpenOnReload +-ExtensionManagementApiBrowserTest.GetAllIncludesTerminated +-ExtensionManagementApiEscalationTest.SetEnabled +-ExtensionOverrideTest.SubframeNavigationInOverridenNTPDoesNotAffectFocus +-ExtensionPreferenceApiTest.Standard +-ExtensionsMenuViewBrowserTest.ClickingContextMenuButton +-ExtensionWebRequestApiTest.WebSocketRequest +-ExtensionWebRequestApiTest.WebSocketRequestAuthRequired +-ExternalProtocolDialogBrowserTest.TestFocus +-FeedbackTest.AnonymousUser +-FeedbackTest.ExtraDiagnostics +-FeedbackTest.ShowFeedback +-FeedbackTest.ShowFeedbackFromAssistant +-FeedbackTest.ShowLoginFeedback +-FeedbackTest.SubmissionTest +-FindInPageControllerTest.FindMovesOnTabClose_Issue1343052 +-FindInPageControllerTest.FindMovesWhenObscuring +-FolderUploadConfirmationViewTest.InitiallyFocusesCancel +-GlobalErrorBubbleTest.InvokeUi_ExtensionDisabledGlobalError +-GlobalErrorBubbleTest.InvokeUi_ExtensionDisabledGlobalErrorRemote +-GlobalErrorBubbleTest.InvokeUi_ExternalInstallBubbleAlert +-IconLoaderBrowserTest.LoadGroup +-InlineLoginHelperBrowserTest.ForceSigninWithUserManager +-KeepAliveDevToolsTest.KeepsAliveUntilBrowserClose +-LiteVideoBrowserTest.SimplePlayback +-LoadImageBrowserTest.LoadImageWithMap +-LocalCardMigrationBrowserTestForNickname.CardIdentifierString/1 +-MediaRouterUIBrowserTest.EphemeralToolbarIconForDialog +-MediaRouterUIBrowserTest.OpenDialogFromAppMenu +-MediaSessionPictureInPictureWindowControllerBrowserTest.PlayPauseButtonVisibility +-MediaSessionPictureInPictureWindowControllerBrowserTest.PreviousTrackHandlerCalled +-NotificationPermissionContextApiTest.Granted +-NtpExtensionBubbleViewBrowserTest.InvokeUi_ntp_override +-NtpExtensionBubbleViewBrowserTest.TestControlledNewTabPageMessageBubble +-NtpExtensionBubbleViewBrowserTest.TestControlledNewTabPageMessageBubbleLearnMore +-OmniboxPopupContentsViewTest.ClickOmnibox +-OmniboxPopupContentsViewTest.PopupMatchesLocationBarBackground +-OutOfProcessPPAPITest.FlashClipboard +-OutOfProcessPPAPITest.NetAddress +-OutOfProcessPPAPITest.Printing +-OutOfProcessPPAPITest.URLRequest_CreateAndIsURLRequestInfo +-PageInfoBubbleViewBrowserTest.FocusDoesNotReturnToContentsOnReloadPrompt +-PageInfoBubbleViewBrowserTest.FocusReturnsToContentOnClose +-PageLoadMetricsBrowserTest.MainFrameIntersectionsMainFrame +-PaymentRequestCompletionStatusMetricsTest.UserAborted_TabClosed +-PaymentRequestCreditCardEditorTest.EditingExpiredCard +-PaymentRequestShippingAddressEditorTest.FocusFirstField_Name +-PaymentRequestShippingAddressEditorTest.FocusFirstInvalidField_NotName +-PDFExtensionJSTest.Bookmark/1 +-PDFExtensionTestWithTestGuestViewManager* +-PermissionRequestManagerWithBackForwardCacheBrowserTest.RequestsForPagesInCacheNotGrouped +-PermissionsApiTest.AlwaysAllowed +-PictureInPicturePixelComparisonBrowserTest.PlayAndPauseControls +-PictureInPictureWindowControllerBrowserTest.* +-PopupTrackerBrowserTest.PopupInWindow_IsWindowTrue +-PopupTrackerBrowserTest.ShiftClick_HasTracker +-PPAPINaClNewlibTest.TrueTypeFont +-PPAPINaClPNaClNonSfiTest.TrueTypeFont +-PresentationReceiverWindowControllerBrowserTest.CreatesWindow +-PreservedWindowPlacement.Test +-PrintPreviewDestinationSelectTest.ChangeIconDeprecationWarnings +-PrintPreviewDestinationSelectTest.UpdateStatusDeprecationWarnings +-PrintPreviewDestinationStoreTest.LoadAndSelectDestination +-PrintPreviewModelSettingsAvailabilityTest.All +-PrintPreviewModelTest.GetPrintTicket +-PrintPreviewModelTest.SetStickySettings +-PrintPreviewRestoreStateTest.SaveValues +-ProfileHelperTest.OpenNewWindowForProfile +-ProfileListDesktopBrowserTest.SwitchToProfile +-ProfileManagerBrowserTest.EphemeralProfile +-ProfileManagerBrowserTest.SwitchToProfile +-RemoteCopyBrowserTest.ImageUrl +-RemoteCopyBrowserTest.Text +-RemoteCopyBrowserTest.TextThenImageUrl +-RunInBackgroundTest.RunInBackgroundBasicTest +-RuntimeAPIUpdateTest.TerminatedExtensionUpdateHasCorrectPreviousVersion +-SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/3 +-SafeBrowsingBlockingPageWithDelayedWarningsBrowserTest/SafeBrowsingBlockingPageDelayedWarningBrowserTest.JavaScriptDialog_WarningShown/3 +-SafeBrowsingNetworkContext/NetworkContextConfigurationBrowserTest.Cache/0 +-SaveCardBubbleViewsFullFormBrowserTest.StrikeDatabase_Local_AddStrikeIfBubbleDeclined +-SaveCardBubbleViewsFullFormBrowserTestForManageCard.Local_Metrics_AcceptingFootnotePromoManageCards +-SaveCardBubbleViewsFullFormBrowserTestForStatusChip.ClickingOnCreditCardIconInStatusChipReshowsBubble +-SaveCardBubbleViewsFullFormBrowserTestForStatusChip.CreditCardIconShownInStatusChip +-SaveCardBubbleViewsFullFormBrowserTestForStatusChip.Feedback_Success +-SaveCardBubbleViewsFullFormBrowserTestForStatusChip.Local_ClickingSaveShowsSigninPromo +-SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.StrikeDatabase_Upload_AddStrikeIfBubbleIgnored +-SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Upload_SubmittingFormWithExpirationDateMonthAndCurrentYear +-SaveCardBubbleViewsFullFormBrowserTestWithAutofillUpstream.Upload_SubmittingFormWithMissingExpirationDateYearAndWithMonth +-SaveCardBubbleViewsSyncTransportFullFormBrowserTest.Upload_TransportMode_RequestedCardholderNameTextfieldIsPrefilledWithFocusName +-SearchByImageBrowserTest.ImageSearchWithCorruptImage +-SearchByImageBrowserTest.ImageSearchWithValidImage +-SecurityStateTabHelperTestWithFormsDangerous.MarkHttpAsWarningAndDangerousOnFormEdits +-SerialTest.NavigateWithChooserCrossOrigin +-ServiceWorkerAndExtensionsMenu/BrowserActionApiLazyTest.IncognitoBasic/0 +-SessionCrashedBubbleViewTest.InvokeUi_SessionCrashedBubble +-SessionRestoreTest.RestoredTabsHaveCorrectInitialSize +-SettingsA11yAccessibilityV3.Accessibility_* +-SettingsA11yBasicV3.Basic_* +-SettingsA11yManageProfileV3.ManageProfile_* +-SettingsA11yPasswordsV3.Passwords_* +-SettingsA11ySignoutV3.Signout_* +-SSLUITest.DisplayedContentWithCertErrorsClearedOnNavigation +-SSLUITest.InAppTestHTTPSExpiredCertAndPreviouslyProceeded +-StartupBrowserCreatorExtensionsCheckupExperimentTest.ExtensionsCheckup +-StartupBrowserCreatorTest.RestoreWithNoStartupWindow +-SubresourceRedirectBrowserTest.TestBypassOn503LoadShedFailure +-TabActivityWatcherTest.AllWindowMetricsArePopulated +-TabGroupEditorBubbleViewDialogBrowserTest.InvokeUi_default +-TabHoverCardBubbleViewBrowserTest.WidgetNotVisibleOnMousePressAfterTabFocus +-TabHoverCardBubbleViewBrowserTest.WidgetVisibleOnKeyPressAfterTabFocus +-TabRestoreTest.RestoreWindowBounds +-TabSearchBubbleBrowserTest.InvokeUi_default +-TabStripDragManagerTest.All +-TabStripUIBrowserTest.ActivatingTabClosesEmbedder +-TranslateLanguageBrowserTest.LanguageModelLogSucceed +-TranslateLanguageBrowserTest.TranslateAndRevert +-TranslateLanguageBrowserTestWithTranslateRecentTarget.RecentTargetLanguage +-TranslateManagerBrowserTest.PageTranslationTimeoutError +-WebAppBrowserTest.CopyURL +-WebAppBrowserTest.InScopePWAPopupsHaveCorrectSize +-WebAppBrowserTest.OffScopePWAPopupsHaveCorrectSize +-WebAppEngagementBrowserTest.CommandLineWindow +-WebAppLinkCapturingBrowserTest.AboutBlankNavigationReparented +-WebRtcDesktopCaptureBrowserTest.RunsScreenshareFromOneTabToAnother +-WebRtcGetDisplayMediaBrowserTestWithPicker.GetDisplayMediaVideo +-WebRtcGetDisplayMediaBrowserTestWithPicker.GetDisplayMediaVideoAndAudio +-WebViewTest.SelectShowHide +-WebViewTest.Shim_TestDisplayNoneWebviewRemoveChild +-WelcomeA11y.WelcomeFlow_listitem +-WorkerTaskProviderBrowserTest.CreateTasksForMultiProfiles + +# crbug.com/1121486 +# Following tests were flaky. We disable them first until we have time to investigate. +-DevToolsExtensionTest.HttpIframeInDevToolsExtensionDevtools +-DevToolsSanityTest.* +-FindInPageControllerTest.SingleOccurrence +-MediaRouterUIBrowserTest.PinAndUnpinToolbarIcon +-MultiActionAPITest.PopupCreation/* +-PDFExtensionClipboardTest.CombinedShiftArrowPresses +-PopupTrackerBrowserTest.ControlClick_HasTracker
diff --git a/testing/buildbot/filters/lacros.content_browsertests.filter b/testing/buildbot/filters/lacros.content_browsertests.filter index bf84e3e4..81c99ff9 100644 --- a/testing/buildbot/filters/lacros.content_browsertests.filter +++ b/testing/buildbot/filters/lacros.content_browsertests.filter
@@ -1,6 +1,6 @@ - -# TODO(crbug.com/1111979) Enable all tests on lacros. --OutOfProcessPPAPITest.TrueTypeFont - -# Following tests are flaky. --All/WebContentsVideoCaptureDeviceBrowserTestP.CapturesContentChanges* + +# TODO(crbug.com/1111979) Enable all tests on lacros. +-OutOfProcessPPAPITest.TrueTypeFont + +# Following tests are flaky. +-All/WebContentsVideoCaptureDeviceBrowserTestP.CapturesContentChanges*
diff --git a/testing/buildbot/filters/lacros.interactive_ui_tests.filter b/testing/buildbot/filters/lacros.interactive_ui_tests.filter index 17a4192c..0e3b4a2 100644 --- a/testing/buildbot/filters/lacros.interactive_ui_tests.filter +++ b/testing/buildbot/filters/lacros.interactive_ui_tests.filter
@@ -1,56 +1,56 @@ -# TODO(crbug.com/1111979) Enable all tests on lacros. --AppWindowInteractiveTest.TestFullscreen --AppWindowTest* --BookmarkBarViewTest* --BrowserActionInteractiveTest.OpenPopupOnPopup --BrowserActionInteractiveTest.TestOpenPopup --BrowserActionInteractiveTest.TestOpenPopupIncognito --BrowserFocusTest.BackgroundBrowserDontStealFocus --ChromeVisibilityObserverInteractiveTest.VisibilityTest --ClipboardTest/PlatformClipboardTest.ReadAvailablePlatformSpecificFormatNamesTest --CrossSiteSubframe/DragAndDropBrowserTest* --DesktopWidgetTestInteractive* --DevToolsManagerDelegateTest* --ExtensionApiTest.WindowOpen --ExtensionApiTest.WindowOpenFocus --ExtensionPointerLockTest.ExtensionPointerLockAccessPass --GlobalCommandsApiTest.GlobalCommand --KeyboardLockInteractiveBrowserTest.ActiveWithSomeKeysLocked --KeyboardLockInteractiveBrowserTest.RequestedButNotActive --MenuControllerMnemonicTestMnemonicMatch.MnemonicMatch --MenuControllerMnemonicTestNoMatch.NoMatch --MenuControllerMnemonicTestTitleMatch.TitleMatch --MenuControllerUITest.TestMouseOverShownMenu --MenuItemViewTestBasic* --MenuItemViewTestInsert* --MenuItemViewTestRemove* --MenuModelAdapterTest.RebuildMenu --MenuViewDragAndDropForDropCancel.MenuViewCancelsForOwnDrag --MenuViewDragAndDropForDropStayOpen.MenuViewStaysOpenForNestedDrag --MenuViewDragAndDropTestNestedDrag.MenuViewDragAndDropNestedDrag --MenuViewDragAndDropTestTestInMenuDrag.TestInMenuDrag --NotificationsTest.TestShouldDisplayMultiFullscreen --OmniboxViewTest.Paste --OmniboxViewViewsTest.SelectionClipboard --PopupBlockerBrowserTest.ModalPopUnder --SameSiteSubframe* --SettingsUIV3InteractiveTest* --SitePerProcessInteractiveBrowserTest.ShowAndHideDatePopupInOOPIFMultipleTimes --SitePerProcessInteractiveBrowserTest.TabAndMouseFocusNavigation --StartupBrowserCreatorTest.LastUsedProfileActivated --TabDragging* --TabMetricsLoggerTest* --ToolbarActionViewInteractiveUITest* --WidgetCaptureTest.SystemModalWindowReleasesCapture --WidgetInputMethodInteractiveTest* - -# crbug.com/1121486 -# Following tests were flaky. We disable them first until we have time to investigate. --BrowserCommandControllerInteractiveTest.ShortcutsShouldTakeEffectInBrowserFullscreen --ExtensionApiTest.DisplayModeWindowIsInFullscreen --ExtensionCrashRecoveryTest.TwoExtensionsReloadIndependently --KeyboardLockInteractiveBrowserTest.SubsequentLockCallSupersedesPreviousCall --NewTabPageDoodleShareDialogFocusTest.All --PlatformNotificationServiceBrowserTest.TestShouldDisplayMultiFullscreen --PopupBlockerBrowserTest.BlockWebContentsCreationIncognito --NotificationsApiTest* +# TODO(crbug.com/1111979) Enable all tests on lacros. +-AppWindowInteractiveTest.TestFullscreen +-AppWindowTest* +-BookmarkBarViewTest* +-BrowserActionInteractiveTest.OpenPopupOnPopup +-BrowserActionInteractiveTest.TestOpenPopup +-BrowserActionInteractiveTest.TestOpenPopupIncognito +-BrowserFocusTest.BackgroundBrowserDontStealFocus +-ChromeVisibilityObserverInteractiveTest.VisibilityTest +-ClipboardTest/PlatformClipboardTest.ReadAvailablePlatformSpecificFormatNamesTest +-CrossSiteSubframe/DragAndDropBrowserTest* +-DesktopWidgetTestInteractive* +-DevToolsManagerDelegateTest* +-ExtensionApiTest.WindowOpen +-ExtensionApiTest.WindowOpenFocus +-ExtensionPointerLockTest.ExtensionPointerLockAccessPass +-GlobalCommandsApiTest.GlobalCommand +-KeyboardLockInteractiveBrowserTest.ActiveWithSomeKeysLocked +-KeyboardLockInteractiveBrowserTest.RequestedButNotActive +-MenuControllerMnemonicTestMnemonicMatch.MnemonicMatch +-MenuControllerMnemonicTestNoMatch.NoMatch +-MenuControllerMnemonicTestTitleMatch.TitleMatch +-MenuControllerUITest.TestMouseOverShownMenu +-MenuItemViewTestBasic* +-MenuItemViewTestInsert* +-MenuItemViewTestRemove* +-MenuModelAdapterTest.RebuildMenu +-MenuViewDragAndDropForDropCancel.MenuViewCancelsForOwnDrag +-MenuViewDragAndDropForDropStayOpen.MenuViewStaysOpenForNestedDrag +-MenuViewDragAndDropTestNestedDrag.MenuViewDragAndDropNestedDrag +-MenuViewDragAndDropTestTestInMenuDrag.TestInMenuDrag +-NotificationsTest.TestShouldDisplayMultiFullscreen +-OmniboxViewTest.Paste +-OmniboxViewViewsTest.SelectionClipboard +-PopupBlockerBrowserTest.ModalPopUnder +-SameSiteSubframe* +-SettingsUIV3InteractiveTest* +-SitePerProcessInteractiveBrowserTest.ShowAndHideDatePopupInOOPIFMultipleTimes +-SitePerProcessInteractiveBrowserTest.TabAndMouseFocusNavigation +-StartupBrowserCreatorTest.LastUsedProfileActivated +-TabDragging* +-TabMetricsLoggerTest* +-ToolbarActionViewInteractiveUITest* +-WidgetCaptureTest.SystemModalWindowReleasesCapture +-WidgetInputMethodInteractiveTest* + +# crbug.com/1121486 +# Following tests were flaky. We disable them first until we have time to investigate. +-BrowserCommandControllerInteractiveTest.ShortcutsShouldTakeEffectInBrowserFullscreen +-ExtensionApiTest.DisplayModeWindowIsInFullscreen +-ExtensionCrashRecoveryTest.TwoExtensionsReloadIndependently +-KeyboardLockInteractiveBrowserTest.SubsequentLockCallSupersedesPreviousCall +-NewTabPageDoodleShareDialogFocusTest.All +-PlatformNotificationServiceBrowserTest.TestShouldDisplayMultiFullscreen +-PopupBlockerBrowserTest.BlockWebContentsCreationIncognito +-NotificationsApiTest*
diff --git a/testing/buildbot/filters/lacros.unit_tests.filter b/testing/buildbot/filters/lacros.unit_tests.filter index 27dd462..2186395 100644 --- a/testing/buildbot/filters/lacros.unit_tests.filter +++ b/testing/buildbot/filters/lacros.unit_tests.filter
@@ -1,6 +1,6 @@ -# TODO(crbug.com/1111979) Enable all tests on lacros. --ChromeContentBrowserClientTest.UserAgentStringOrdering --NativeDesktopMediaListTest.* --PermissionMessageCombinationsUnittest.USBSerialBluetoothCoalescing --RelaunchNotificationControllerPlatformImplTest.SynchronousNotification --WindowSizerTest.* +# TODO(crbug.com/1111979) Enable all tests on lacros. +-ChromeContentBrowserClientTest.UserAgentStringOrdering +-NativeDesktopMediaListTest.* +-PermissionMessageCombinationsUnittest.USBSerialBluetoothCoalescing +-RelaunchNotificationControllerPlatformImplTest.SynchronousNotification +-WindowSizerTest.*
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index b663667..e8bbabd 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -729,6 +729,12 @@ 'remove_from': [ 'android-code-coverage-native', # https://crbug.com/1018780 ], + # TODO(crbug.com/1111436): Remove experimental when it works fine. + 'modifications': { + 'android-pie-arm64-rel': { + 'experiment_percentage': 100, + }, + }, }, 'chrome_public_test_apk': { 'remove_from': [ @@ -788,6 +794,8 @@ 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter', # https://crbug.com/1010211 ], + # TODO(crbug.com/1111436): Remove experimental when it works fine. + 'experiment_percentage': 50, }, 'android-pie-x86-rel': { 'args': [ @@ -2927,6 +2935,14 @@ }, }, }, + # TODO(crbug.com/1111436): Remove this once it works fine. + 'weblayer_unittests': { + 'modifications': { + 'android-pie-arm64-rel': { + 'experiment_percentage': 100, + }, + }, + }, 'webview_cts_tests': { 'modifications': { 'android-pie-arm64-rel': { @@ -2977,6 +2993,14 @@ }, }, }, + # TODO(crbug.com/1111436): Remove this once it works fine. + 'webview_ui_test_app_test_apk': { + 'modifications': { + 'android-pie-arm64-rel': { + 'experiment_percentage': 100, + }, + }, + }, 'xr_browser_tests': { 'remove_from': [ # This exception probably needs to stay due to lack of capacity
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 78afa6e..bb6db0b 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -151,30 +151,22 @@ 'android_pie_rel_reduced_capacity_gtests': { 'android_browsertests': {}, 'blink_platform_unittests': {}, - 'chrome_java_test_pagecontroller_tests': {}, - 'chrome_java_test_webapk_launch_tests': {}, + 'chrome_public_test_apk': { + 'swarming': { + 'shards': 20, + }, + 'mixins': [ + 'chrome-gold-service-account', + 'skia_gold_test', + 'enable_resultdb', + ], + }, 'content_browsertests': { 'swarming': { 'shards': 15, }, }, - 'monochrome_public_bundle_fake_modules_smoke_test': {}, - 'monochrome_public_bundle_smoke_test': {}, - 'monochrome_public_smoke_test': {}, - 'weblayer_browsertests': {}, 'weblayer_instrumentation_test_apk': {}, - 'webview_cts_tests': { - 'swarming': { - 'shards': 2, - 'cipd_packages': [ - { - "cipd_package": 'chromium/android_webview/tools/cts_archive', - 'location': 'android_webview/tools/cts_archive', - 'revision': 'ai8Ig4HlO0vG6aP_JP2uhyruE2yPzze8PFP1g8Z4_hgC', - } - ] - }, - }, 'webview_instrumentation_test_apk': { 'swarming': { 'shards': 7, @@ -259,7 +251,6 @@ }, }, 'android_webview_unittests': {}, - 'breakpad_unittests': {}, 'gl_unittests': {}, 'ui_android_unittests': {}, }, @@ -4215,6 +4206,77 @@ }, }, + 'paeverywhere_common_tests': { + # Copy from chromium_gtests minus capture_unittests, crashpad_tests, + # content_browsertests, events_unittests and perfetto_unittests, because + # they fail. + 'absl_hardening_tests': {}, + 'angle_unittests': { + 'args': [ + 'angle_unittests', + ], + 'android_args': [ + '-v', + ], + 'use_isolated_scripts_api': True, + }, + 'base_unittests': {}, + 'base_util_unittests': {}, + 'blink_common_unittests': {}, + 'blink_heap_unittests': {}, + 'blink_platform_unittests': {}, + 'boringssl_crypto_tests': {}, + 'boringssl_ssl_tests': {}, + 'cast_unittests': {}, + 'components_browsertests': {}, + 'components_unittests': { + 'android_swarming': { + 'shards': 4, + }, + }, + 'content_unittests': { + 'android_swarming': { + 'shards': 3, + }, + }, + 'crypto_unittests': {}, + 'gcm_unit_tests': {}, + 'gin_unittests': {}, + 'google_apis_unittests': {}, + 'gpu_unittests': {}, + 'gwp_asan_unittests': {}, + 'ipc_tests': {}, + 'jingle_unittests': {}, + 'latency_unittests': {}, + 'libjingle_xmpp_unittests': {}, + 'liburlpattern_unittests': {}, + 'media_blink_unittests': {}, + 'media_unittests': {}, + 'midi_unittests': {}, + 'mojo_unittests': {}, + 'net_unittests': { + 'android_swarming': { + 'shards': 3, + }, + }, + 'services_unittests': {}, + 'shell_dialogs_unittests': {}, + 'skia_unittests': {}, + 'sql_unittests': {}, + 'storage_unittests': {}, + 'ui_base_unittests': {}, + 'ui_touch_selection_unittests': {}, + 'url_unittests': {}, + 'webkit_unit_tests': { + 'test': 'blink_unittests', + 'android_swarming': { + 'shards': 4, + }, + }, + 'wtf_unittests': {}, + 'zlib_unittests': {}, + }, + 'perfetto_gtests': { 'base_unittests': {}, 'content_browsertests': { @@ -5203,12 +5265,16 @@ # # TODO(https://crbug.com/1058067): Remove this once SkiaRenderer goes # stable on Android. - # 'android_pie_rel_non_skia_renderer_gtests': [ - # 'android_monochrome_smoke_tests', - # 'android_pagecontroller_self_tests', - # 'android_smoke_tests', - # 'android_webapk_launch_tests', - # # TODO: Following tests are experimental (crbug/1010211). + 'android_pie_rel_non_skia_renderer_gtests': [ + # TODO(crbug.com/1111436): Deprecate this when all the test suites below + # it are re-enabled. + 'android_pie_rel_reduced_capacity_gtests', + + 'android_monochrome_smoke_tests', + 'android_pagecontroller_self_tests', + 'android_smoke_tests', + 'android_webapk_launch_tests', + # TODO: Following tests are experimental (crbug/1010211). # 'android_specific_chromium_gtests', # Already includes gl_gtests. # 'chromium_gtests', # 'chromium_gtests_for_devices_with_graphical_output', @@ -5218,11 +5284,11 @@ # 'system_webview_shell_instrumentation_tests', # Not an experimental test # 'vr_platform_specific_chromium_gtests', # 'weblayer_android_gtests', - # 'weblayer_gtests', - # # Experimental tests end here. - # 'webview_cts_tests_gtest', - # 'webview_ui_instrumentation_tests', - # ], + 'weblayer_gtests', + # Experimental tests end here. + 'webview_cts_tests_gtest', + 'webview_ui_instrumentation_tests', + ], 'android_wpt_scripts': [ 'chrome_public_wpt', @@ -5640,9 +5706,7 @@ 'gpu_angle_linux_telemetry_tests': [ 'gpu_common_and_optional_telemetry_tests', 'gpu_webgl2_conformance_gl_passthrough_telemetry_tests', - 'gpu_webgl2_conformance_validating_telemetry_tests', 'gpu_webgl_conformance_gl_passthrough_telemetry_tests', - 'gpu_webgl_conformance_validating_telemetry_tests', ], 'gpu_angle_mac_amd_and_intel_gtests': [ @@ -5666,8 +5730,8 @@ 'gpu_angle_mac_telemetry_tests': [ 'gpu_info_collection_telemetry_tests', - 'gpu_webgl2_conformance_telemetry_tests', - 'gpu_webgl_conformance_telemetry_tests', + 'gpu_webgl2_conformance_gl_passthrough_telemetry_tests', + 'gpu_webgl_conformance_validating_telemetry_tests', 'gpu_webgl_conformance_gl_passthrough_telemetry_tests', 'gpu_webgl_conformance_metal_passthrough_telemetry_tests', 'gpu_webgl_conformance_swangle_passthrough_representative_telemetry_tests', @@ -6269,25 +6333,25 @@ 'paeverywhere_android_gtests': [ 'android_specific_chromium_gtests_for_paeverywhere', 'android_smoke_tests', - 'chromium_gtests' + 'paeverywhere_common_tests' ], 'paeverywhere_linux_gtests': [ 'chromium_gtests_for_linux_and_mac_only', 'chromium_gtests_for_linux_only', 'chromium_gtests_for_win_and_linux_only', - 'chromium_gtests', + 'paeverywhere_common_tests', ], 'paeverywhere_mac_gtests': [ 'chromium_gtests_for_linux_and_mac_only', 'mac_specific_chromium_gtests', - 'chromium_gtests', + 'paeverywhere_common_tests', ], 'paeverywhere_win_gtests': [ 'chromium_gtests_for_win_and_linux_only', - 'chromium_gtests', + 'paeverywhere_common_tests', 'win_specific_chromium_gtests', ], @@ -6359,6 +6423,19 @@ }, }, + 'gpu_angle_ios_gtests': { + 'gpu_angle_end2end_gtests': { + 'variants': [ + 'SIM_IPHONE_X_14_0', + ], + }, + 'gpu_angle_white_box_gtests': { + 'variants': [ + 'SIM_IPHONE_X_14_0', + ], + }, + }, + # ios14-beta-sim runs sims only on 14.0+ since # ios13-beta-sim already runs 13.x and 12.4 'ios14_beta_simulator_tests': {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index b2ecfb3..f782eb49 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -319,13 +319,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=88', ], - 'identifier': 'Implementation Tests For 88.0.4324.79', + 'identifier': 'Implementation Tests For 88.0.4324.82', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M88', - 'revision': 'version:88.0.4324.79', + 'revision': 'version:88.0.4324.82', } ], }, @@ -342,13 +342,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=87', ], - 'identifier': 'Implementation Tests For 87.0.4280.143', + 'identifier': 'Implementation Tests For 87.0.4280.145', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M87', - 'revision': 'version:87.0.4280.143', + 'revision': 'version:87.0.4280.145', } ], }, @@ -388,13 +388,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--client-version=88', ], - 'identifier': 'Client Tests For 88.0.4324.79', + 'identifier': 'Client Tests For 88.0.4324.82', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M88', - 'revision': 'version:88.0.4324.79', + 'revision': 'version:88.0.4324.82', } ], }, @@ -411,13 +411,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--client-version=87', ], - 'identifier': 'Client Tests For 87.0.4280.143', + 'identifier': 'Client Tests For 87.0.4280.145', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M87', - 'revision': 'version:87.0.4280.143', + 'revision': 'version:87.0.4280.145', } ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 311d4b6..ea4593be 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1125,11 +1125,10 @@ 'weblayer_shell', ], 'test_suites': { - #'gtest_tests': 'android_pie_rel_non_skia_renderer_gtests', - #'isolated_scripts': 'marshmallow_nougat_pie_isolated_scripts_with_proguard', - # TODO(crbug.com/1111436): Remove this if/when additional capacity + 'gtest_tests': 'android_pie_rel_non_skia_renderer_gtests', + # TODO(crbug.com/1111436): Re-enable this if/when additional capacity # has been deployed. - 'gtest_tests': 'android_pie_rel_reduced_capacity_gtests', + #'isolated_scripts': 'marshmallow_nougat_pie_isolated_scripts_with_proguard', }, 'use_swarming': True, 'os_type': 'android', @@ -1319,6 +1318,22 @@ 'angle_unittests', ], }, + 'ios-angle-builder': {}, + 'ios-angle-intel': { + 'os_type': 'mac', + 'mixins': [ + 'mac_mini_intel_gpu_stable', + 'enable_resultdb', + 'isolate_profile_data', + 'mac_toolchain', + 'out_dir_arg', + 'xcode_12a7209', + 'xctest', + ], + 'test_suites': { + 'gtest_tests': 'gpu_angle_ios_gtests', + }, + }, 'linux-angle-builder': {}, 'linux-angle-chromium-builder': {}, 'linux-angle-chromium-intel': { @@ -3452,23 +3467,6 @@ 'gtest_tests': 'goma_gtests', }, }, - 'Win7 Builder (dbg) Goma Canary': { - 'additional_compile_targets': [ - 'all', - ], - 'test_suites': { - 'gtest_tests': 'goma_gtests', - }, - }, - 'Win7 Builder Goma Canary': { - 'additional_compile_targets': [ - 'all', - 'pdf_fuzzers', - ], - 'test_suites': { - 'gtest_tests': 'goma_gtests', - }, - }, 'android-archive-dbg-goma-canary': { 'additional_compile_targets': [ 'all',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 47ad760..deda8d35 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -620,6 +620,21 @@ ] } ], + "ArcUseHighMemoryDalvikProfile": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ArcUseHighMemoryDalvikProfile" + ] + } + ] + } + ], "AssistAutocorrect": [ { "platforms": [ @@ -1374,9 +1389,13 @@ ], "experiments": [ { - "name": "Enabled", + "name": "Enabled_Stage2", "enable_features": [ - "AutofillEnableAccountWalletStorage" + "AutofillEnableAccountWalletStorage", + "AutofillEnablePasswordInfoBarAccountIndicationFooter" + ], + "disable_features": [ + "WalletRequiresFirstSyncSetupComplete" ] } ] @@ -3753,21 +3772,6 @@ ] } ], - "IOSPreloadDelayWebStateReset": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "PreloadDelayWebStateReset" - ] - } - ] - } - ], "IOSRequestDesktopByDefault": [ { "platforms": [ @@ -5033,6 +5037,7 @@ "OmniboxDisplayTitleForCurrentUrl", "OmniboxDynamicMaxAutocomplete", "OmniboxEntitySuggestionsReduceLatency", + "OmniboxHistoryQuickProviderAblateInMemoryURLIndexCacheFile", "OmniboxLocalZeroSuggestAgeThreshold", "OmniboxLocalZeroSuggestFrecencyRanking", "OmniboxMaxURLMatches", @@ -5072,6 +5077,7 @@ "enable_features": [ "OmniboxAdaptiveSuggestionsCount", "OmniboxCompactSuggestions", + "OmniboxHistoryQuickProviderAblateInMemoryURLIndexCacheFile", "OmniboxLocalZeroSuggestAgeThreshold", "OmniboxLocalZeroSuggestFrecencyRanking", "OmniboxMaxURLMatches", @@ -7944,7 +7950,8 @@ "chromeos", "linux", "ios", - "android" + "android", + "android_webview" ], "experiments": [ {
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 8fdbafe0..dbbad849 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -1815,6 +1815,8 @@ backdrop selection target-text + spelling-error + grammar-error first-line-inherited scrollbar scrollbar-thumb
diff --git a/third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom b/third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom index 8c965fb..338833ba 100644 --- a/third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom +++ b/third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom
@@ -32,13 +32,15 @@ // Closes the file writer. This will materialize the writes operations on the // intended file target in the case of atomic writes. + // The mojo pipe will be destroyed when Close() completes. // Specify the |autoClose| flag to ensure Close() is automatically invoked // when the mojo pipe closes. // Returns whether the operation succeeded. Close() => (FileSystemAccessError result); // Aborts the write operation, resulting in the writes not being committed, - // even if autoClose is specified. All further operations will be rejected. + // even if |autoClose| is specified. The mojo pipe will be destroyed when + // Abort() completes. // Returns whether the write operation was aborted successfully. Abort() => (FileSystemAccessError result); };
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom index f8cfa660..bc260e90 100644 --- a/third_party/blink/public/mojom/frame/frame.mojom +++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -915,6 +915,11 @@ // Requests that the blink::RemoteFrame updates its opener to the specified // frame. The frame token may be "empty" if the opener was disowned. UpdateOpener(mojo_base.mojom.UnguessableToken? opener_frame_token); + + // Requests the corresponding RemoteFrame to be deleted and removed from + // the frame tree. This should not be called on the main frame as that frame + // is owned by the associated WebView. + DetachAndDispose(); }; // Implemented in Blink, this interface defines main-frame-specific methods that @@ -994,6 +999,10 @@ UpdateBrowserControlsState(cc.mojom.BrowserControlsState constraints, cc.mojom.BrowserControlsState current, bool animate); + + // Notify renderer that the window controls overlay has changed size or + // visibility. + UpdateWindowControlsOverlay(gfx.mojom.Rect window_controls_overlay_rect); }; // Implemented in Blink, this interface defines remote main-frame-specific
diff --git a/third_party/blink/public/mojom/frame/user_activation_notification_type.mojom b/third_party/blink/public/mojom/frame/user_activation_notification_type.mojom index 2d3878b2..4f576ff 100644 --- a/third_party/blink/public/mojom/frame/user_activation_notification_type.mojom +++ b/third_party/blink/public/mojom/frame/user_activation_notification_type.mojom
@@ -31,8 +31,8 @@ // A media API caused the notification call. kMedia, - // An NFS API caused the notification call. - kNativeFileSystem, + // A File System Access API caused the notification call. + kFileSystemAccess, // A plugin API caused the notification call. Deprecated, preserved only for // UMA consistency.
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index 4bfd95b..dbb154e 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2670,7 +2670,7 @@ kV8Window_ShowDirectoryPicker_Method = 3342, kRTCConstraintEnableRtpDataChannelsTrue = 3344, kRTCConstraintEnableRtpDataChannelsFalse = 3345, - kNativeFileSystemDragAndDrop = 3346, + kFileSystemAccessDragAndDrop = 3346, kRTCAdaptivePtime = 3347, kHTMLMetaElementReferrerPolicyMultipleTokensAffectingRequest = 3348, kNavigationTimingL2 = 3349, @@ -3065,6 +3065,9 @@ kReadableStreamWithByteSource = 3743, kReadableStreamBYOBReader = 3744, kEmbedElementWithoutTypeSrcChanged = 3745, + kSamePartyCookieAttribute = 3746, + kSamePartyCookieExclusionOverruledSameSite = 3747, + kSamePartyCookieInclusionOverruledSameSite = 3748, // 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/platform.h b/third_party/blink/public/platform/platform.h index cce6ef82..46bdf2e6 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h
@@ -387,6 +387,12 @@ // once CreateAndSetCompositorThread() is called. scoped_refptr<base::SingleThreadTaskRunner> CompositorThreadTaskRunner(); + // Returns the task runner of the media thread. + // This method should only be called on the main thread, or it crashes. + virtual scoped_refptr<base::SingleThreadTaskRunner> MediaThreadTaskRunner() { + return nullptr; + } + // This is called after the compositor thread is created, so the embedder // can initiate an IPC to change its thread priority (on Linux we can't // increase the nice value, so we need to ask the browser process). This
diff --git a/third_party/blink/public/platform/web_common.h b/third_party/blink/public/platform/web_common.h index c467fdb..3494c23 100644 --- a/third_party/blink/public/platform/web_common.h +++ b/third_party/blink/public/platform/web_common.h
@@ -89,7 +89,7 @@ #if defined(WIN32) typedef wchar_t WebUChar; #else -typedef uint16_t WebUChar; +typedef char16_t WebUChar; #endif // Latin-1 character type
diff --git a/third_party/blink/public/platform/web_drag_data.h b/third_party/blink/public/platform/web_drag_data.h index 940a4c53..b3f7f89 100644 --- a/third_party/blink/public/platform/web_drag_data.h +++ b/third_party/blink/public/platform/web_drag_data.h
@@ -45,7 +45,7 @@ template <typename T> class WebVector; -using NativeFileSystemDropData = +using FileSystemAccessDropData = base::RefCountedData<blink::CrossVariantMojoRemote< mojom::FileSystemAccessDragDropTokenInterfaceBase>>; @@ -84,7 +84,7 @@ // Only valid when storage_type == kStorageTypeFilename. WebString filename_data; WebString display_name_data; - scoped_refptr<NativeFileSystemDropData> native_file_system_entry; + scoped_refptr<FileSystemAccessDropData> file_system_access_entry; // Only valid when storage_type == kStorageTypeBinaryData. WebData binary_data;
diff --git a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc index ac07b12..5ea6550 100644 --- a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc +++ b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc
@@ -409,8 +409,6 @@ v8::Local<v8::FunctionTemplate> set_func = v8::FunctionTemplate::New( isolate, CSSPropertyAttributeSet, v8_property_name, signature, 1, v8::ConstructorBehavior::kThrow, v8::SideEffectType::kHasSideEffect); - get_func->RemovePrototype(); - set_func->RemovePrototype(); get_func->SetAcceptAnyReceiver(false); set_func->SetAcceptAnyReceiver(false); get_func->SetClassName(
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h index d173618..1eb157a3 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h
@@ -43,16 +43,15 @@ // transferred MojoHandle. kBlobTag = 'b', // uuid:WebCoreString, type:WebCoreString, size:uint64_t -> // Blob (ref) - kBlobIndexTag = 'i', // index:int32_t -> Blob (ref) - kFileTag = 'f', // file:RawFile -> File (ref) - kFileIndexTag = 'e', // index:int32_t -> File (ref) - kDOMFileSystemTag = 'd', // type:int32_t, name:WebCoreString, - // uuid:WebCoreString -> FileSystem (ref) - kNativeFileSystemFileHandleTag = 'n', // name:WebCoreString, index:uint32_t - // -> NativeFileSystemFileHandle (ref) - kNativeFileSystemDirectoryHandleTag = - 'N', // name:WebCoreString, index:uint32_t -> - // NativeFileSystemDirectoryHandle (ref) + kBlobIndexTag = 'i', // index:int32_t -> Blob (ref) + kFileTag = 'f', // file:RawFile -> File (ref) + kFileIndexTag = 'e', // index:int32_t -> File (ref) + kDOMFileSystemTag = 'd', // type:int32_t, name:WebCoreString, + // uuid:WebCoreString -> FileSystem (ref) + kFileSystemFileHandleTag = 'n', // name:WebCoreString, index:uint32_t + // -> FileSystemFileHandle (ref) + kFileSystemDirectoryHandleTag = 'N', // name:WebCoreString, index:uint32_t -> + // FileSystemDirectoryHandle (ref) kFileListTag = 'l', // length:uint32_t, files:RawFile[length] -> FileList (ref) kFileListIndexTag =
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 ce93815..0d18b67 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
@@ -793,7 +793,7 @@ "Update WebSerializedScriptValueVersion.h."); bool SerializedScriptValue::IsOriginCheckRequired() const { - return native_file_system_tokens_.size() > 0; + return file_system_access_tokens_.size() > 0; } } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h index 08ef4b8..8c05985 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
@@ -102,7 +102,7 @@ using TransferredWasmModulesArray = WTF::Vector<v8::CompiledWasmModule>; using MessagePortChannelArray = Vector<MessagePortChannel>; using StreamArray = Vector<Stream>; - using NativeFileSystemTokensArray = + using FileSystemAccessTokensArray = Vector<mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken>>; // Increment this for each incompatible change to the wire format. @@ -275,8 +275,8 @@ return shared_array_buffers_contents_; } BlobDataHandleMap& BlobDataHandles() { return blob_data_handles_; } - NativeFileSystemTokensArray& NativeFileSystemTokens() { - return native_file_system_tokens_; + FileSystemAccessTokensArray& FileSystemAccessTokens() { + return file_system_access_tokens_; } MojoScopedHandleArray& MojoHandles() { return mojo_handles_; } ArrayBufferContentsArray& GetArrayBufferContentsArray() { @@ -396,7 +396,7 @@ BlobDataHandleMap blob_data_handles_; MojoScopedHandleArray mojo_handles_; SharedArrayBufferContentsArray shared_array_buffers_contents_; - NativeFileSystemTokensArray native_file_system_tokens_; + FileSystemAccessTokensArray file_system_access_tokens_; HashMap<const void* const*, std::unique_ptr<Attachment>> attachments_; bool has_registered_external_allocation_;
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 39f20c5..54ed4ad 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
@@ -205,11 +205,10 @@ } else { function_template = v8::FunctionTemplate::New( isolate, callback, data, signature, length, - v8::ConstructorBehavior::kAllow, side_effect_type); + v8::ConstructorBehavior::kThrow, side_effect_type); } if (!function_template.IsEmpty()) { - function_template->RemovePrototype(); function_template->SetAcceptAnyReceiver( access_check_configuration == V8DOMConfiguration::kDoNotCheckAccess); @@ -485,12 +484,10 @@ : v8::SideEffectType::kHasSideEffect; if (method.property_location_configuration & (V8DOMConfiguration::kOnInstance | V8DOMConfiguration::kOnPrototype)) { - // TODO(luoe): use ConstructorBehavior::kThrow for non-constructor methods. v8::Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New( isolate, callback, v8::Local<v8::Value>(), signature, method.length, - v8::ConstructorBehavior::kAllow, side_effect_type, v8_c_function); - function_template->RemovePrototype(); + v8::ConstructorBehavior::kThrow, side_effect_type, v8_c_function); function_template->SetAcceptAnyReceiver( method.access_check_configuration == V8DOMConfiguration::kDoNotCheckAccess); @@ -510,13 +507,11 @@ // Operations installed on the interface object must be static methods, so // no need to specify a signature, i.e. no need to do type check against a // holder. - // TODO(luoe): use ConstructorBehavior::kThrow for non-constructor methods. v8::Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New(isolate, callback, v8::Local<v8::Value>(), v8::Local<v8::Signature>(), method.length, - v8::ConstructorBehavior::kAllow, + v8::ConstructorBehavior::kThrow, side_effect_type); - function_template->RemovePrototype(); // Similarly, there is no need to do an access check for static methods, as // there is no holder to check against. AddMethodToTemplate(isolate, interface_template, function_template, method); @@ -554,12 +549,10 @@ DCHECK(location); if (location & (V8DOMConfiguration::kOnInstance | V8DOMConfiguration::kOnPrototype)) { - // TODO(luoe): use ConstructorBehavior::kThrow for non-constructor methods. v8::Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New( isolate, callback, v8::Local<v8::Value>(), signature, config.length, - v8::ConstructorBehavior::kAllow, side_effect_type); - function_template->RemovePrototype(); + v8::ConstructorBehavior::kThrow, side_effect_type); function_template->SetAcceptAnyReceiver( config.access_check_configuration == V8DOMConfiguration::kDoNotCheckAccess); @@ -586,13 +579,11 @@ // Operations installed on the interface object must be static // operations, so no need to specify a signature, i.e. no need to do // type check against a holder. - // TODO(luoe): use ConstructorBehavior::kThrow for non-constructor methods. v8::Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New(isolate, callback, v8::Local<v8::Value>(), v8::Local<v8::Signature>(), config.length, - v8::ConstructorBehavior::kAllow, + v8::ConstructorBehavior::kThrow, side_effect_type); - function_template->RemovePrototype(); v8::Local<v8::Function> function = function_template->GetFunction(isolate->GetCurrentContext()) .ToLocalChecked();
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index 7e3bb39d..058fadc 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -283,8 +283,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_picker_accept_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_picker_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_picker_options.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writer_options.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writer_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writable_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writable_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_flags.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_flags.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_get_directory_options.cc", @@ -1745,8 +1745,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_mime_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_mime_type_array.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_mime_type_array.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_native_file_system_directory_iterator.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_native_file_system_directory_iterator.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_directory_iterator.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_file_system_directory_iterator.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_native_io_file.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_native_io_file.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_native_io_file_manager.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index a1049e5..c9200eb 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -261,6 +261,7 @@ "//third_party/blink/renderer/core/frame/feature_policy_violation_report_body.idl", "//third_party/blink/renderer/core/frame/fragment_directive.idl", "//third_party/blink/renderer/core/frame/history.idl", + "//third_party/blink/renderer/core/frame/impression_params.idl", "//third_party/blink/renderer/core/frame/intervention_report_body.idl", "//third_party/blink/renderer/core/frame/is_input_pending_options.idl", "//third_party/blink/renderer/core/frame/location.idl",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index 4c8f79e..96f53b886 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -206,11 +206,11 @@ "//third_party/blink/renderer/modules/encryptedmedia/navigator_request_media_key_system_access.idl", "//third_party/blink/renderer/modules/eventsource/event_source.idl", "//third_party/blink/renderer/modules/eventsource/event_source_init.idl", - "//third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.idl", + "//third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.idl", "//third_party/blink/renderer/modules/file_system_access/directory_picker_options.idl", "//third_party/blink/renderer/modules/file_system_access/file_picker_accept_type.idl", "//third_party/blink/renderer/modules/file_system_access/file_picker_options.idl", - "//third_party/blink/renderer/modules/file_system_access/file_system_create_writer_options.idl", + "//third_party/blink/renderer/modules/file_system_access/file_system_create_writable_options.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl", @@ -219,11 +219,11 @@ "//third_party/blink/renderer/modules/file_system_access/file_system_handle_permission_descriptor.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_remove_options.idl", "//third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.idl", - "//third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.idl", + "//third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl", "//third_party/blink/renderer/modules/file_system_access/open_file_picker_options.idl", "//third_party/blink/renderer/modules/file_system_access/save_file_picker_options.idl", - "//third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.idl", - "//third_party/blink/renderer/modules/file_system_access/window_native_file_system.idl", + "//third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.idl", + "//third_party/blink/renderer/modules/file_system_access/window_file_system_access.idl", "//third_party/blink/renderer/modules/file_system_access/write_params.idl", "//third_party/blink/renderer/modules/filesystem/data_transfer_item_file_system.idl", "//third_party/blink/renderer/modules/filesystem/dedicated_worker_global_scope_file_system.idl",
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc index ed3f252..327c0e8 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.cc
@@ -13,8 +13,8 @@ #include "third_party/blink/renderer/bindings/modules/v8/serialization/web_crypto_sub_tags.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/crypto/crypto_key.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/renderer/modules/filesystem/dom_file_system.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_certificate.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.h" @@ -52,9 +52,9 @@ ExecutionContext::From(GetScriptState()), name, static_cast<mojom::blink::FileSystemType>(raw_type), KURL(root_url)); } - case kNativeFileSystemFileHandleTag: - case kNativeFileSystemDirectoryHandleTag: - return ReadNativeFileSystemHandle(tag); + case kFileSystemFileHandleTag: + case kFileSystemDirectoryHandleTag: + return ReadFileSystemHandle(tag); case kRTCCertificateTag: { String pem_private_key; String pem_certificate; @@ -311,10 +311,9 @@ return MakeGarbageCollected<CryptoKey>(key); } -NativeFileSystemHandle* -V8ScriptValueDeserializerForModules::ReadNativeFileSystemHandle( +FileSystemHandle* V8ScriptValueDeserializerForModules::ReadFileSystemHandle( SerializationTag tag) { - if (!RuntimeEnabledFeatures::NativeFileSystemEnabled( + if (!RuntimeEnabledFeatures::FileSystemAccessEnabled( ExecutionContext::From(GetScriptState()))) { return nullptr; } @@ -326,8 +325,8 @@ } // Find the FileSystemHandle's token. - SerializedScriptValue::NativeFileSystemTokensArray& tokens_array = - GetSerializedScriptValue()->NativeFileSystemTokens(); + SerializedScriptValue::FileSystemAccessTokensArray& tokens_array = + GetSerializedScriptValue()->FileSystemAccessTokens(); if (token_index >= tokens_array.size()) { return nullptr; } @@ -344,34 +343,34 @@ token->Clone(token_clone.InitWithNewPipeAndPassReceiver()); tokens_array[token_index] = std::move(token_clone); - // Use the NativeFileSystemManager to redeem the token to clone the + // Use the FileSystemAccessManager to redeem the token to clone the // FileSystemHandle. ExecutionContext* execution_context = ExecutionContext::From(GetScriptState()); mojo::Remote<mojom::blink::FileSystemAccessManager> - native_file_system_manager; + file_system_access_manager; execution_context->GetBrowserInterfaceBroker().GetInterface( - native_file_system_manager.BindNewPipeAndPassReceiver()); + file_system_access_manager.BindNewPipeAndPassReceiver()); // Clone the FileSystemHandle object. switch (tag) { - case kNativeFileSystemFileHandleTag: { + case kFileSystemFileHandleTag: { mojo::PendingRemote<mojom::blink::FileSystemAccessFileHandle> file_handle; - native_file_system_manager->GetFileHandleFromToken( + file_system_access_manager->GetFileHandleFromToken( token.Unbind(), file_handle.InitWithNewPipeAndPassReceiver()); - return MakeGarbageCollected<NativeFileSystemFileHandle>( - execution_context, name, std::move(file_handle)); + return MakeGarbageCollected<FileSystemFileHandle>(execution_context, name, + std::move(file_handle)); } - case kNativeFileSystemDirectoryHandleTag: { + case kFileSystemDirectoryHandleTag: { mojo::PendingRemote<mojom::blink::FileSystemAccessDirectoryHandle> directory_handle; - native_file_system_manager->GetDirectoryHandleFromToken( + file_system_access_manager->GetDirectoryHandleFromToken( token.Unbind(), directory_handle.InitWithNewPipeAndPassReceiver()); - return MakeGarbageCollected<NativeFileSystemDirectoryHandle>( + return MakeGarbageCollected<FileSystemDirectoryHandle>( execution_context, name, std::move(directory_handle)); } default: {
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h index ccc7f4e..90408ee 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_deserializer_for_modules.h
@@ -11,7 +11,7 @@ namespace blink { class CryptoKey; -class NativeFileSystemHandle; +class FileSystemHandle; class RTCEncodedAudioFrame; class RTCEncodedVideoFrame; class VideoFrame; @@ -46,7 +46,7 @@ return true; } CryptoKey* ReadCryptoKey(); - NativeFileSystemHandle* ReadNativeFileSystemHandle(SerializationTag tag); + FileSystemHandle* ReadFileSystemHandle(SerializationTag tag); RTCEncodedAudioFrame* ReadRTCEncodedAudioFrame(); RTCEncodedVideoFrame* ReadRTCEncodedVideoFrame(); VideoFrame* ReadVideoFrame();
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 8cb08ef3..fe674e9 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
@@ -62,18 +62,16 @@ return true; } if (wrapper_type_info == V8FileSystemFileHandle::GetWrapperTypeInfo() && - RuntimeEnabledFeatures::NativeFileSystemEnabled( + RuntimeEnabledFeatures::FileSystemAccessEnabled( ExecutionContext::From(GetScriptState()))) { - return WriteNativeFileSystemHandle( - kNativeFileSystemFileHandleTag, - wrappable->ToImpl<NativeFileSystemHandle>()); + return WriteFileSystemHandle(kFileSystemFileHandleTag, + wrappable->ToImpl<FileSystemHandle>()); } if (wrapper_type_info == V8FileSystemDirectoryHandle::GetWrapperTypeInfo() && - RuntimeEnabledFeatures::NativeFileSystemEnabled( + RuntimeEnabledFeatures::FileSystemAccessEnabled( ExecutionContext::From(GetScriptState()))) { - return WriteNativeFileSystemHandle( - kNativeFileSystemDirectoryHandleTag, - wrappable->ToImpl<NativeFileSystemHandle>()); + return WriteFileSystemHandle(kFileSystemDirectoryHandleTag, + wrappable->ToImpl<FileSystemHandle>()); } if (wrapper_type_info == V8RTCCertificate::GetWrapperTypeInfo()) { RTCCertificate* certificate = wrappable->ToImpl<RTCCertificate>(); @@ -301,20 +299,20 @@ return true; } -bool V8ScriptValueSerializerForModules::WriteNativeFileSystemHandle( +bool V8ScriptValueSerializerForModules::WriteFileSystemHandle( SerializationTag tag, - NativeFileSystemHandle* native_file_system_handle) { + FileSystemHandle* file_system_handle) { mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> token = - native_file_system_handle->Transfer(); + file_system_handle->Transfer(); - SerializedScriptValue::NativeFileSystemTokensArray& tokens_array = - GetSerializedScriptValue()->NativeFileSystemTokens(); + SerializedScriptValue::FileSystemAccessTokensArray& tokens_array = + GetSerializedScriptValue()->FileSystemAccessTokens(); tokens_array.push_back(std::move(token)); const uint32_t token_index = static_cast<uint32_t>(tokens_array.size() - 1); WriteTag(tag); - WriteUTF8String(native_file_system_handle->name()); + WriteUTF8String(file_system_handle->name()); WriteUint32(token_index); return true; }
diff --git a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h index d15725e..2bee9de 100644 --- a/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h +++ b/third_party/blink/renderer/bindings/modules/v8/serialization/v8_script_value_serializer_for_modules.h
@@ -11,7 +11,7 @@ namespace blink { -class NativeFileSystemHandle; +class FileSystemHandle; class RTCEncodedAudioFrame; class RTCEncodedVideoFrame; class VideoFrame; @@ -32,9 +32,8 @@ private: void WriteOneByte(uint8_t byte) { WriteRawBytes(&byte, 1); } bool WriteCryptoKey(const WebCryptoKey&, ExceptionState&); - bool WriteNativeFileSystemHandle( - SerializationTag tag, - NativeFileSystemHandle* native_file_system_handle); + bool WriteFileSystemHandle(SerializationTag tag, + FileSystemHandle* file_system_handle); bool WriteRTCEncodedAudioFrame(RTCEncodedAudioFrame*); bool WriteRTCEncodedVideoFrame(RTCEncodedVideoFrame*); bool WriteVideoFrame(VideoFrame*);
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 94aebbec..1ec4526 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
@@ -542,8 +542,8 @@ scoped_refptr<SerializedScriptValue> serialized_value = value->CreateSerializedValue(); - serialized_value->NativeFileSystemTokens() = - std::move(const_cast<IDBValue*>(value)->NativeFileSystemTokens()); + serialized_value->FileSystemAccessTokens() = + std::move(const_cast<IDBValue*>(value)->FileSystemAccessTokens()); SerializedScriptValue::DeserializeOptions options; options.blob_info = &value->BlobInfo();
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py index 0feb3e6..24caf58 100644 --- a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py +++ b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
@@ -5213,8 +5213,9 @@ // https://heycam.github.io/webidl/#es-DOMException-specialness { v8::Local<v8::FunctionTemplate> intrinsic_error_prototype_interface_template = - v8::FunctionTemplate::New(${isolate}); - intrinsic_error_prototype_interface_template->RemovePrototype(); + v8::FunctionTemplate::New(${isolate}, nullptr, v8::Local<v8::Value>(), + v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); intrinsic_error_prototype_interface_template->SetIntrinsicDataProperty( V8AtomicString(${isolate}, "prototype"), v8::kErrorPrototype); ${interface_function_template}->Inherit( @@ -5222,7 +5223,7 @@ } """)) - if class_like.identifier == "NativeFileSystemDirectoryIterator": + if class_like.identifier == "FileSystemDirectoryIterator": body.append( T("""\ // Temporary @@asyncIterator support for FileSystemDirectoryHandle @@ -5230,8 +5231,9 @@ { v8::Local<v8::FunctionTemplate> intrinsic_iterator_prototype_interface_template = - v8::FunctionTemplate::New(${isolate}); - intrinsic_iterator_prototype_interface_template->RemovePrototype(); + v8::FunctionTemplate::New(${isolate}, nullptr, v8::Local<v8::Value>(), + v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); intrinsic_iterator_prototype_interface_template->SetIntrinsicDataProperty( V8AtomicString(${isolate}, "prototype"), v8::kAsyncIteratorPrototype); ${interface_function_template}->Inherit( @@ -5257,8 +5259,9 @@ { v8::Local<v8::FunctionTemplate> intrinsic_iterator_prototype_interface_template = - v8::FunctionTemplate::New(${isolate}); - intrinsic_iterator_prototype_interface_template->RemovePrototype(); + v8::FunctionTemplate::New(${isolate}, nullptr, v8::Local<v8::Value>(), + v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); intrinsic_iterator_prototype_interface_template->SetIntrinsicDataProperty( V8AtomicString(${isolate}, "prototype"), v8::kIteratorPrototype); ${interface_function_template}->Inherit(
diff --git a/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl b/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl index 8473ac9..e4bc040f 100644 --- a/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl +++ b/third_party/blink/renderer/bindings/templates/interface_base.cc.tmpl
@@ -579,19 +579,21 @@ // so there is no need to reuse this FunctionTemplate and register it in // V8PerIsolateData. v8::Local<v8::FunctionTemplate> intrinsic_iterator_prototype_interface_template = - v8::FunctionTemplate::New(isolate); - intrinsic_iterator_prototype_interface_template->RemovePrototype(); + v8::FunctionTemplate::New(isolate, nullptr, v8::Local<v8::Value>(), + v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); intrinsic_iterator_prototype_interface_template->SetIntrinsicDataProperty( V8AtomicString(isolate, "prototype"), v8::kIteratorPrototype); interface_template->Inherit(intrinsic_iterator_prototype_interface_template); {% endif %} - {% if interface_name == 'NativeFileSystemDirectoryIterator' %} + {% if interface_name == 'FileSystemDirectoryIterator' %} // Temporary @@asyncIterator support for FileSystemDirectoryHandle // TODO(https://crbug.com/1087157): Replace with proper bindings support. v8::Local<v8::FunctionTemplate> intrinsic_iterator_prototype_interface_template = - v8::FunctionTemplate::New(isolate); - intrinsic_iterator_prototype_interface_template->RemovePrototype(); + v8::FunctionTemplate::New(isolate, nullptr, v8::Local<v8::Value>(), + v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); intrinsic_iterator_prototype_interface_template->SetIntrinsicDataProperty( V8AtomicString(isolate, "prototype"), v8::kAsyncIteratorPrototype); interface_template->Inherit(intrinsic_iterator_prototype_interface_template); @@ -614,8 +616,9 @@ // |interface_template| is instantiated, its prototype.__proto__ will point to // |intrinsic_error_prototype_interface_template|'s "prototype" property. v8::Local<v8::FunctionTemplate> intrinsic_error_prototype_interface_template = - v8::FunctionTemplate::New(isolate); - intrinsic_error_prototype_interface_template->RemovePrototype(); + v8::FunctionTemplate::New(isolate, nullptr, v8::Local<v8::Value>(), + v8::Local<v8::Signature>(), 0, + v8::ConstructorBehavior::kThrow); intrinsic_error_prototype_interface_template->SetIntrinsicDataProperty( V8AtomicString(isolate, "prototype"), v8::kErrorPrototype); interface_template->Inherit(intrinsic_error_prototype_interface_template);
diff --git a/third_party/blink/renderer/core/animation/animation_test.cc b/third_party/blink/renderer/core/animation/animation_test.cc index abd458ea..922cec5 100644 --- a/third_party/blink/renderer/core/animation/animation_test.cc +++ b/third_party/blink/renderer/core/animation/animation_test.cc
@@ -231,6 +231,38 @@ class AnimationAnimationTestCompositing : public AnimationAnimationTestNoCompositing { + public: + Animation* CreateAnimation(CSSPropertyID property_id, + String from, + String to) { + Timing timing; + timing.iteration_duration = AnimationTimeDelta::FromSecondsD(30); + + Persistent<StringKeyframe> start_keyframe = + MakeGarbageCollected<StringKeyframe>(); + start_keyframe->SetCSSPropertyValue( + property_id, from, SecureContextMode::kInsecureContext, nullptr); + Persistent<StringKeyframe> end_keyframe = + MakeGarbageCollected<StringKeyframe>(); + end_keyframe->SetCSSPropertyValue( + property_id, to, SecureContextMode::kInsecureContext, nullptr); + + StringKeyframeVector keyframes; + keyframes.push_back(start_keyframe); + keyframes.push_back(end_keyframe); + + Element* element = GetElementById("target"); + auto* model = MakeGarbageCollected<StringKeyframeEffectModel>(keyframes); + + NonThrowableExceptionState exception_state; + DocumentTimeline* timeline = + MakeGarbageCollected<DocumentTimeline>(&GetDocument()); + return Animation::Create( + MakeGarbageCollected<KeyframeEffect>(element, model, timing), timeline, + exception_state); + } + + private: void SetUp() override { EnableCompositing(); AnimationAnimationTestNoCompositing::SetUp(); @@ -1411,34 +1443,8 @@ </div> )HTML"); - // Create KeyframeEffect - Timing timing; - timing.iteration_duration = AnimationTimeDelta::FromSecondsD(30); - - Persistent<StringKeyframe> start_keyframe = - MakeGarbageCollected<StringKeyframe>(); - start_keyframe->SetCSSPropertyValue(CSSPropertyID::kBackgroundColor, "red", - SecureContextMode::kInsecureContext, - nullptr); - Persistent<StringKeyframe> end_keyframe = - MakeGarbageCollected<StringKeyframe>(); - end_keyframe->SetCSSPropertyValue(CSSPropertyID::kBackgroundColor, "green", - SecureContextMode::kInsecureContext, - nullptr); - - StringKeyframeVector keyframes; - keyframes.push_back(start_keyframe); - keyframes.push_back(end_keyframe); - - Element* element = GetElementById("target"); - auto* model = MakeGarbageCollected<StringKeyframeEffectModel>(keyframes); - - NonThrowableExceptionState exception_state; - DocumentTimeline* timeline = - MakeGarbageCollected<DocumentTimeline>(&GetDocument()); - Animation* animation = Animation::Create( - MakeGarbageCollected<KeyframeEffect>(element, model, timing), timeline, - exception_state); + Animation* animation = + CreateAnimation(CSSPropertyID::kBackgroundColor, "red", "green"); UpdateAllLifecyclePhasesForTest(); animation->play(); @@ -1446,6 +1452,143 @@ CompositorAnimations::kNoFailure); } +// crbug.com/1149012 +// Regression test to ensure proper restart logic for composited animations on +// relative transforms after a size change. In this test, the transform depends +// on the width and height of the box and a change to either triggers a restart +// of the animation if running. +TEST_F(AnimationAnimationTestCompositing, + RestartCompositedAnimationOnSizeChange) { + // TODO(crbug.com/389359): Remove forced feature enabling once on by + // default. + ScopedCompositeRelativeKeyframesForTest composite_relative_keyframes(true); + SetBodyInnerHTML(R"HTML( + <div id ="target" + style="width: 100px; height: 200px; will-change: transform"> + </div> + )HTML"); + + Animation* animation = CreateAnimation( + CSSPropertyID::kTransform, "translate(100%, 100%)", "translate(0%, 0%)"); + + UpdateAllLifecyclePhasesForTest(); + animation->play(); + KeyframeEffect* keyframe_effect = + DynamicTo<KeyframeEffect>(animation->effect()); + ASSERT_TRUE(keyframe_effect); + + EXPECT_EQ(animation->CheckCanStartAnimationOnCompositor(nullptr), + CompositorAnimations::kNoFailure); + + GetDocument().GetPendingAnimations().Update(nullptr, true); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + + // Kick the animation out of the play-pending state. + animation->setStartTime(0); + + // No size change and animation does not require a restart. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(100, 200)); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + + // Restart animation on a width change. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(200, 200)); + EXPECT_FALSE(animation->HasActiveAnimationsOnCompositor()); + + GetDocument().GetPendingAnimations().Update(nullptr, true); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + + // Restart animation on a height change. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(200, 300)); + EXPECT_FALSE(animation->HasActiveAnimationsOnCompositor()); +} + +// crbug.com/1149012 +// Regression test to ensure proper restart logic for composited animations on +// relative transforms after a size change. In this test, the transform only +// depends on width and a change to the height does not trigger a restart. +TEST_F(AnimationAnimationTestCompositing, + RestartCompositedAnimationOnWidthChange) { + // TODO(crbug.com/389359): Remove forced feature enabling once on by + // default. + ScopedCompositeRelativeKeyframesForTest composite_relative_keyframes(true); + SetBodyInnerHTML(R"HTML( + <div id ="target" + style="width: 100px; height: 200px; will-change: transform"> + </div> + )HTML"); + + animation = CreateAnimation(CSSPropertyID::kTransform, "translateX(100%)", + "translateX(0%)"); + + UpdateAllLifecyclePhasesForTest(); + animation->play(); + KeyframeEffect* keyframe_effect = + DynamicTo<KeyframeEffect>(animation->effect()); + ASSERT_TRUE(keyframe_effect); + + GetDocument().GetPendingAnimations().Update(nullptr, true); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(100, 200)); + animation->setStartTime(0); + + // Transform is not height dependent and a change to the height does not force + // an animation restart. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(100, 300)); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + + // Width change forces a restart. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(200, 300)); + EXPECT_FALSE(animation->HasActiveAnimationsOnCompositor()); +} + +// crbug.com/1149012 +// Regression test to ensure proper restart logic for composited animations on +// relative transforms after a size change. In this test, the transition only +// affects height and a change to the width does not trigger a restart. +TEST_F(AnimationAnimationTestCompositing, + RestartCompositedAnimationOnHeightChange) { + // TODO(crbug.com/389359): Remove forced feature enabling once on by + // default. + ScopedCompositeRelativeKeyframesForTest composite_relative_keyframes(true); + SetBodyInnerHTML(R"HTML( + <div id ="target" + style="width: 100px; height: 200px; will-change: transform"> + </div> + )HTML"); + + animation = CreateAnimation(CSSPropertyID::kTransform, "translateY(100%)", + "translateY(0%)"); + + UpdateAllLifecyclePhasesForTest(); + animation->play(); + KeyframeEffect* keyframe_effect = + DynamicTo<KeyframeEffect>(animation->effect()); + ASSERT_TRUE(keyframe_effect); + + GetDocument().GetPendingAnimations().Update(nullptr, true); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(100, 200)); + animation->setStartTime(0); + + // Transform is not width dependent and a change to the width does not force + // an animation restart. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(300, 200)); + EXPECT_TRUE(animation->HasActiveAnimationsOnCompositor()); + + // Height change forces a restart. + keyframe_effect->UpdateBoxSizeAndCheckTransformAxisAlignment( + FloatSize(300, 400)); + EXPECT_FALSE(animation->HasActiveAnimationsOnCompositor()); +} + TEST_F(AnimationAnimationTestCompositing, ScrollLinkedAnimationCanBeComposited) { ResetWithCompositedAnimation();
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc index 7880fdb..1ef7eef 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -503,12 +503,10 @@ if (effect_target_size_) { if ((size_dependencies & TransformOperation::kDependsWidth) && (effect_target_size_->Width() != box_size.Width())) - GetAnimation()->RestartAnimationOnCompositor(); + RestartRunningAnimationOnCompositor(); else if ((size_dependencies & TransformOperation::kDependsHeight) && - (effect_target_size_->Width() != box_size.Height())) - GetAnimation()->RestartAnimationOnCompositor(); - } else if (size_dependencies) { - GetAnimation()->RestartAnimationOnCompositor(); + (effect_target_size_->Height() != box_size.Height())) + RestartRunningAnimationOnCompositor(); } } @@ -517,6 +515,19 @@ return preserves_axis_alignment; } +void KeyframeEffect::RestartRunningAnimationOnCompositor() { + Animation* animation = GetAnimation(); + if (!animation) + return; + + // No need to to restart an animation that is in the process of starting up, + // paused or idle. + if (!animation->startTime()) + return; + + animation->RestartAnimationOnCompositor(); +} + bool KeyframeEffect::IsIdentityOrTranslation() const { static const auto** properties = TransformProperties(); for (size_t i = 0; i < num_transform_properties; i++) {
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.h b/third_party/blink/renderer/core/animation/keyframe_effect.h index 3fda832..7e880f5 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect.h +++ b/third_party/blink/renderer/core/animation/keyframe_effect.h
@@ -166,6 +166,7 @@ AnimationTimeDelta time_to_next_iteration) const override; bool HasIncompatibleStyle() const; bool HasMultipleTransformProperties() const; + void RestartRunningAnimationOnCompositor(); Member<Element> effect_target_; Member<Element> target_element_;
diff --git a/third_party/blink/renderer/core/clipboard/data_object.cc b/third_party/blink/renderer/core/clipboard/data_object.cc index 763ca44..e21047f 100644 --- a/third_party/blink/renderer/core/clipboard/data_object.cc +++ b/third_party/blink/renderer/core/clipboard/data_object.cc
@@ -230,10 +230,10 @@ const String& filename, const String& display_name, const String& file_system_id, - scoped_refptr<NativeFileSystemDropData> native_file_system_entry) { + scoped_refptr<FileSystemAccessDropData> file_system_access_entry) { InternalAddFileItem(DataObjectItem::CreateFromFileWithFileSystemId( File::CreateForUserProvidedFile(filename, display_name), file_system_id, - std::move(native_file_system_entry))); + std::move(file_system_access_entry))); } void DataObject::AddSharedBuffer(scoped_refptr<SharedBuffer> buffer, @@ -308,7 +308,7 @@ has_file_system = true; data_object->AddFilename(item.filename_data, item.display_name_data, data.FilesystemId(), - item.native_file_system_entry); + item.file_system_access_entry); break; case WebDragData::Item::kStorageTypeBinaryData: // This should never happen when dragging in.
diff --git a/third_party/blink/renderer/core/clipboard/data_object.h b/third_party/blink/renderer/core/clipboard/data_object.h index b621b8e4..d7982fb 100644 --- a/third_party/blink/renderer/core/clipboard/data_object.h +++ b/third_party/blink/renderer/core/clipboard/data_object.h
@@ -99,8 +99,8 @@ void AddFilename(const String& filename, const String& display_name, const String& file_system_id, - scoped_refptr<NativeFileSystemDropData> - native_file_system_entry = nullptr); + scoped_refptr<FileSystemAccessDropData> + file_system_access_entry = nullptr); // Used for dragging in filesystem from the desktop. void SetFilesystemId(const String& file_system_id) {
diff --git a/third_party/blink/renderer/core/clipboard/data_object_item.cc b/third_party/blink/renderer/core/clipboard/data_object_item.cc index a4aa6c7..030a7c0 100644 --- a/third_party/blink/renderer/core/clipboard/data_object_item.cc +++ b/third_party/blink/renderer/core/clipboard/data_object_item.cc
@@ -63,12 +63,12 @@ DataObjectItem* DataObjectItem::CreateFromFileWithFileSystemId( File* file, const String& file_system_id, - scoped_refptr<NativeFileSystemDropData> native_file_entry) { + scoped_refptr<FileSystemAccessDropData> file_system_access_entry) { DataObjectItem* item = MakeGarbageCollected<DataObjectItem>(kFileKind, file->type()); item->file_ = file; item->file_system_id_ = file_system_id; - item->native_file_system_entry_ = native_file_entry; + item->file_system_access_entry_ = file_system_access_entry; return item; } @@ -226,17 +226,17 @@ } bool DataObjectItem::HasFileSystemAccessEntry() const { - return static_cast<bool>(native_file_system_entry_); + return static_cast<bool>(file_system_access_entry_); } mojo::PendingRemote<mojom::blink::FileSystemAccessDragDropToken> DataObjectItem::CloneFileSystemAccessEntryToken() const { DCHECK(HasFileSystemAccessEntry()); mojo::Remote<mojom::blink::FileSystemAccessDragDropToken> token_cloner( - std::move(native_file_system_entry_->data)); + std::move(file_system_access_entry_->data)); mojo::PendingRemote<mojom::blink::FileSystemAccessDragDropToken> token_clone; token_cloner->Clone(token_clone.InitWithNewPipeAndPassReceiver()); - native_file_system_entry_->data = token_cloner.Unbind(); + file_system_access_entry_->data = token_cloner.Unbind(); return token_clone; }
diff --git a/third_party/blink/renderer/core/clipboard/data_object_item.h b/third_party/blink/renderer/core/clipboard/data_object_item.h index 71706e57d..4ac9450 100644 --- a/third_party/blink/renderer/core/clipboard/data_object_item.h +++ b/third_party/blink/renderer/core/clipboard/data_object_item.h
@@ -59,7 +59,8 @@ static DataObjectItem* CreateFromFileWithFileSystemId( File*, const String& file_system_id, - scoped_refptr<NativeFileSystemDropData> native_file_entry = nullptr); + scoped_refptr<FileSystemAccessDropData> file_system_access_entry = + nullptr); static DataObjectItem* CreateFromURL(const String& url, const String& title); static DataObjectItem* CreateFromHTML(const String& html, const KURL& base_url); @@ -106,7 +107,7 @@ kInternalSource, }; - scoped_refptr<NativeFileSystemDropData> native_file_system_entry_; + scoped_refptr<FileSystemAccessDropData> file_system_access_entry_; DataSource source_; ItemKind kind_; String type_;
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index cf2e127..c9fa0f41 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -697,6 +697,7 @@ "fetch/trust_token.idl", "fileapi/blob_property_bag.idl", "fileapi/file_property_bag.idl", + "frame/impression_params.idl", "frame/is_input_pending_options.idl", "frame/navigator_ua_brand_version.idl", "frame/reporting_observer_options.idl",
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni index 9a8e2aae..8f62f083 100644 --- a/third_party/blink/renderer/core/css/build.gni +++ b/third_party/blink/renderer/core/css/build.gni
@@ -393,8 +393,6 @@ "media_values_cached.h", "media_values_dynamic.cc", "media_values_dynamic.h", - "media_values_initial_viewport.cc", - "media_values_initial_viewport.h", "native_paint_image_generator.h", "offscreen_font_selector.cc", "offscreen_font_selector.h", @@ -663,7 +661,6 @@ "media_query_list_test.cc", "media_query_matcher_test.cc", "media_query_set_test.cc", - "media_values_initial_viewport_test.cc", "media_values_test.cc", "parser/css_lazy_parsing_test.cc", "parser/css_parser_fast_paths_test.cc",
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc index 74a7f48..a1068ac 100644 --- a/third_party/blink/renderer/core/css/css_selector.cc +++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -245,6 +245,10 @@ return kPseudoIdResizer; case kPseudoTargetText: return kPseudoIdTargetText; + case kPseudoSpellingError: + return kPseudoIdSpellingError; + case kPseudoGrammarError: + return kPseudoIdGrammarError; case kPseudoUnknown: case kPseudoEmpty: case kPseudoFirstChild: @@ -411,6 +415,7 @@ {"focus-within", CSSSelector::kPseudoFocusWithin}, {"fullscreen", CSSSelector::kPseudoFullscreen}, {"future", CSSSelector::kPseudoFutureCue}, + {"grammar-error", CSSSelector::kPseudoGrammarError}, {"horizontal", CSSSelector::kPseudoHorizontal}, {"host", CSSSelector::kPseudoHost}, {"hover", CSSSelector::kPseudoHover}, @@ -440,6 +445,7 @@ {"scope", CSSSelector::kPseudoScope}, {"selection", CSSSelector::kPseudoSelection}, {"single-button", CSSSelector::kPseudoSingleButton}, + {"spelling-error", CSSSelector::kPseudoSpellingError}, {"start", CSSSelector::kPseudoStart}, {"target", CSSSelector::kPseudoTarget}, {"target-text", CSSSelector::kPseudoTargetText}, @@ -521,6 +527,12 @@ return CSSSelector::kPseudoUnknown; } + if ((match->type == CSSSelector::kPseudoSpellingError || + match->type == CSSSelector::kPseudoGrammarError) && + !RuntimeEnabledFeatures::CSSSpellingGrammarErrorsEnabled()) { + return CSSSelector::kPseudoUnknown; + } + return static_cast<CSSSelector::PseudoType>(match->type); } @@ -630,6 +642,8 @@ case kPseudoWebKitCustomElement: case kPseudoSlotted: case kPseudoTargetText: + case kPseudoSpellingError: + case kPseudoGrammarError: if (match_ != kPseudoElement) pseudo_type_ = kPseudoUnknown; break; @@ -1121,6 +1135,8 @@ case kPseudoFirstLetter: case kPseudoSelection: case kPseudoTargetText: + case kPseudoSpellingError: + case kPseudoGrammarError: return true; default: return false;
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h index a60e66d4..9287a7c 100644 --- a/third_party/blink/renderer/core/css/css_selector.h +++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -285,6 +285,8 @@ kPseudoVideoPersistentAncestor, kPseudoTargetText, kPseudoDir, + kPseudoSpellingError, + kPseudoGrammarError, }; enum class AttributeMatchType {
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.cc b/third_party/blink/renderer/core/css/css_style_sheet.cc index bdf00ae..6fe5978 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet.cc +++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -37,6 +37,7 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/frame/deprecation.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/html/html_link_element.h" #include "third_party/blink/renderer/core/html/html_style_element.h" #include "third_party/blink/renderer/core/html_names.h" @@ -137,9 +138,15 @@ const KURL& base_url, const TextPosition& start_position, const WTF::TextEncoding& encoding) { + Document& owner_node_document = owner_node.GetDocument(); auto* parser_context = MakeGarbageCollected<CSSParserContext>( - owner_node.GetDocument(), owner_node.GetDocument().BaseURL(), - true /* origin_clean */, owner_node.GetDocument().GetReferrerPolicy(), + owner_node_document, owner_node_document.BaseURL(), + true /* origin_clean */, + Referrer( + owner_node_document.GetExecutionContext() + ? owner_node_document.GetExecutionContext()->OutgoingReferrer() + : String(), // GetExecutionContext() only returns null in tests. + owner_node.GetDocument().GetReferrerPolicy()), encoding); if (AdTracker::IsAdScriptExecutingInDocument(&owner_node.GetDocument())) parser_context->SetIsAdRelated();
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.cc b/third_party/blink/renderer/core/css/media_query_evaluator.cc index 697684dc..f02ca798 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator.cc
@@ -47,7 +47,6 @@ #include "third_party/blink/renderer/core/css/media_list.h" #include "third_party/blink/renderer/core/css/media_query.h" #include "third_party/blink/renderer/core/css/media_values_dynamic.h" -#include "third_party/blink/renderer/core/css/media_values_initial_viewport.h" #include "third_party/blink/renderer/core/css/resolver/media_query_result.h" #include "third_party/blink/renderer/core/css_value_keywords.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -103,12 +102,6 @@ MediaQueryEvaluator::MediaQueryEvaluator(const MediaValues& media_values) : media_values_(media_values.Copy()) {} -MediaQueryEvaluator::MediaQueryEvaluator( - MediaValuesInitialViewport* media_values) - : media_values_(media_values) { - DCHECK(media_values); -} - MediaQueryEvaluator::~MediaQueryEvaluator() = default; void MediaQueryEvaluator::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.h b/third_party/blink/renderer/core/css/media_query_evaluator.h index 3a2f09d..c3ed951 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator.h +++ b/third_party/blink/renderer/core/css/media_query_evaluator.h
@@ -33,6 +33,7 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { + class LocalFrame; class MediaQuery; class MediaQueryExp; @@ -40,7 +41,6 @@ class MediaQuerySet; class MediaQuerySetResult; class MediaValues; -class MediaValuesInitialViewport; using MediaQueryResultList = Vector<MediaQueryResult>; @@ -74,7 +74,6 @@ // values. explicit MediaQueryEvaluator(const MediaValues&); - explicit MediaQueryEvaluator(MediaValuesInitialViewport*); MediaQueryEvaluator(const MediaQueryEvaluator&) = delete; MediaQueryEvaluator& operator=(const MediaQueryEvaluator&) = delete;
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc index d473d62..54654c0c 100644 --- a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc +++ b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
@@ -10,7 +10,6 @@ #include "third_party/blink/renderer/core/css/media_list.h" #include "third_party/blink/renderer/core/css/media_values.h" #include "third_party/blink/renderer/core/css/media_values_cached.h" -#include "third_party/blink/renderer/core/css/media_values_initial_viewport.h" #include "third_party/blink/renderer/core/css/parser/css_tokenizer.h" #include "third_party/blink/renderer/core/css/parser/media_query_parser.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -474,20 +473,6 @@ media_query_evaluator); } -TEST(MediaQueryEvaluatorTest, InitialViewport) { - auto page_holder = std::make_unique<DummyPageHolder>(IntSize(500, 500)); - page_holder->GetFrameView().SetMediaType(media_type_names::kScreen); - page_holder->GetFrameView().SetLayoutSizeFixedToFrameSize(false); - page_holder->GetFrameView().SetInitialViewportSize(IntSize(500, 500)); - page_holder->GetFrameView().SetLayoutSize(IntSize(800, 800)); - page_holder->GetFrameView().SetFrameRect(IntRect(0, 0, 800, 800)); - - MediaQueryEvaluator media_query_evaluator( - MakeGarbageCollected<MediaValuesInitialViewport>( - page_holder->GetFrame())); - TestMQEvaluator(g_viewport_test_cases, media_query_evaluator); -} - TEST(MediaQueryEvaluatorTest, DynamicImmersive) { auto page_holder = std::make_unique<DummyPageHolder>(IntSize(500, 500)); page_holder->GetFrameView().SetMediaType(media_type_names::kScreen);
diff --git a/third_party/blink/renderer/core/css/media_values_initial_viewport.cc b/third_party/blink/renderer/core/css/media_values_initial_viewport.cc deleted file mode 100644 index e81c5cc7..0000000 --- a/third_party/blink/renderer/core/css/media_values_initial_viewport.cc +++ /dev/null
@@ -1,26 +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 "third_party/blink/renderer/core/css/media_values_initial_viewport.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/local_frame_view.h" - -namespace blink { - -MediaValuesInitialViewport::MediaValuesInitialViewport(LocalFrame& frame) - : MediaValuesDynamic(&frame) {} - -double MediaValuesInitialViewport::ViewportWidth() const { - DCHECK(frame_->View()); - return frame_->View()->InitialViewportWidth(); -} - -double MediaValuesInitialViewport::ViewportHeight() const { - DCHECK(frame_->View()); - return frame_->View()->InitialViewportHeight(); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/css/media_values_initial_viewport.h b/third_party/blink/renderer/core/css/media_values_initial_viewport.h deleted file mode 100644 index 3aed1d5..0000000 --- a/third_party/blink/renderer/core/css/media_values_initial_viewport.h +++ /dev/null
@@ -1,22 +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 THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_INITIAL_VIEWPORT_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_INITIAL_VIEWPORT_H_ - -#include "third_party/blink/renderer/core/css/media_values_dynamic.h" - -namespace blink { - -class CORE_EXPORT MediaValuesInitialViewport final : public MediaValuesDynamic { - public: - explicit MediaValuesInitialViewport(LocalFrame&); - - double ViewportWidth() const override; - double ViewportHeight() const override; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_MEDIA_VALUES_INITIAL_VIEWPORT_H_
diff --git a/third_party/blink/renderer/core/css/media_values_initial_viewport_test.cc b/third_party/blink/renderer/core/css/media_values_initial_viewport_test.cc deleted file mode 100644 index 6b68f43..0000000 --- a/third_party/blink/renderer/core/css/media_values_initial_viewport_test.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 "third_party/blink/renderer/core/css/media_values_initial_viewport.h" - -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/testing/page_test_base.h" - -namespace blink { - -class MediaValuesInitialViewportTest : public PageTestBase { - private: - void SetUp() override { - PageTestBase::SetUp(IntSize(320, 480)); - GetDocument().View()->SetInitialViewportSize(IntSize(320, 480)); - } -}; - -TEST_F(MediaValuesInitialViewportTest, InitialViewportSize) { - LocalFrameView* view = GetDocument().View(); - ASSERT_TRUE(view); - EXPECT_TRUE(view->LayoutSizeFixedToFrameSize()); - - auto* media_values = MakeGarbageCollected<MediaValuesInitialViewport>( - *GetDocument().GetFrame()); - EXPECT_EQ(320, media_values->ViewportWidth()); - EXPECT_EQ(480, media_values->ViewportHeight()); - - view->SetLayoutSizeFixedToFrameSize(false); - view->SetLayoutSize(IntSize(800, 600)); - EXPECT_EQ(320, media_values->ViewportWidth()); - EXPECT_EQ(480, media_values->ViewportHeight()); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_context.cc b/third_party/blink/renderer/core/css/parser/css_parser_context.cc index 2587550..dd8e486 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_context.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_context.cc
@@ -53,27 +53,25 @@ is_ad_related_ = other->is_ad_related_; } -CSSParserContext::CSSParserContext( - const CSSParserContext* other, - const KURL& base_url, - bool origin_clean, - network::mojom::ReferrerPolicy referrer_policy, - const WTF::TextEncoding& charset, - const Document* use_counter_document) - : CSSParserContext( - base_url, - origin_clean, - charset, - other->mode_, - other->match_mode_, - other->profile_, - Referrer(base_url.StrippedForUseAsReferrer(), referrer_policy), - other->is_html_document_, - other->use_legacy_background_size_shorthand_behavior_, - other->secure_context_mode_, - other->world_, - use_counter_document, - other->resource_fetch_restriction_) { +CSSParserContext::CSSParserContext(const CSSParserContext* other, + const KURL& base_url, + bool origin_clean, + const Referrer& referrer, + const WTF::TextEncoding& charset, + const Document* use_counter_document) + : CSSParserContext(base_url, + origin_clean, + charset, + other->mode_, + other->match_mode_, + other->profile_, + referrer, + other->is_html_document_, + other->use_legacy_background_size_shorthand_behavior_, + other->secure_context_mode_, + other->world_, + use_counter_document, + other->resource_fetch_restriction_) { is_ad_related_ = other->is_ad_related_; } @@ -96,18 +94,23 @@ ResourceFetchRestriction::kNone) {} CSSParserContext::CSSParserContext(const Document& document) - : CSSParserContext(document, - document.BaseURL(), - true /* origin_clean */, - document.GetReferrerPolicy(), - WTF::TextEncoding(), - kLiveProfile) {} + : CSSParserContext( + document, + document.BaseURL(), + true /* origin_clean */, + Referrer(document.GetExecutionContext() + ? document.GetExecutionContext()->OutgoingReferrer() + : String(), // GetExecutionContext() only returns null + // in tests. + document.GetReferrerPolicy()), + WTF::TextEncoding(), + kLiveProfile) {} CSSParserContext::CSSParserContext( const Document& document, const KURL& base_url_override, bool origin_clean, - network::mojom::ReferrerPolicy referrer_policy_override, + const Referrer& referrer, const WTF::TextEncoding& charset, SelectorProfile profile, enum ResourceFetchRestriction resource_fetch_restriction) @@ -122,8 +125,7 @@ : kHTMLStandardMode) : document.InQuirksMode() ? kHTMLQuirksMode : kHTMLStandardMode, profile, - Referrer(base_url_override.StrippedForUseAsReferrer(), - referrer_policy_override), + referrer, IsA<HTMLDocument>(document), document.GetSettings() ? document.GetSettings()
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_context.h b/third_party/blink/renderer/core/css/parser/css_parser_context.h index 3af0d8fa..9b654de 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_context.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_context.h
@@ -42,10 +42,15 @@ explicit CSSParserContext(const CSSParserContext* other, const Document* use_counter_document = nullptr); + // Creates a context with most of its constructor attributes provided by + // copying from |other|, except that the remaining constructor arguments take + // precedence over the corresponding characteristics of |other|. This is + // useful for initializing @imported sheets' contexts, which inherit most of + // their characteristics from their parents. CSSParserContext(const CSSParserContext* other, const KURL& base_url_override, bool origin_clean, - network::mojom::ReferrerPolicy referrer_policy_override, + const Referrer& referrer, const WTF::TextEncoding& charset_override, const Document* use_counter_document); CSSParserContext(CSSParserMode, @@ -56,7 +61,7 @@ CSSParserContext(const Document&, const KURL& base_url_override, bool origin_clean, - network::mojom::ReferrerPolicy referrer_policy_override, + const Referrer& referrer, const WTF::TextEncoding& charset = WTF::TextEncoding(), SelectorProfile = kLiveProfile, ResourceFetchRestriction resource_fetch_restriction = @@ -71,7 +76,7 @@ CSSParserMode, CSSParserMode match_mode, SelectorProfile, - const Referrer&, + const Referrer& referrer, bool is_html_document, bool use_legacy_background_size_shorthand_behavior, SecureContextMode,
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc index 55c709a2..b280d8e 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -734,10 +734,11 @@ AdjustOverflow(style); // overflow-clip-margin only applies if 'overflow: clip' is set along both - // axis. - if (style.OverflowX() != EOverflow::kClip || - style.OverflowY() != EOverflow::kClip) { - style.SetOverflowClipMargin(LayoutUnit()); + // axis or 'contain: paint'. + if (!style.ContainsPaint() && !(style.OverflowX() == EOverflow::kClip && + style.OverflowY() == EOverflow::kClip)) { + style.SetOverflowClipMargin( + ComputedStyleInitialValues::InitialOverflowClipMargin()); } if (StopPropagateTextDecorations(style, element))
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster_test.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster_test.cc index 5af052b..f7dbe27b9 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster_test.cc
@@ -128,6 +128,7 @@ overflow-clip-margin: 1px;'> <div id='vishidden' style='overflow-x: visible; overflow-y: hidden; overflow-clip-margin: 1px;'> + <div id='containpaint' style='contain: paint; overflow-clip-margin: 1px;'> </div> )HTML"); UpdateAllLifecyclePhasesForTest(); @@ -173,6 +174,11 @@ EXPECT_EQ(EOverflow::kHidden, target->GetComputedStyle()->OverflowX()); EXPECT_EQ(EOverflow::kAuto, target->GetComputedStyle()->OverflowY()); EXPECT_EQ(LayoutUnit(), target->GetComputedStyle()->OverflowClipMargin()); + + target = GetDocument().getElementById("containpaint"); + ASSERT_TRUE(target); + EXPECT_TRUE(target->GetComputedStyle()->ContainsPaint()); + EXPECT_EQ(LayoutUnit(1), target->GetComputedStyle()->OverflowClipMargin()); } TEST_F(StyleAdjusterTest, TouchActionContentEditableArea) {
diff --git a/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.cc b/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.cc index 1501af0..59e9698 100644 --- a/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.cc
@@ -36,7 +36,6 @@ #include "third_party/blink/renderer/core/css/css_style_sheet.h" #include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h" #include "third_party/blink/renderer/core/css/document_style_sheet_collection.h" -#include "third_party/blink/renderer/core/css/media_values_initial_viewport.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" #include "third_party/blink/renderer/core/css/style_rule.h" #include "third_party/blink/renderer/core/css/style_rule_import.h" @@ -50,7 +49,6 @@ #include "third_party/blink/renderer/core/frame/viewport_data.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/page/viewport_description.h" namespace blink { @@ -67,8 +65,6 @@ ViewportStyleResolver::ViewportStyleResolver(Document& document) : document_(document) { DCHECK(document.GetFrame()); - initial_viewport_medium_ = MakeGarbageCollected<MediaQueryEvaluator>( - MakeGarbageCollected<MediaValuesInitialViewport>(*document.GetFrame())); } void ViewportStyleResolver::Reset() { @@ -329,7 +325,6 @@ void ViewportStyleResolver::Trace(Visitor* visitor) const { visitor->Trace(document_); visitor->Trace(property_set_); - visitor->Trace(initial_viewport_medium_); } } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.h b/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.h index f3a84a9..d12a8068 100644 --- a/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.h +++ b/third_party/blink/renderer/core/css/resolver/viewport_style_resolver.h
@@ -75,7 +75,6 @@ Member<Document> document_; Member<MutableCSSPropertyValueSet> property_set_; - Member<MediaQueryEvaluator> initial_viewport_medium_; scoped_refptr<ComputedStyle> initial_style_; bool has_viewport_units_ = false; UpdateType needs_update_ = kCollectRules;
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc index d27e923..0c26747 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -180,6 +180,8 @@ case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: case CSSSelector::kPseudoTargetText: + case CSSSelector::kPseudoSpellingError: + case CSSSelector::kPseudoGrammarError: return true; case CSSSelector::kPseudoUnknown: case CSSSelector::kPseudoLeftPage:
diff --git a/third_party/blink/renderer/core/css/selector_query.cc b/third_party/blink/renderer/core/css/selector_query.cc index c7d6966..2b29519e 100644 --- a/third_party/blink/renderer/core/css/selector_query.cc +++ b/third_party/blink/renderer/core/css/selector_query.cc
@@ -466,9 +466,8 @@ CSSSelectorList selector_list = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( - document, document.BaseURL(), true /* origin_clean */, - document.GetReferrerPolicy(), WTF::TextEncoding(), - CSSParserContext::kSnapshotProfile), + document, document.BaseURL(), true /* origin_clean */, Referrer(), + WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), nullptr, selectors); if (!selector_list.First()) {
diff --git a/third_party/blink/renderer/core/css/selector_query_test.cc b/third_party/blink/renderer/core/css/selector_query_test.cc index 1b17ed984..54234b9 100644 --- a/third_party/blink/renderer/core/css/selector_query_test.cc +++ b/third_party/blink/renderer/core/css/selector_query_test.cc
@@ -72,9 +72,8 @@ CSSSelectorList selector_list = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( - *document, NullURL(), true /* origin_clean */, - network::mojom::ReferrerPolicy::kDefault, WTF::TextEncoding(), - CSSParserContext::kSnapshotProfile), + *document, NullURL(), true /* origin_clean */, Referrer(), + WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), nullptr, "span::before"); std::unique_ptr<SelectorQuery> query = SelectorQuery::Adopt(std::move(selector_list)); @@ -83,9 +82,8 @@ selector_list = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( - *document, NullURL(), true /* origin_clean */, - network::mojom::ReferrerPolicy::kDefault, WTF::TextEncoding(), - CSSParserContext::kSnapshotProfile), + *document, NullURL(), true /* origin_clean */, Referrer(), + WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), nullptr, "span"); query = SelectorQuery::Adopt(std::move(selector_list)); elm = query->QueryFirst(*document); @@ -103,9 +101,8 @@ CSSSelectorList selector_list = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( - *document, NullURL(), true /* origin_clean */, - network::mojom::ReferrerPolicy::kDefault, WTF::TextEncoding(), - CSSParserContext::kSnapshotProfile), + *document, NullURL(), true /* origin_clean */, Referrer(), + WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), nullptr, "p:last-of-type"); std::unique_ptr<SelectorQuery> query = SelectorQuery::Adopt(std::move(selector_list));
diff --git a/third_party/blink/renderer/core/css/style_rule_import.cc b/third_party/blink/renderer/core/css/style_rule_import.cc index c07f3449..3b94a9f 100644 --- a/third_party/blink/renderer/core/css/style_rule_import.cc +++ b/third_party/blink/renderer/core/css/style_rule_import.cc
@@ -83,8 +83,9 @@ CSSParserContext* context = MakeGarbageCollected<CSSParserContext>( parent_context, cached_style_sheet->GetResponse().ResponseUrl(), cached_style_sheet->GetResponse().IsCorsSameOrigin(), - cached_style_sheet->GetReferrerPolicy(), cached_style_sheet->Encoding(), - document); + Referrer(cached_style_sheet->GetResponse().ResponseUrl(), + cached_style_sheet->GetReferrerPolicy()), + cached_style_sheet->Encoding(), document); if (cached_style_sheet->GetResourceRequest().IsAdResource()) context->SetIsAdRelated();
diff --git a/third_party/blink/renderer/core/dom/processing_instruction.cc b/third_party/blink/renderer/core/dom/processing_instruction.cc index d779cd7e..63f6777b 100644 --- a/third_party/blink/renderer/core/dom/processing_instruction.cc +++ b/third_party/blink/renderer/core/dom/processing_instruction.cc
@@ -206,7 +206,9 @@ auto* parser_context = MakeGarbageCollected<CSSParserContext>( GetDocument(), style_resource->GetResponse().ResponseUrl(), style_resource->GetResponse().IsCorsSameOrigin(), - style_resource->GetReferrerPolicy(), style_resource->Encoding()); + Referrer(style_resource->GetResponse().ResponseUrl(), + style_resource->GetReferrerPolicy()), + style_resource->Encoding()); if (style_resource->GetResourceRequest().IsAdResource()) parser_context->SetIsAdRelated();
diff --git a/third_party/blink/renderer/core/editing/visible_position.cc b/third_party/blink/renderer/core/editing/visible_position.cc index b4943579..8d5860f 100644 --- a/third_party/blink/renderer/core/editing/visible_position.cc +++ b/third_party/blink/renderer/core/editing/visible_position.cc
@@ -82,55 +82,36 @@ DocumentLifecycle::DisallowTransitionScope disallow_transition( document.Lifecycle()); - // Find the canonical position with a backward preference. - const PositionWithAffinityTemplate<Strategy> backward_position = - SnapBackward(position_with_affinity.GetPosition()); - if (backward_position.IsNull()) + const PositionTemplate<Strategy> deep_position = + CanonicalPositionOf(position_with_affinity.GetPosition()); + if (deep_position.IsNull()) return VisiblePositionTemplate<Strategy>(); - const PositionWithAffinityTemplate<Strategy> backward_position_upstream( - backward_position.GetPosition(), TextAffinity::kUpstream); - const PositionWithAffinityTemplate<Strategy> backward_position_downstream( - backward_position.GetPosition(), TextAffinity::kDownstream); + const PositionWithAffinityTemplate<Strategy> downstream_position( + deep_position); + if (position_with_affinity.Affinity() == TextAffinity::kDownstream) + return VisiblePositionTemplate<Strategy>(downstream_position); if (RuntimeEnabledFeatures::BidiCaretAffinityEnabled() && - NGInlineFormattingContextOf(backward_position.GetPosition())) { - if (position_with_affinity.Affinity() == TextAffinity::kDownstream) - return VisiblePositionTemplate<Strategy>(backward_position_downstream); + NGInlineFormattingContextOf(deep_position)) { // When not at a line wrap or bidi boundary, make sure to end up with // |TextAffinity::Downstream| affinity. - if (AbsoluteCaretBoundsOf(backward_position_upstream) == - AbsoluteCaretBoundsOf(backward_position_downstream)) { - return VisiblePositionTemplate<Strategy>(backward_position_downstream); + const PositionWithAffinityTemplate<Strategy> upstream_position( + deep_position, TextAffinity::kUpstream); + + if (AbsoluteCaretBoundsOf(downstream_position) != + AbsoluteCaretBoundsOf(upstream_position)) { + return VisiblePositionTemplate<Strategy>(upstream_position); } - return VisiblePositionTemplate<Strategy>(backward_position_upstream); + return VisiblePositionTemplate<Strategy>(downstream_position); } - // Find the canonical position with a forward preference. If backward_position - // has a downstream affinity, it means that we couldn't find any backward - // candidate, so they must be equal and we can avoid calling SnapForward(). - // The forward canonical position can't be null because we already checked - // that the backward one is not null. - const PositionWithAffinityTemplate<Strategy> forward_position = - backward_position.Affinity() == TextAffinity::kDownstream - ? backward_position - : SnapForward(position_with_affinity.GetPosition()); - DCHECK(forward_position.IsNotNull()); - - // Fast path to avoid slow InSameLine() below in common cases. - if (position_with_affinity.Affinity() == TextAffinity::kDownstream && - backward_position_downstream == forward_position) { - return VisiblePositionTemplate<Strategy>(backward_position_downstream); - } - - // When not at a line wrap, make sure to end up with the backward canonical - // position with |TextAffinity::Downstream| affinity. - if (InSameLine(backward_position_upstream, forward_position)) - return VisiblePositionTemplate<Strategy>(backward_position_downstream); - if (position_with_affinity.Affinity() == TextAffinity::kUpstream) - return VisiblePositionTemplate<Strategy>(backward_position_upstream); - if (StartOfLine(forward_position).IsNull()) - return VisiblePositionTemplate<Strategy>(backward_position_downstream); - return VisiblePositionTemplate<Strategy>(forward_position); + // When not at a line wrap, make sure to end up with + // |TextAffinity::Downstream| affinity. + const PositionWithAffinityTemplate<Strategy> upstream_position( + deep_position, TextAffinity::kUpstream); + if (InSameLine(downstream_position, upstream_position)) + return VisiblePositionTemplate<Strategy>(downstream_position); + return VisiblePositionTemplate<Strategy>(upstream_position); } template <typename Strategy>
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 a49a4901..58fd788 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -3381,7 +3381,8 @@ return; } if (root_layer_exists) { - UpdateDeviceEmulationTransform(); + if (!device_emulation_transform_.IsIdentity()) + UpdateDeviceEmulationTransform(); } else { // When the document in an already-attached main frame is being replaced by // a navigation then DidChangeRootLayer(false) will be called. Since we are @@ -3459,13 +3460,18 @@ void WebViewImpl::UpdateDeviceEmulationTransform() { GetPage()->GetVisualViewport().SetNeedsPaintPropertyUpdate(); - if (MainFrameImpl()) { + if (auto* main_frame = MainFrameImpl()) { // When the device emulation transform is updated, to avoid incorrect // scales and fuzzy raster from the compositor, force all content to // pick ideal raster scales. // TODO(wjmaclean): This is only done on the main frame's widget currently, // it should update all local frames. - MainFrameImpl()->FrameWidgetImpl()->SetNeedsRecalculateRasterScales(); + main_frame->FrameWidgetImpl()->SetNeedsRecalculateRasterScales(); + + // Device emulation transform also affects the overriding visible rect + // which is used as the overflow rect of the main frame layout view. + if (auto* view = main_frame->GetFrameView()) + view->SetNeedsPaintPropertyUpdate(); } }
diff --git a/third_party/blink/renderer/core/frame/impression_params.idl b/third_party/blink/renderer/core/frame/impression_params.idl new file mode 100644 index 0000000..3e25e357 --- /dev/null +++ b/third_party/blink/renderer/core/frame/impression_params.idl
@@ -0,0 +1,11 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// An ImpressionParams object represents registration info for an impression for the Conversion Measurement API. These mirror the conversion measurement attributes exposed HTML anchor elements. See https://github.com/WICG/conversion-measurement-api/blob/master/README.md for more information. +dictionary ImpressionParams { + required DOMString impressionData; + required USVString conversionDestination; + USVString reportingOrigin; + unsigned long long impressionExpiry; +};
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 cb4b823..f1e2b20 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -46,6 +46,7 @@ #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/source_location.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_impression_params.h" #include "third_party/blink/renderer/bindings/core/v8/v8_scroll_to_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_void_function.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h" @@ -94,6 +95,7 @@ #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/html/conversion_measurement_parsing.h" #include "third_party/blink/renderer/core/html/custom/custom_element_registry.h" #include "third_party/blink/renderer/core/html/forms/form_controller.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" @@ -607,25 +609,29 @@ } Document* LocalDOMWindow::InstallNewDocument(const DocumentInit& init) { - DCHECK_EQ(init.GetWindow(), this); + // Blink should never attempt to install a new Document to a LocalDOMWindow + // that's not attached to a LocalFrame. + DCHECK(GetFrame()); + // Either: + // - `this` should be a new LocalDOMWindow, that has never had a Document + // associated with it or + // - `this` is being reused, and the previous Document has been disassociated + // via `ClearForReuse()`. DCHECK(!document_); + DCHECK_EQ(init.GetWindow(), this); + document_ = init.CreateDocument(); document_->Initialize(); - if (!GetFrame()) - return document_; - GetScriptController().UpdateDocument(); document_->GetViewportData().UpdateViewportDescription(); - if (FrameScheduler* frame_scheduler = GetFrame()->GetFrameScheduler()) { - frame_scheduler->TraceUrlChange(document_->Url().GetString()); - frame_scheduler->SetCrossOriginToMainFrame( - GetFrame()->IsCrossOriginToMainFrame()); - } - if (GetFrame()->GetPage() && GetFrame()->View()) { - GetFrame()->GetPage()->GetChromeClient().InstallSupplements(*GetFrame()); - } + auto* frame_scheduler = GetFrame()->GetFrameScheduler(); + frame_scheduler->TraceUrlChange(document_->Url().GetString()); + frame_scheduler->SetCrossOriginToMainFrame( + GetFrame()->IsCrossOriginToMainFrame()); + + GetFrame()->GetPage()->GetChromeClient().InstallSupplements(*GetFrame()); return document_; } @@ -1912,6 +1918,24 @@ const AtomicString& target, const String& features, ExceptionState& exception_state) { + return open(isolate, url_string, target, features, + nullptr /* impression_params */, exception_state); +} + +DOMWindow* LocalDOMWindow::open(v8::Isolate* isolate, + const String& url_string, + const AtomicString& target, + const String& features, + const ImpressionParams* impression_params, + ExceptionState& exception_state) { + if (!RuntimeEnabledFeatures::ConversionMeasurementEnabled(this)) { + // The usage of `impression_params` is gated on a runtime enabled feature + // in the implementation rather than in the IDL definition, because the + // RuntimeEnabled extended attribute cannot be used with an operation + // overload. + impression_params = nullptr; + } + LocalDOMWindow* incumbent_window = IncumbentDOMWindow(isolate); LocalDOMWindow* entered_window = EnteredDOMWindow(isolate); @@ -1967,10 +1991,17 @@ frame_request.GetResourceRequest().SetReferrerPolicy( referrer.referrer_policy); - frame_request.GetResourceRequest().SetHasUserGesture( - LocalFrame::HasTransientUserActivation(GetFrame())); + bool has_user_gesture = LocalFrame::HasTransientUserActivation(GetFrame()); + frame_request.GetResourceRequest().SetHasUserGesture(has_user_gesture); GetFrame()->MaybeLogAdClickNavigation(); + if (has_user_gesture && impression_params) { + base::Optional<WebImpression> impression = + GetImpressionForParams(incumbent_window, impression_params); + if (impression) + frame_request.SetImpression(*impression); + } + FrameTree::FindResult result = GetFrame()->Tree().FindOrCreateFrameForNavigation( frame_request, target.IsEmpty() ? "_blank" : target);
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h index e83e57a..4e028a6 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.h +++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -64,6 +64,7 @@ class FrameConsole; class History; class IdleRequestOptions; +class ImpressionParams; class MediaQueryList; class MessageEvent; class Modulator; @@ -347,6 +348,13 @@ const String& features, ExceptionState&); + DOMWindow* open(v8::Isolate*, + const String& url_string, + const AtomicString& target, + const String& features, + const ImpressionParams* impression_params, + ExceptionState&); + FrameConsole* GetFrameConsole() const; void PrintErrorMessage(const String&) const;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index b11ef956..bc44c082 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -513,6 +513,7 @@ visitor->Trace(text_fragment_selector_generator_); visitor->Trace(saved_scroll_offsets_); visitor->Trace(background_color_paint_image_generator_); + visitor->Trace(window_controls_overlay_rect_); Frame::Trace(visitor); Supplementable<LocalFrame>::Trace(visitor); } @@ -1992,6 +1993,9 @@ if (GetDocument()->IsPaintingPreview()) return false; + if (ShouldUsePrintingLayout()) + return false; + if (IsMainFrame()) return GetSettings()->GetMainFrameClipsContent(); // By default clip to viewport. @@ -2757,6 +2761,14 @@ animate); } +void LocalFrame::UpdateWindowControlsOverlay( + const gfx::Rect& window_controls_overlay_rect) { + const auto& rect = window_controls_overlay_rect; + window_controls_overlay_rect_ = + DOMRect::Create(rect.x(), rect.y(), rect.width(), rect.height()); + is_window_controls_overlay_visible_ = !rect.IsEmpty(); +} + void LocalFrame::RequestFullscreenVideoElement() { // Find the first video element of the frame. for (auto* child = GetDocument()->documentElement(); child;
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 4a77518..cbb67b1 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -65,6 +65,7 @@ #include "third_party/blink/renderer/core/frame/frame_types.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/policy_container.h" +#include "third_party/blink/renderer/core/geometry/dom_rect.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" #include "third_party/blink/renderer/platform/graphics/touch_action.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -698,6 +699,8 @@ void UpdateBrowserControlsState(cc::BrowserControlsState constraints, cc::BrowserControlsState current, bool animate) override; + void UpdateWindowControlsOverlay( + const gfx::Rect& window_controls_overlay_rect) override; // mojom::FullscreenVideoElementHandler implementation: void RequestFullscreenVideoElement() final; @@ -736,6 +739,16 @@ WebURLLoader::DeferType GetLoadDeferType(); bool IsLoadDeferred(); + // For PWAs with display_overrides, these getters are information about the + // titlebar bounds sent over from the browser via UpdateWindowControlsOverlay + // in LocalMainFrame that are needed to persist the lifetime of the frame. + bool IsWindowControlsOverlayVisible() const { + return is_window_controls_overlay_visible_; + } + DOMRect* GetWindowControlsOverlayRect() const { + return window_controls_overlay_rect_; + } + private: friend class FrameNavigationDisabler; FRIEND_TEST_ALL_PREFIXES(LocalFrameTest, CharacterIndexAtPointWithPinchZoom); @@ -970,6 +983,9 @@ TransientAllowFullscreen transient_allow_fullscreen_; std::unique_ptr<PolicyContainer> policy_container_; + + bool is_window_controls_overlay_visible_ = false; + Member<DOMRect> window_controls_overlay_rect_ = DOMRect::Create(0, 0, 0, 0); }; inline FrameLoader& LocalFrame::Loader() const {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 45e54ba0..104082f 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3856,33 +3856,6 @@ SetNeedsLayout(); } -void LocalFrameView::ClipPaintRect(FloatRect* paint_rect) const { - // TODO(wangxianzhu): Support ChromeClient::VisibleContentRectForPainting() - // with CompositeAfterPaint. - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - - // Paint the whole rect if ClipsContent is false, meaning that the whole - // document should be recorded. This occurs if: - // - A paint preview is being captured. - // - WebPreferences::record_whole_document is true. - if (!frame_->ClipsContent()) - return; - - // By default we consider the bounds of the FrameView to be what is considered - // visible for the Frame. - IntRect visible_rect = IntRect(IntPoint(), Size()); - // Non-main frames always clip to their FrameView bounds. Main frames can - // have this behaviour modified by devtools. - if (frame_->IsMainFrame()) { - // If devtools is overriding the viewport, then the FrameView's bounds are - // not what we should paint, instead we should paint inside the bounds - // specified by devtools. - GetPage()->GetChromeClient().OverrideVisibleRectForMainFrame(*frame_, - &visible_rect); - } - paint_rect->Intersect(visible_rect); -} - void LocalFrameView::DidChangeScrollOffset() { GetFrame().Client()->DidChangeScrollOffset(); if (GetFrame().IsMainFrame()) {
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 29dc0e61..7e5d326 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -75,7 +75,6 @@ class ChromeClient; class CompositorAnimationTimeline; class DocumentLifecycle; -class FloatRect; class FloatSize; class FragmentAnchor; class Frame; @@ -502,11 +501,6 @@ void RemoveScrollbar(Scrollbar*); void AddScrollbar(Scrollbar*); - // Clips the provided rect to the visible content area. For this purpose, we - // also query the chrome client for any active overrides to the visible area - // (e.g. DevTool's viewport override). - void ClipPaintRect(FloatRect*) const; - // Indicates the root layer's scroll offset changed since the last frame void SetRootLayerDidScroll() { root_layer_did_scroll_ = true; }
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index e2ef984..1daf044 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -143,6 +143,11 @@ DCHECK(!view_); } +void RemoteFrame::DetachAndDispose() { + DCHECK(!IsMainFrame()); + Detach(FrameDetachType::kRemove); +} + void RemoteFrame::Trace(Visitor* visitor) const { visitor->Trace(view_); visitor->Trace(security_context_);
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index 9147a3f..6b9b569 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -167,6 +167,7 @@ void DidUpdateFramePolicy(const FramePolicy& frame_policy) override; void UpdateOpener(const base::Optional<base::UnguessableToken>& opener_frame_token) override; + void DetachAndDispose() override; // Called only when this frame has a local frame owner. IntSize GetMainFrameViewportSize() const override;
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5 index 29ea43a..936f088 100644 --- a/third_party/blink/renderer/core/frame/settings.json5 +++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -251,7 +251,7 @@ { name: "threadedScrollingEnabled", initial: true, - invalidate: ["Style"], + invalidate: ["Style", "ViewportPaintProperties"], }, // Used in web tests for gesture tap highlights. Makes the highlights square
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index a9b65a4..31c740e 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -2119,22 +2119,28 @@ // This class should be called at most once per commit. WebPerformance perf = LocalRootImpl()->Performance(); auto metrics = std::make_unique<cc::WebVitalMetrics>(); - if (perf.FirstInputDelay().has_value()) - metrics->first_input_delay = *perf.FirstInputDelay(); + if (perf.FirstInputDelay().has_value()) { + metrics->first_input_delay = perf.FirstInputDelay().value(); + metrics->has_fid = true; + } base::TimeTicks start = perf.NavigationStartAsMonotonicTime(); base::TimeTicks largest_contentful_paint = perf.LargestContentfulPaintAsMonotonicTime(); - if (largest_contentful_paint >= start) + if (largest_contentful_paint >= start) { metrics->largest_contentful_paint = largest_contentful_paint - start; + metrics->has_lcp = true; + } double layout_shift = LocalRootImpl() ->GetFrame() ->View() ->GetLayoutShiftTracker() .WeightedScore(); - if (layout_shift > 0.f) + if (layout_shift > 0.f) { metrics->layout_shift = layout_shift; + metrics->has_cls = true; + } if (!metrics->HasValue()) return nullptr;
diff --git a/third_party/blink/renderer/core/frame/window.idl b/third_party/blink/renderer/core/frame/window.idl index 26fe778..f20359b 100644 --- a/third_party/blink/renderer/core/frame/window.idl +++ b/third_party/blink/renderer/core/frame/window.idl
@@ -63,7 +63,12 @@ [CrossOrigin, Custom=Setter] attribute Window opener; [Replaceable, CrossOrigin] readonly attribute Window? parent; [CheckSecurity=ReturnValue, Custom=Getter] readonly attribute Element? frameElement; - [CallWith=Isolate, RaisesException] Window? open(optional USVString url="", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = ""); + + // The usage of |impression_params| is gated on a runtime enabled feature + // in the implementation rather than in this definition, because the + // RuntimeEnabled extended attribute cannot be used with an operation + // overload. + [CallWith=Isolate, RaisesException] Window? open(optional USVString url="", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = "", optional ImpressionParams impression_params); // indexed properties // https://html.spec.whatwg.org/C/browsers.html#windowproxy-getownproperty
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.cc b/third_party/blink/renderer/core/frame/window_controls_overlay.cc index 90e16a0..21618ae 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.cc +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.cc
@@ -15,15 +15,20 @@ const char WindowControlsOverlay::kSupplementName[] = "WindowControlsOverlay"; // static -WindowControlsOverlay* WindowControlsOverlay::windowControlsOverlay( - Navigator& navigator) { - auto* supplement = +WindowControlsOverlay& WindowControlsOverlay::From(Navigator& navigator) { + WindowControlsOverlay* supplement = Supplement<Navigator>::From<WindowControlsOverlay>(navigator); if (!supplement) { supplement = MakeGarbageCollected<WindowControlsOverlay>(navigator); ProvideTo(navigator, supplement); } - return supplement; + return *supplement; +} + +// static +WindowControlsOverlay* WindowControlsOverlay::windowControlsOverlay( + Navigator& navigator) { + return &From(navigator); } WindowControlsOverlay::WindowControlsOverlay(Navigator& navigator) @@ -32,19 +37,23 @@ WindowControlsOverlay::~WindowControlsOverlay() = default; bool WindowControlsOverlay::visible() const { - if (!GetSupplementable()->DomWindow()->GetFrame()) + if (!GetSupplementable()->DomWindow()) return false; - // TODO(crbug.com/937121): Replace the hardcoded value in the next javascript - // API CL. - return false; + + return GetSupplementable() + ->DomWindow() + ->GetFrame() + ->IsWindowControlsOverlayVisible(); } DOMRect* WindowControlsOverlay::getBoundingClientRect() const { - if (!GetSupplementable()->DomWindow()->GetFrame()) + if (!GetSupplementable()->DomWindow()) return DOMRect::Create(0, 0, 0, 0); - // TODO(crbug.com/937121): Replace the hardcoded value in the next javascript - // API CL. - return DOMRect::Create(0, 0, 0, 0); + + return GetSupplementable() + ->DomWindow() + ->GetFrame() + ->GetWindowControlsOverlayRect(); } void WindowControlsOverlay::Trace(blink::Visitor* visitor) const {
diff --git a/third_party/blink/renderer/core/frame/window_controls_overlay.h b/third_party/blink/renderer/core/frame/window_controls_overlay.h index f9f5435..16a3731 100644 --- a/third_party/blink/renderer/core/frame/window_controls_overlay.h +++ b/third_party/blink/renderer/core/frame/window_controls_overlay.h
@@ -6,13 +6,13 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_WINDOW_CONTROLS_OVERLAY_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/geometry/dom_rect.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/supplementable.h" namespace blink { -class DOMRect; class Navigator; class CORE_EXPORT WindowControlsOverlay final : public ScriptWrappable, @@ -24,6 +24,8 @@ // Web Exposed as navigator.windowControlsOverlay static WindowControlsOverlay* windowControlsOverlay(Navigator& navigator); + static WindowControlsOverlay& From(Navigator& navigator); + explicit WindowControlsOverlay(Navigator& navigator); WindowControlsOverlay(const WindowControlsOverlay&) = delete; ~WindowControlsOverlay() override;
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni index fec4450..4c4b6b5 100644 --- a/third_party/blink/renderer/core/html/build.gni +++ b/third_party/blink/renderer/core/html/build.gni
@@ -33,6 +33,8 @@ "canvas/ukm_parameters.h", "collection_items_cache.h", "collection_type.h", + "conversion_measurement_parsing.cc", + "conversion_measurement_parsing.h", "cross_origin_attribute.cc", "cross_origin_attribute.h", "custom/ce_reactions_scope.cc",
diff --git a/third_party/blink/renderer/core/html/conversion_measurement_parsing.cc b/third_party/blink/renderer/core/html/conversion_measurement_parsing.cc new file mode 100644 index 0000000..f2a1eb8 --- /dev/null +++ b/third_party/blink/renderer/core/html/conversion_measurement_parsing.cc
@@ -0,0 +1,148 @@ +// Copyright 2020 The Chromium 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/html/conversion_measurement_parsing.h" + +#include "base/time/time.h" +#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_impression_params.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/execution_context/security_context.h" +#include "third_party/blink/renderer/core/frame/frame.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" +#include "third_party/blink/renderer/core/frame/web_feature.h" +#include "third_party/blink/renderer/core/html/html_anchor_element.h" +#include "third_party/blink/renderer/core/html_names.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/platform/instrumentation/use_counter.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" +#include "third_party/blink/renderer/platform/weborigin/security_origin.h" + +namespace blink { + +namespace { + +base::Optional<WebImpression> GetImpression( + ExecutionContext* execution_context, + const String& impression_data_string, + const String& conversion_destination_string, + const base::Optional<String>& reporting_origin_string, + base::Optional<uint64_t> impression_expiry_milliseconds) { + if (!RuntimeEnabledFeatures::ConversionMeasurementEnabled(execution_context)) + return base::nullopt; + + if (!execution_context->IsFeatureEnabled( + mojom::blink::FeaturePolicyFeature::kConversionMeasurement)) { + String message = + "The 'conversion-measurement' feature policy must be enabled to " + "declare an impression."; + execution_context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kOther, + mojom::blink::ConsoleMessageLevel::kError, message)); + return base::nullopt; + } + + // Conversion measurement is only allowed when both the frame and the main + // frame (if different) have a secure origin. + LocalFrame* frame = nullptr; + if (auto* window = DynamicTo<LocalDOMWindow>(execution_context)) { + frame = window->GetFrame(); + } else { + return base::nullopt; + } + + const Frame& main_frame = frame->Tree().Top(); + if (!main_frame.GetSecurityContext() + ->GetSecurityOrigin() + ->IsPotentiallyTrustworthy()) { + return base::nullopt; + } + + if (!frame->IsMainFrame() && !frame->GetSecurityContext() + ->GetSecurityOrigin() + ->IsPotentiallyTrustworthy()) { + return base::nullopt; + } + + scoped_refptr<const SecurityOrigin> conversion_destination = + SecurityOrigin::CreateFromString(conversion_destination_string); + if (!conversion_destination->IsPotentiallyTrustworthy()) + return base::nullopt; + + bool impression_data_is_valid = false; + uint64_t impression_data = + impression_data_string.HexToUInt64Strict(&impression_data_is_valid); + + // Provide a default of 0 if the impression data was not valid. + impression_data = impression_data_is_valid ? impression_data : 0UL; + + // Reporting origin is an optional attribute. Reporting origins must be + // secure. + base::Optional<WebSecurityOrigin> reporting_origin; + if (reporting_origin_string) { + reporting_origin = + SecurityOrigin::CreateFromString(*reporting_origin_string); + + if (!reporting_origin->IsPotentiallyTrustworthy()) + return base::nullopt; + } + + base::Optional<base::TimeDelta> expiry; + if (impression_expiry_milliseconds) + expiry = base::TimeDelta::FromMilliseconds(*impression_expiry_milliseconds); + + UseCounter::Count(execution_context, + mojom::blink::WebFeature::kConversionAPIAll); + UseCounter::Count(execution_context, + mojom::blink::WebFeature::kImpressionRegistration); + + return WebImpression{conversion_destination, reporting_origin, + impression_data, expiry}; +} + +} // namespace + +base::Optional<WebImpression> GetImpressionForAnchor( + HTMLAnchorElement* element) { + base::Optional<uint64_t> expiry; + if (element->hasAttribute(html_names::kImpressionexpiryAttr)) { + bool expiry_is_valid = false; + uint64_t expiry_milliseconds = + element->FastGetAttribute(html_names::kImpressionexpiryAttr) + .GetString() + .ToUInt64Strict(&expiry_is_valid); + if (expiry_is_valid) + expiry = expiry_milliseconds; + } + + DCHECK(element->hasAttribute(html_names::kConversiondestinationAttr)); + DCHECK(element->hasAttribute(html_names::kImpressiondataAttr)); + + return GetImpression( + element->GetExecutionContext(), + element->FastGetAttribute(html_names::kImpressiondataAttr).GetString(), + element->FastGetAttribute(html_names::kConversiondestinationAttr) + .GetString(), + element->hasAttribute(html_names::kReportingoriginAttr) + ? base::make_optional( + element->FastGetAttribute(html_names::kReportingoriginAttr) + .GetString()) + : base::nullopt, + expiry); +} + +base::Optional<WebImpression> GetImpressionForParams( + ExecutionContext* execution_context, + const ImpressionParams* params) { + return GetImpression(execution_context, params->impressionData(), + params->conversionDestination(), + params->hasReportingOrigin() + ? base::make_optional(params->reportingOrigin()) + : base::nullopt, + params->hasImpressionExpiry() + ? base::make_optional(params->impressionExpiry()) + : base::nullopt); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/html/conversion_measurement_parsing.h b/third_party/blink/renderer/core/html/conversion_measurement_parsing.h new file mode 100644 index 0000000..82e4c04 --- /dev/null +++ b/third_party/blink/renderer/core/html/conversion_measurement_parsing.h
@@ -0,0 +1,35 @@ +// Copyright 2020 The Chromium 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_HTML_CONVERSION_MEASUREMENT_PARSING_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CONVERSION_MEASUREMENT_PARSING_H_ + +#include <stdint.h> +#include <memory> + +#include "base/optional.h" +#include "third_party/blink/public/platform/web_impression.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class ExecutionContext; +class HTMLAnchorElement; +class ImpressionParams; + +// Returns the WebImpression struct with all data declared by impression +// related attributes on |element|. If the impression attributes do not contain +// allowed values, base::nullopt is returned. +base::Optional<WebImpression> GetImpressionForAnchor( + HTMLAnchorElement* element); + +// Same as GetImpressionForAnchor(), but gets an impression specified by an +// ImpressionParams dictionary associated with a window.open call. +base::Optional<WebImpression> GetImpressionForParams( + ExecutionContext* execution_context, + const ImpressionParams* params); + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CONVERSION_MEASUREMENT_PARSING_H_
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 5e1bcf7..5e1eea1 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -42,6 +42,7 @@ #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/html/anchor_element_metrics.h" #include "third_party/blink/renderer/core/html/anchor_element_metrics_sender.h" +#include "third_party/blink/renderer/core/html/conversion_measurement_parsing.h" #include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h" #include "third_party/blink/renderer/core/html_names.h" @@ -358,90 +359,6 @@ hasAttribute(html_names::kConversiondestinationAttr); } -base::Optional<WebImpression> HTMLAnchorElement::GetImpressionForNavigation() - const { - DCHECK(HasImpression()); - - if (!RuntimeEnabledFeatures::ConversionMeasurementEnabled( - GetExecutionContext())) - return base::nullopt; - - if (!GetExecutionContext()->IsFeatureEnabled( - mojom::blink::FeaturePolicyFeature::kConversionMeasurement)) { - String message = - "The 'conversion-measurement' feature policy must be enabled to " - "declare an impression."; - GetExecutionContext()->AddConsoleMessage( - MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kOther, - mojom::blink::ConsoleMessageLevel::kError, message)); - return base::nullopt; - } - - // Conversion measurement is only allowed when both the frame and the main - // frame (if different) have a secure origin. - LocalFrame* frame = GetDocument().GetFrame(); - const Frame& main_frame = frame->Tree().Top(); - if (!main_frame.GetSecurityContext() - ->GetSecurityOrigin() - ->IsPotentiallyTrustworthy()) { - return base::nullopt; - } - if (!frame->IsMainFrame() && !frame->GetSecurityContext() - ->GetSecurityOrigin() - ->IsPotentiallyTrustworthy()) { - return base::nullopt; - } - - const AtomicString& conversion_destination_string = - FastGetAttribute(html_names::kConversiondestinationAttr); - scoped_refptr<const SecurityOrigin> conversion_destination = - SecurityOrigin::CreateFromString(conversion_destination_string); - if (!conversion_destination->IsPotentiallyTrustworthy()) - return base::nullopt; - - bool impression_data_is_valid = false; - uint64_t impression_data = FastGetAttribute(html_names::kImpressiondataAttr) - .GetString() - .HexToUInt64Strict(&impression_data_is_valid); - - // Provide a default of 0 if the impression data was not valid. - impression_data = impression_data_is_valid ? impression_data : 0UL; - - // Reporting origin is an optional attribute. Reporting origins must be - // secure. - base::Optional<WebSecurityOrigin> reporting_origin; - if (hasAttribute(html_names::kReportingoriginAttr)) { - const AtomicString& reporting_origin_string = - FastGetAttribute(html_names::kReportingoriginAttr); - reporting_origin = - SecurityOrigin::CreateFromString(reporting_origin_string); - - if (!reporting_origin->IsPotentiallyTrustworthy()) - return base::nullopt; - } - - // Impression expiry is an optional attribute. - base::Optional<base::TimeDelta> expiry; - if (hasAttribute(html_names::kImpressionexpiryAttr)) { - bool expiry_is_valid = false; - uint64_t expiry_milliseconds = - FastGetAttribute(html_names::kImpressionexpiryAttr) - .GetString() - .ToUInt64Strict(&expiry_is_valid); - if (expiry_is_valid) - expiry = base::TimeDelta::FromMilliseconds(expiry_milliseconds); - } - - UseCounter::Count(GetExecutionContext(), - mojom::blink::WebFeature::kConversionAPIAll); - UseCounter::Count(GetExecutionContext(), - mojom::blink::WebFeature::kImpressionRegistration); - - return WebImpression{conversion_destination, reporting_origin, - impression_data, expiry}; -} - void HTMLAnchorElement::SendPings(const KURL& destination_url) const { const AtomicString& ping_value = FastGetAttribute(html_names::kPingAttr); if (ping_value.IsNull() || !GetDocument().GetSettings() || @@ -563,7 +480,7 @@ // FindOrCreateFrameForNavigation() call, as that call may result in // performing a navigation if the call results in creating a new window with // noopener set. - base::Optional<WebImpression> impression = GetImpressionForNavigation(); + base::Optional<WebImpression> impression = GetImpressionForAnchor(this); if (impression) frame_request.SetImpression(*impression); }
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 e1478ded..249ff4e 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.h +++ b/third_party/blink/renderer/core/html/html_anchor_element.h
@@ -101,11 +101,6 @@ // determined by looking at the presence of required attributes. bool HasImpression() const; - // Returns the WebImpression struct with all data declared by impression - // related attributes on |this|. If the impression attributes do not contain - // allowed values, base::nullopt is returned. - base::Optional<WebImpression> GetImpressionForNavigation() const; - void SendPings(const KURL& destination_url) const; void Trace(Visitor*) const override;
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 06cda47..d5ef5c36 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -247,6 +247,7 @@ UpdateRequiredPolicy(); } } else if (name == html_names::kTrusttokenAttr) { + UseCounter::Count(GetDocument(), WebFeature::kTrustTokenIframe); trust_token_ = value; } else { // Websites picked up a Chromium article that used this non-specified
diff --git a/third_party/blink/renderer/core/html/link_style.cc b/third_party/blink/renderer/core/html/link_style.cc index 2ee2492..baa26cde9 100644 --- a/third_party/blink/renderer/core/html/link_style.cc +++ b/third_party/blink/renderer/core/html/link_style.cc
@@ -88,7 +88,9 @@ auto* parser_context = MakeGarbageCollected<CSSParserContext>( GetDocument(), cached_style_sheet->GetResponse().ResponseUrl(), cached_style_sheet->GetResponse().IsCorsSameOrigin(), - cached_style_sheet->GetReferrerPolicy(), cached_style_sheet->Encoding()); + Referrer(cached_style_sheet->GetResponse().ResponseUrl(), + cached_style_sheet->GetReferrerPolicy()), + cached_style_sheet->Encoding()); if (cached_style_sheet->GetResourceRequest().IsAdResource()) { parser_context->SetIsAdRelated(); }
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc index 05bf030..7cde9098 100644 --- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -1229,7 +1229,7 @@ const SegmentedString source(input_source); - if (!preload_scanner_ && preloader_ && GetDocument()->Url().IsValid() && + if (!preload_scanner_ && GetDocument()->Url().IsValid() && (!task_runner_state_->IsSynchronous() || GetDocument()->IsPrefetchOnly() || IsPaused())) { // If we're operating with synchronous, budgeted foreground HTML parsing
diff --git a/third_party/blink/renderer/core/html/resources/forced_colors.css b/third_party/blink/renderer/core/html/resources/forced_colors.css index d59c129..61102aa 100644 --- a/third_party/blink/renderer/core/html/resources/forced_colors.css +++ b/third_party/blink/renderer/core/html/resources/forced_colors.css
@@ -157,7 +157,7 @@ select:-internal-list-box:disabled option:hover { background-color: Canvas !important; -internal-forced-background-color: Canvas !important; - -internal-forced-color: GrayText !important; + color: GrayText !important; } /* option selected */
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_parser.cc b/third_party/blink/renderer/core/html/track/vtt/vtt_parser.cc index 727caa1..351917d 100644 --- a/third_party/blink/renderer/core/html/track/vtt/vtt_parser.cc +++ b/third_party/blink/renderer/core/html/track/vtt/vtt_parser.cc
@@ -244,9 +244,8 @@ VTTParser::ParseState VTTParser::CollectStyleSheet(const String& line) { if (line.IsEmpty() || line.Contains("-->")) { auto* parser_context = MakeGarbageCollected<CSSParserContext>( - *document_, NullURL(), true /* origin_clean */, - document_->GetReferrerPolicy(), UTF8Encoding(), - CSSParserContext::kLiveProfile, + *document_, NullURL(), true /* origin_clean */, Referrer(), + UTF8Encoding(), CSSParserContext::kLiveProfile, ResourceFetchRestriction::kOnlyDataUrls); auto* style_sheet_contents = MakeGarbageCollected<StyleSheetContents>(parser_context);
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc index dabdd00..0a9daa58 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -180,6 +180,10 @@ return protocol::DOM::PseudoTypeEnum::Selection; case kPseudoIdTargetText: return protocol::DOM::PseudoTypeEnum::TargetText; + case kPseudoIdSpellingError: + return protocol::DOM::PseudoTypeEnum::SpellingError; + case kPseudoIdGrammarError: + return protocol::DOM::PseudoTypeEnum::GrammarError; case kPseudoIdFirstLineInherited: return protocol::DOM::PseudoTypeEnum::FirstLineInherited; case kPseudoIdScrollbar:
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state.cc b/third_party/blink/renderer/core/inspector/inspector_session_state.cc index b1e28c7..c7b3803a 100644 --- a/third_party/blink/renderer/core/inspector/inspector_session_state.cc +++ b/third_party/blink/renderer/core/inspector/inspector_session_state.cc
@@ -128,7 +128,7 @@ bool InspectorAgentState::Deserialize(span<uint8_t> in, WTF::String* v) { CBORTokenizer tokenizer(in); if (tokenizer.TokenTag() == CBORTokenTag::STRING8) { - *v = WTF::String( + *v = WTF::String::FromUTF8( reinterpret_cast<const char*>(tokenizer.GetString8().data()), static_cast<size_t>(tokenizer.GetString8().size())); return true;
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc index 9b632b8..99dccbf 100644 --- a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc +++ b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc
@@ -82,10 +82,14 @@ simple_agent.counter_.Set(311); simple_agent.bytes_.Set({0xde, 0xad, 0xbe, 0xef}); + // Test that Latin1 is handled properly + simple_agent.message_.Set("\xC7 cedilla"); + EXPECT_EQ(true, simple_agent.enabled_.Get()); EXPECT_EQ(11.0, simple_agent.field1_.Get()); EXPECT_EQ(42.0, simple_agent.multiplier_.Get()); EXPECT_EQ(311, simple_agent.counter_.Get()); + EXPECT_EQ("\xC7 cedilla", simple_agent.message_.Get()); EXPECT_THAT(simple_agent.bytes_.Get(), ElementsAre(0xde, 0xad, 0xbe, 0xef)); // Now send the updates back to the browser session. @@ -101,6 +105,7 @@ EXPECT_EQ(11.0, simple_agent.field1_.Get()); EXPECT_EQ(42.0, simple_agent.multiplier_.Get()); EXPECT_EQ(311, simple_agent.counter_.Get()); + EXPECT_EQ("\xC7 cedilla", simple_agent.message_.Get()); EXPECT_THAT(simple_agent.bytes_.Get(), ElementsAre(0xde, 0xad, 0xbe, 0xef)); simple_agent.enabled_.Set(false);
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc index 6116c07..6cdd702 100644 --- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc +++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -369,6 +369,8 @@ DEFINE_STRING_MAPPING(PseudoXrOverlay) DEFINE_STRING_MAPPING(PseudoTargetText) DEFINE_STRING_MAPPING(PseudoModal) + DEFINE_STRING_MAPPING(PseudoSpellingError) + DEFINE_STRING_MAPPING(PseudoGrammarError) #undef DEFINE_STRING_MAPPING }
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index f4c1983..5b75ed3 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -251,8 +251,12 @@ NOT_DESTROYED(); LayoutBox::UpdateFromStyle(); - bool should_clip_overflow = !StyleRef().IsOverflowVisibleAlongBothAxes() && - AllowsNonVisibleOverflow(); + // OverflowClipMargin() is only set if overflow is 'clip' along both axis, or + // 'contain: paint'. The later implies clipping along both axis. + bool should_clip_overflow = + (!StyleRef().IsOverflowVisibleAlongBothAxes() || + StyleRef().OverflowClipMargin() != LayoutUnit()) && + AllowsNonVisibleOverflow(); if (should_clip_overflow != HasNonVisibleOverflow()) { if (GetScrollableArea()) GetScrollableArea()->InvalidateAllStickyConstraints();
diff --git a/third_party/blink/renderer/core/layout/layout_box_test.cc b/third_party/blink/renderer/core/layout/layout_box_test.cc index 201558a6..134cc6c 100644 --- a/third_party/blink/renderer/core/layout/layout_box_test.cc +++ b/third_party/blink/renderer/core/layout/layout_box_test.cc
@@ -524,6 +524,7 @@ SetBodyInnerHTML(R"HTML( <style> .parent { width: 100px; height: 50px; overflow: clip; } + .parent2 { width: 100px; height: 50px; contain: paint; } .child { width: 110px; height: 55px; } </style> <div id="clip1" style="overflow-clip-margin: 4px" class="parent"> @@ -532,6 +533,9 @@ <div id="clip2" style="overflow-clip-margin: 11px" class="parent"> <div class="child"></div> </div> + <div id="clip3" style="overflow-clip-margin: 11px" class="parent2"> + <div class="child"></div> + </div> )HTML"); LayoutBox* clip1 = GetLayoutBoxByElementId("clip1"); @@ -543,12 +547,18 @@ EXPECT_FALSE(clip2->IsScrollContainer()); EXPECT_TRUE(clip2->ShouldClipOverflowAlongBothAxis()); EXPECT_EQ(LayoutRect(0, 0, 110, 55), clip2->VisualOverflowRect()); + + LayoutBox* clip3 = GetLayoutBoxByElementId("clip3"); + EXPECT_FALSE(clip3->IsScrollContainer()); + EXPECT_TRUE(clip3->ShouldClipOverflowAlongBothAxis()); + EXPECT_EQ(LayoutRect(0, 0, 110, 55), clip3->VisualOverflowRect()); } TEST_P(LayoutBoxTest, LayoutOverflowRectWithOverflowClipMargin) { SetBodyInnerHTML(R"HTML( <style> .parent { width: 100px; height: 50px; overflow: clip; } + .parent2 { width: 100px; height: 50px; contain: paint; } .child { position: relative; top: -5px; left: -6px; width: 110px; height: 112px; } </style> @@ -558,6 +568,9 @@ <div id="clip2" style="overflow-clip-margin: 10px" class="parent"> <div class="child"></div> </div> + <div id="clip3" style="overflow-clip-margin: 10px" class="parent2"> + <div class="child"></div> + </div> )HTML"); LayoutBox* clip1 = GetLayoutBoxByElementId("clip1"); @@ -571,6 +584,12 @@ EXPECT_TRUE(clip2->ShouldClipOverflowAlongBothAxis()); EXPECT_EQ(LayoutRect(-6, -5, 110, 65), clip2->LayoutOverflowRectForPropagation(clip2->Parent())); + + LayoutBox* clip3 = GetLayoutBoxByElementId("clip3"); + EXPECT_FALSE(clip3->IsScrollContainer()); + EXPECT_TRUE(clip3->ShouldClipOverflowAlongBothAxis()); + EXPECT_EQ(LayoutRect(-6, -5, 110, 65), + clip3->LayoutOverflowRectForPropagation(clip3->Parent())); } TEST_P(LayoutBoxTest, ContentsVisualOverflowPropagation) {
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc index 9953bfc..c536f43 100644 --- a/third_party/blink/renderer/core/layout/layout_view.cc +++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -628,8 +628,15 @@ NOT_DESTROYED(); if (ShouldUsePrintingLayout()) return PhysicalRect(PhysicalOffset(), Size()); - if (frame_view_) - return PhysicalRect(PhysicalOffset(), PhysicalSize(frame_view_->Size())); + if (frame_view_) { + IntRect view_rect(IntPoint(), frame_view_->Size()); + auto& frame = frame_view_->GetFrame(); + if (frame.IsMainFrame()) { + frame.GetChromeClient().OverrideVisibleRectForMainFrame(frame, + &view_rect); + } + return PhysicalRect(view_rect); + } return PhysicalRect(); } @@ -643,7 +650,7 @@ overlay_scrollbar_clip_behavior); } - rect.offset = location; + rect.offset += location; if (IsScrollContainer()) ExcludeScrollbars(rect, overlay_scrollbar_clip_behavior);
diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc index 3e13652..8e47f6a 100644 --- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
@@ -439,10 +439,11 @@ clamped_intrinsic_block_border_box); } + MinMaxSizes inline_min_max = ComputeTransferredMinMaxInlineSizes( + aspect_ratio, used_min_max_block_sizes, border_padding, + EBoxSizing::kContentBox); + if (intrinsic_inline) { - MinMaxSizes inline_min_max = ComputeTransferredMinMaxInlineSizes( - aspect_ratio, used_min_max_block_sizes, border_padding, - EBoxSizing::kContentBox); LayoutUnit intrinsic_inline_border_box = *intrinsic_inline + border_padding.InlineSum(); return inline_min_max.ClampSizeToMinAndMax(intrinsic_inline_border_box); @@ -456,7 +457,9 @@ // https://drafts.csswg.org/css-sizing-3/#intrinsic-sizes DCHECK_NE(space.AvailableSize().inline_size, kIndefiniteSize); NGBoxStrut margins = ComputeMarginsForSelf(space, style); - return (space.AvailableSize().inline_size - margins.InlineSum()) + return inline_min_max + .ClampSizeToMinAndMax(space.AvailableSize().inline_size - + margins.InlineSum()) .ClampNegativeToZero(); } @@ -488,9 +491,6 @@ } if (inline_size_border_box) { - // Clamping block size to the transferred inline min/max sizes might be - // uninentionally unspecified. See - // https://github.com/w3c/csswg-drafts/issues/5583 LayoutUnit clamped_intrinsic_inline_border_box = used_min_max_inline_sizes.ClampSizeToMinAndMax(*inline_size_border_box); return BlockSizeFromAspectRatio(border_padding, aspect_ratio, @@ -498,18 +498,18 @@ clamped_intrinsic_inline_border_box); } + MinMaxSizes transferred_block_min_max = {LayoutUnit(), LayoutUnit::Max()}; + if (used_min_max_inline_sizes.min_size > LayoutUnit()) { + transferred_block_min_max.min_size = BlockSizeFromAspectRatio( + border_padding, aspect_ratio, EBoxSizing::kContentBox, + used_min_max_inline_sizes.min_size); + } + if (used_min_max_inline_sizes.max_size != LayoutUnit::Max()) { + transferred_block_min_max.max_size = BlockSizeFromAspectRatio( + border_padding, aspect_ratio, EBoxSizing::kContentBox, + used_min_max_inline_sizes.max_size); + } if (intrinsic_block) { - MinMaxSizes transferred_block_min_max = {LayoutUnit(), LayoutUnit::Max()}; - if (used_min_max_inline_sizes.min_size > LayoutUnit()) { - transferred_block_min_max.min_size = BlockSizeFromAspectRatio( - border_padding, aspect_ratio, EBoxSizing::kContentBox, - used_min_max_inline_sizes.min_size); - } - if (used_min_max_inline_sizes.max_size != LayoutUnit::Max()) { - transferred_block_min_max.max_size = BlockSizeFromAspectRatio( - border_padding, aspect_ratio, EBoxSizing::kContentBox, - used_min_max_inline_sizes.max_size); - } // Minimum size wins over maximum size. transferred_block_min_max.max_size = std::max( transferred_block_min_max.max_size, transferred_block_min_max.min_size); @@ -530,9 +530,10 @@ LayoutUnit stretch_into_available_inline_size( (space.AvailableSize().inline_size - margins.InlineSum()) .ClampNegativeToZero()); - return BlockSizeFromAspectRatio(border_padding, aspect_ratio, - EBoxSizing::kContentBox, - stretch_into_available_inline_size); + return transferred_block_min_max.ClampSizeToMinAndMax( + BlockSizeFromAspectRatio(border_padding, aspect_ratio, + EBoxSizing::kContentBox, + stretch_into_available_inline_size)); } } // namespace
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc index f68e51fe..2b5982e2 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
@@ -117,6 +117,7 @@ /* containing_block_expects_minmax_without_percentages */ false, /* skip_collapsed_columns */ false); + // Standard: "used width of the table". LayoutUnit used_table_inline_size = ComputeUsedInlineSizeForTableFragment( space, table, table_border_padding, grid_min_max); @@ -397,18 +398,8 @@ scoped_refptr<const NGLayoutResult> NGTableLayoutAlgorithm::Layout() { DCHECK(!BreakToken()); + const bool is_fixed_layout = Style().IsFixedTableLayout(); - - // TODO(atotic) review autosizer usage in TablesNG. - // Legacy has: - // LayoutTable::UpdateLayout - // TextAutosizer::LayoutScope - // TableLayoutAlgorithmAuto::ComputeIntrinsicLogicalWidths - // TextAutosizer::TableLayoutScope - base::Optional<TextAutosizer::TableLayoutScope> text_autosizer; - if (!is_fixed_layout) - text_autosizer.emplace(To<LayoutNGTable>(Node().GetLayoutBox())); - const LogicalSize border_spacing = Style().TableBorderSpacing(); NGTableGroupedChildren grouped_children(Node()); const scoped_refptr<const NGTableBorders> table_borders = @@ -628,8 +619,6 @@ const PhysicalRect& table_grid_rect, const LogicalSize& border_spacing, const LayoutUnit table_grid_block_size) { - // TODO(atotic) SetHasNonCollapsedBorderDecoration should be a fragment - // property, not a flag on LayoutObject. container_builder_.SetTableGridRect(table_grid_rect); container_builder_.SetTableColumnCount(column_locations.size()); container_builder_.SetHasCollapsedBorders(table_borders.IsCollapsed());
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc index c3add42..f00325c 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc
@@ -305,11 +305,4 @@ } } -void LayoutSVGResourceClipper::WillBeDestroyed() { - NOT_DESTROYED(); - MarkAllClientsForInvalidation(SVGResourceClient::kClipCacheInvalidation | - SVGResourceClient::kPaintInvalidation); - LayoutSVGResourceContainer::WillBeDestroyed(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.h b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.h index b290b60..1f4355e 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.h
@@ -57,11 +57,9 @@ base::Optional<Path> AsPath(); sk_sp<const PaintRecord> CreatePaintRecord(); - protected: - void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override; - void WillBeDestroyed() override; - private: + void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override; + void CalculateLocalClipBounds(); bool FindCycleFromSelf(SVGResourcesCycleSolver&) const override;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc index c3c6fd4..c7091e3 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc
@@ -55,6 +55,37 @@ ClearInvalidationMask(); } +void LayoutSVGResourceContainer::InvalidateClientsIfActiveResource() { + NOT_DESTROYED(); + // If this is the 'active' resource (the first element with the specified 'id' + // in tree order), notify any clients that they need to reevaluate the + // resource's contents. + const LocalSVGResource* resource = ResourceForContainer(*this); + if (!resource || resource->Target() != GetElement()) + return; + // Pass all available flags. This may be performing unnecessary invalidations + // in some cases. + MarkAllClientsForInvalidation(SVGResourceClient::kInvalidateAll); +} + +void LayoutSVGResourceContainer::WillBeDestroyed() { + NOT_DESTROYED(); + // The resource is being torn down. + InvalidateClientsIfActiveResource(); + LayoutSVGHiddenContainer::WillBeDestroyed(); +} + +void LayoutSVGResourceContainer::StyleDidChange( + StyleDifference diff, + const ComputedStyle* old_style) { + NOT_DESTROYED(); + LayoutSVGHiddenContainer::StyleDidChange(diff, old_style); + if (old_style) + return; + // The resource has been attached. + InvalidateClientsIfActiveResource(); +} + bool LayoutSVGResourceContainer::FindCycle( SVGResourcesCycleSolver& solver) const { NOT_DESTROYED();
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.h b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.h index c2020e7..5e18e64 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.h
@@ -97,7 +97,12 @@ static bool FindCycleInSubtree(SVGResourcesCycleSolver&, const LayoutObject& root); + void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override; + void WillBeDestroyed() override; + private: + void InvalidateClientsIfActiveResource(); + // Track global (markAllClientsForInvalidation) invalidations to avoid // redundant crawls. unsigned completed_invalidations_mask_ : 8;
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc index a5cc196..98aff1672 100644 --- a/third_party/blink/renderer/core/loader/frame_loader.cc +++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -1140,6 +1140,9 @@ bool FrameLoader::DetachDocument( SecurityOrigin* committing_origin, base::Optional<Document::UnloadEventTiming>* timing) { + DCHECK(frame_->GetDocument()); + DCHECK(document_loader_); + PluginScriptForbiddenScope forbid_plugin_destructor_scripting; ClientNavigationState* client_navigation = client_navigation_.get(); @@ -1157,8 +1160,7 @@ // both when unloading itself and when unloading its descendants. IgnoreOpensDuringUnloadCountIncrementer ignore_opens_during_unload( frame_->GetDocument()); - if (document_loader_) - DispatchUnloadEvent(committing_origin, timing); + DispatchUnloadEvent(committing_origin, timing); frame_->DetachChildren(); // The previous calls to dispatchUnloadEvent() and detachChildren() can // execute arbitrary script via things like unload events. If the executed @@ -1168,14 +1170,13 @@ return false; // FrameNavigationDisabler should prevent another load from starting. DCHECK_EQ(client_navigation_.get(), client_navigation); - // detachFromFrame() will abort XHRs that haven't completed, which can trigger - // event listeners for 'abort'. These event listeners might call + // Detaching the document loader will abort XHRs that haven't completed, which + // can trigger event listeners for 'abort'. These event listeners might call // window.stop(), which will in turn detach the provisional document loader. // At this point, the provisional document loader should not detach, because // then the FrameLoader would not have any attached DocumentLoaders. This is // guaranteed by FrameNavigationDisabler above. - if (document_loader_) - DetachDocumentLoader(document_loader_, true); + DetachDocumentLoader(document_loader_, true); // 'abort' listeners can also detach the frame. if (!frame_->Client()) return false; @@ -1185,8 +1186,7 @@ // No more events will be dispatched so detach the Document. // TODO(yoav): Should we also be nullifying domWindow's document (or // domWindow) since the doc is now detached? - if (frame_->GetDocument()) - frame_->GetDocument()->Shutdown(); + frame_->GetDocument()->Shutdown(); document_loader_ = nullptr; return true;
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc index 313cc8c..83db543 100644 --- a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc +++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.cc
@@ -52,7 +52,7 @@ out->locked_agent_cluster_id = locked_agent_cluster_id; Vector<PendingRemote<blink::mojom::blink::FileSystemAccessTransferToken>>& - tokens = out->message->NativeFileSystemTokens(); + tokens = out->message->FileSystemAccessTokens(); if (!data.ReadFileSystemAccessTokens(&tokens)) { return false; }
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h index 6e6978a..43dab8a 100644 --- a/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h +++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message_mojom_traits.h
@@ -62,7 +62,7 @@ static Vector< mojo::PendingRemote<blink::mojom::blink::FileSystemAccessTransferToken>> file_system_access_tokens(blink::BlinkCloneableMessage& input) { - return std::move(input.message->NativeFileSystemTokens()); + return std::move(input.message->FileSystemAccessTokens()); } static bool Read(blink::mojom::CloneableMessageDataView,
diff --git a/third_party/blink/renderer/core/messaging/blink_transferable_message.cc b/third_party/blink/renderer/core/messaging/blink_transferable_message.cc index 12bd1f45..5408c7d 100644 --- a/third_party/blink/renderer/core/messaging/blink_transferable_message.cc +++ b/third_party/blink/renderer/core/messaging/blink_transferable_message.cc
@@ -108,9 +108,9 @@ std::move(image_bitmap_contents_array)); } - // Native file system transfer tokens. - for (auto& token : serialized_script_value->NativeFileSystemTokens()) { - result.message->NativeFileSystemTokens().push_back(std::move(token)); + // File System Access transfer tokens. + for (auto& token : serialized_script_value->FileSystemAccessTokens()) { + result.message->FileSystemAccessTokens().push_back(std::move(token)); } return result; @@ -192,7 +192,7 @@ // Convert the PendingRemote<FileSystemAccessTransferToken> from the // blink::mojom namespace to the blink::mojom::blink namespace. for (auto& token : message.file_system_access_tokens) { - result.message->NativeFileSystemTokens().push_back( + result.message->FileSystemAccessTokens().push_back( ToCrossVariantMojoType(std::move(token))); } return result;
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index 518ba80c..1d738187 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -55,6 +55,7 @@ #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/web_frame_widget_impl.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" +#include "third_party/blink/renderer/core/html/conversion_measurement_parsing.h" #include "third_party/blink/renderer/core/html/forms/html_form_element.h" #include "third_party/blink/renderer/core/html/forms/html_input_element.h" #include "third_party/blink/renderer/core/html/html_anchor_element.h" @@ -490,7 +491,7 @@ data.link_text = anchor->innerText(); if (anchor->HasImpression()) - data.impression = anchor->GetImpressionForNavigation(); + data.impression = GetImpressionForAnchor(anchor); } data.input_field_type = ComputeInputFieldType(result);
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 80004fd..f8ae475 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -1601,38 +1601,26 @@ while (root_view->GetFrame()->OwnerLayoutObject()) root_view = root_view->GetFrame()->OwnerLayoutObject()->View(); - auto root_view_contents_state = - root_view->FirstFragment().ContentsProperties(); - auto root_view_border_box_state = - root_view->FirstFragment().LocalBorderBoxProperties(); + auto root_view_state = root_view->FirstFragment().LocalBorderBoxProperties(); // 1. Move into local transform space. mapping_rect.MoveBy(FloatPoint(graphics_layer->GetOffsetFromTransformNode())); - // 2. Map into contents space of the root LayoutView. - GeometryMapper::LocalToAncestorVisualRect( - source_state, root_view_contents_state, mapping_rect); + // 2. Map into visible space of the root LayoutView. + GeometryMapper::LocalToAncestorVisualRect(source_state, root_view_state, + mapping_rect); FloatRect visible_content_rect(EnclosingIntRect(mapping_rect.Rect())); - // 3. Move into local border box transform space of the root LayoutView. - // Note that the overflow clip has *not* been applied. - GeometryMapper::SourceToDestinationRect( - root_view_contents_state.Transform(), - root_view_border_box_state.Transform(), visible_content_rect); - - // 4. Apply overflow clip, or adjusted version if necessary. - root_view->GetFrameView()->ClipPaintRect(&visible_content_rect); - FloatRect local_interest_rect; // If the visible content rect is empty, then it makes no sense to map it back // since there is nothing to map. if (!visible_content_rect.IsEmpty()) { local_interest_rect = visible_content_rect; - // 5. Map the visible content rect from root view space to local graphics + // 3. Map the visible content rect from root view space to local graphics // layer space. - GeometryMapper::SourceToDestinationRect( - root_view_border_box_state.Transform(), source_state.Transform(), - local_interest_rect); + GeometryMapper::SourceToDestinationRect(root_view_state.Transform(), + source_state.Transform(), + local_interest_rect); local_interest_rect.MoveBy( -FloatPoint(graphics_layer->GetOffsetFromTransformNode()));
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 979f565..2d5ce78 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1124,7 +1124,11 @@ PhysicalRect mapping_rect = LocalBoundingBoxForCompositingOverlapTest(); GetLayoutObject().MapToVisualRectInAncestorSpace( GetLayoutObject().View(), mapping_rect, kUseGeometryMapper); - return EnclosingIntRect(mapping_rect); + // We use PixelSnappedIntRect here to match the behavior in + // CIU:: UpdateAncestorDependentCompositingInputs, even though the code + // in UnclippedAbsoluteBoundingBox and its equivalent in + // CIU::UpdateAncestorDependentCompositingInputs uses EnclosingIntRect. + return PixelSnappedIntRect(mapping_rect); } else { return GetAncestorDependentCompositingInputs() .clipped_absolute_bounding_box;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 51438ea..07b11da 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -159,8 +159,24 @@ return false; } +static bool IsUnclippedLayoutView(const PaintLayer& layer) { + // If MainFrameClipsContent is false which means that WebPreferences:: + // record_whole_document is true, we should not cull the scrolling contents + // of the main frame. + if (IsA<LayoutView>(layer.GetLayoutObject())) { + const auto* frame = layer.GetLayoutObject().GetFrame(); + if (frame && frame->IsMainFrame() && !frame->ClipsContent()) + return true; + } + return false; +} + static bool ShouldUseInfiniteCullRect(const PaintLayer& layer, PaintLayerPaintingInfo& painting_info) { + bool is_printing = layer.GetLayoutObject().GetDocument().Printing(); + if (IsUnclippedLayoutView(layer) && !is_printing) + return true; + // Cull rects and clips can't be propagated across a filter which moves // pixels, since the input of the filter may be outside the cull rect / // clips yet still result in painted output. @@ -172,7 +188,7 @@ // TODO(crbug.com/1098995): For now we don't adjust cull rect for clips. // When we do, we need to check if we are painting under a real clip. // This won't be a problem when we use block fragments for printing. - !layer.GetLayoutObject().GetDocument().Printing()) + !is_printing) return true; // Cull rect mapping doesn't work under perspective in some cases. @@ -189,41 +205,24 @@ if (layer.PaintsWithTransform(painting_info.GetGlobalPaintFlags()) && // The reasons don't apply for printing though, because when we enter and // leaving printing mode, full invalidations occur. - !layer.GetLayoutObject().GetDocument().Printing()) + !is_printing) return true; return false; } -static bool IsUnclippedLayoutView(const PaintLayer& layer) { - // If MainFrameClipsContent is false which means that WebPreferences:: - // record_whole_document is true, we should not cull the scrolling contents - // of the main frame. - if (IsA<LayoutView>(layer.GetLayoutObject())) { - const auto* frame = layer.GetLayoutObject().GetFrame(); - if (frame && frame->IsMainFrame() && !frame->ClipsContent()) - return true; - // True regardless whether this is the main frame when painting a preview. - if (frame && frame->GetDocument()->IsPaintingPreview()) - return true; - } - return false; -} - void PaintLayerPainter::AdjustForPaintProperties( const GraphicsContext& context, PaintLayerPaintingInfo& painting_info, PaintLayerFlags& paint_flags) { const auto& first_fragment = paint_layer_.GetLayoutObject().FirstFragment(); - bool is_unclipped_layout_view = IsUnclippedLayoutView(paint_layer_); bool should_use_infinite_cull_rect = - is_unclipped_layout_view || ShouldUseInfiniteCullRect(paint_layer_, painting_info); if (should_use_infinite_cull_rect) { painting_info.cull_rect = CullRect::Infinite(); // Avoid clipping during CollectFragments. - if (is_unclipped_layout_view) + if (IsUnclippedLayoutView(paint_layer_)) paint_flags |= kPaintLayerPaintingOverflowContents; } @@ -410,8 +409,10 @@ subsequence_recorder.emplace(context, paint_layer_); } - PhysicalOffset offset_from_root; - paint_layer_.ConvertToLayerCoords(painting_info.root_layer, offset_from_root); + PhysicalOffset offset_from_root = + paint_layer_.GetLayoutObject().FirstFragment().PaintOffset(); + if (const PaintLayer* root = painting_info.root_layer) + offset_from_root -= root->GetLayoutObject().FirstFragment().PaintOffset(); offset_from_root += subpixel_accumulation; PhysicalRect bounds = paint_layer_.PhysicalBoundingBox(offset_from_root);
diff --git a/third_party/blink/renderer/core/paint/paint_layer_test.cc b/third_party/blink/renderer/core/paint/paint_layer_test.cc index 6d0eb2a..8fa57a9 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_test.cc
@@ -2968,7 +2968,13 @@ EXPECT_EQ(fixed->LocalBoundingBoxForCompositingOverlapTest(), PhysicalRect(0, 0, 50, 50)); EXPECT_EQ(fixed->UnclippedAbsoluteBoundingBox(), IntRect(117, 117, 66, 66)); - EXPECT_EQ(fixed->ClippedAbsoluteBoundingBox(), IntRect(117, 117, 66, 66)); + // These values differ because CompositingOptimizationsEnabled takes into + // account transforms (the one one the .xform element), whereas + // CompositingOptimizationsDisabled (incorrectly) does not. + if (!RuntimeEnabledFeatures::CompositingOptimizationsEnabled()) + EXPECT_EQ(fixed->ClippedAbsoluteBoundingBox(), IntRect(117, 117, 66, 66)); + else + EXPECT_EQ(fixed->ClippedAbsoluteBoundingBox(), IntRect(118, 118, 64, 64)); } TEST_P(PaintLayerOverlapTest, NestedFixedUsesExpandedBoundingBoxForOverlap) {
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 2227b7db..87c0843 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
@@ -1547,29 +1547,6 @@ } } -// Returns true if we are printing which was initiated by the frame. We should -// ignore clipping and scroll transform on contents. WebLocalFrameImpl will -// issue artificial page clip for each page, and always print from the origin -// of the contents for which no scroll offset should be applied. -static bool IsPrintingRootLayoutView(const LayoutObject& object) { - if (!IsA<LayoutView>(object)) - return false; - - const auto& frame = *object.GetFrame(); - if (!frame.GetDocument()->Printing()) - return false; - - const auto* parent_frame = frame.Tree().Parent(); - // TODO(crbug.com/455764): The local frame may be not the root frame of - // printing when it's printing under a remote frame. - auto* parent_local_frame = DynamicTo<LocalFrame>(parent_frame); - if (!parent_local_frame) - return true; - - // If the parent frame is printing, this frame should clip normally. - return !parent_local_frame->GetDocument()->Printing(); -} - // TODO(wangxianzhu): Combine the logic by overriding LayoutBox:: // ComputeOverflowClipAxes() in LayoutReplaced and subclasses and remove // this function. @@ -1604,9 +1581,16 @@ SVGLayoutSupport::IsOverflowHidden(object)) return true; - return object.IsBox() && - To<LayoutBox>(object).ShouldClipOverflowAlongEitherAxis() && - !IsPrintingRootLayoutView(object); + if (!object.IsBox()) + return false; + + if (!To<LayoutBox>(object).ShouldClipOverflowAlongEitherAxis()) + return false; + + if (IsA<LayoutView>(object) && !object.GetFrame()->ClipsContent()) + return false; + + return true; } void FragmentPaintPropertyTreeBuilder::UpdateLocalBorderBoxContext() { @@ -1735,10 +1719,6 @@ static bool CanOmitOverflowClip(const LayoutObject& object) { DCHECK(NeedsOverflowClip(object)); - if (IsA<LayoutView>(object) && !object.GetFrame()->ClipsContent()) { - return true; - } - // Some non-block boxes and SVG objects have special overflow rules. const auto* block = DynamicTo<LayoutBlock>(object); if (!block || object.IsSVG()) @@ -1767,14 +1747,15 @@ if (block->HasLayer() && block->Layer()->FirstChild()) return false; - // TODO(wangxianzhu): It's incorrect to test the physical clip_rect against - // the flipped ContentsVisualOverflowRect and LayoutOverflowRect. - if (!clip_rect.ToLayoutRect().Contains(block->ContentsVisualOverflowRect())) + if (!clip_rect.Contains(block->PhysicalContentsVisualOverflowRect())) return false; // Content can scroll, and needs to be clipped, if the layout overflow extends // beyond the clip rect. - return clip_rect.ToLayoutRect().Contains(block->LayoutOverflowRect()); + if (!clip_rect.Contains(block->PhysicalLayoutOverflowRect())) + return false; + + return true; } void FragmentPaintPropertyTreeBuilder::UpdateOverflowClip() {
diff --git a/third_party/blink/renderer/core/style/computed_style_constants.h b/third_party/blink/renderer/core/style/computed_style_constants.h index 2fda3cbc..1811443 100644 --- a/third_party/blink/renderer/core/style/computed_style_constants.h +++ b/third_party/blink/renderer/core/style/computed_style_constants.h
@@ -65,6 +65,8 @@ kPseudoIdSelection, kPseudoIdScrollbar, kPseudoIdTargetText, + kPseudoIdSpellingError, + kPseudoIdGrammarError, // Internal IDs follow: kPseudoIdFirstLineInherited, kPseudoIdScrollbarThumb,
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 index 1a740b1..48612ba6 100644 --- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 +++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -228,7 +228,7 @@ { name: "PseudoBits", field_template: "primitive", - field_size: 9, + field_size: 11, default_value: "kPseudoIdNone", type_name: "unsigned", custom_copy: true,
diff --git a/third_party/blink/renderer/core/style/computed_style_test.cc b/third_party/blink/renderer/core/style/computed_style_test.cc index 219f8b12..bb184154 100644 --- a/third_party/blink/renderer/core/style/computed_style_test.cc +++ b/third_party/blink/renderer/core/style/computed_style_test.cc
@@ -155,12 +155,12 @@ } TEST(ComputedStyleTest, LastPublicPseudoElementStyle) { - static_assert(kFirstInternalPseudoId - 1 == kPseudoIdTargetText, + static_assert(kFirstInternalPseudoId - 1 == kPseudoIdGrammarError, "Make sure we are testing the last public pseudo id"); scoped_refptr<ComputedStyle> style = ComputedStyle::Create(); - style->SetHasPseudoElementStyle(kPseudoIdTargetText); - EXPECT_TRUE(style->HasPseudoElementStyle(kPseudoIdTargetText)); + style->SetHasPseudoElementStyle(kPseudoIdGrammarError); + EXPECT_TRUE(style->HasPseudoElementStyle(kPseudoIdGrammarError)); EXPECT_TRUE(style->HasAnyPseudoElementStyles()); }
diff --git a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc index 05f56cf7..6da2c78 100644 --- a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc +++ b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
@@ -97,14 +97,11 @@ // Only calculate the relevant animations. If we actually set the // animation value, we don't need to calculate what is beneath it // in the sandwich. - bool needs_underlying_value = true; auto* sandwich_start = active_.end(); while (sandwich_start != active_.begin()) { --sandwich_start; - if ((*sandwich_start)->OverwritesUnderlyingAnimationValue()) { - needs_underlying_value = false; + if ((*sandwich_start)->OverwritesUnderlyingAnimationValue()) break; - } } // For now we need an element to setup and apply an animation. Any animation @@ -114,8 +111,7 @@ // Only reset the animated type to the base value once for // the lowest priority animation that animates and // contributes to a particular element/attribute pair. - SMILAnimationValue animation_value = - animation->CreateAnimationValue(needs_underlying_value); + SMILAnimationValue animation_value = animation->CreateAnimationValue(); for (auto* sandwich_it = sandwich_start; sandwich_it != active_.end(); sandwich_it++) {
diff --git a/third_party/blink/renderer/core/svg/svg_animate_element.cc b/third_party/blink/renderer/core/svg/svg_animate_element.cc index b123fce..62d3ae2 100644 --- a/third_party/blink/renderer/core/svg/svg_animate_element.cc +++ b/third_party/blink/renderer/core/svg/svg_animate_element.cc
@@ -415,8 +415,7 @@ return true; } -SMILAnimationValue SVGAnimateElement::CreateAnimationValue( - bool needs_underlying_value) const { +SMILAnimationValue SVGAnimateElement::CreateAnimationValue() const { DCHECK(targetElement()); SMILAnimationValue animation_value; if (IsAnimatingSVGDom()) { @@ -431,9 +430,7 @@ // CSS properties animation code-path. String base_value = - needs_underlying_value - ? ComputeCSSPropertyValue(targetElement(), css_property_id_) - : g_empty_string; + ComputeCSSPropertyValue(targetElement(), css_property_id_); animation_value.property_value = CreatePropertyForCSSAnimation(base_value); } return animation_value;
diff --git a/third_party/blink/renderer/core/svg/svg_animate_element.h b/third_party/blink/renderer/core/svg/svg_animate_element.h index af6440f0..e6d2695 100644 --- a/third_party/blink/renderer/core/svg/svg_animate_element.h +++ b/third_party/blink/renderer/core/svg/svg_animate_element.h
@@ -61,8 +61,7 @@ bool HasValidAnimation() const override; - SMILAnimationValue CreateAnimationValue( - bool needs_underlying_value) const final; + SMILAnimationValue CreateAnimationValue() const final; void ClearAnimationValue() final; bool CalculateToAtEndOfDurationValue(
diff --git a/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc b/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc index 47c7480..bb52b24 100644 --- a/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc +++ b/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
@@ -153,8 +153,7 @@ }); } -SMILAnimationValue SVGAnimateMotionElement::CreateAnimationValue( - bool needs_underlying_value) const { +SMILAnimationValue SVGAnimateMotionElement::CreateAnimationValue() const { DCHECK(targetElement()); DCHECK(TargetCanHaveMotionTransform(*targetElement())); return SMILAnimationValue();
diff --git a/third_party/blink/renderer/core/svg/svg_animate_motion_element.h b/third_party/blink/renderer/core/svg/svg_animate_motion_element.h index a08026c..f2aa2082 100644 --- a/third_party/blink/renderer/core/svg/svg_animate_motion_element.h +++ b/third_party/blink/renderer/core/svg/svg_animate_motion_element.h
@@ -42,8 +42,7 @@ void ParseAttribute(const AttributeModificationParams&) override; - SMILAnimationValue CreateAnimationValue( - bool needs_underlying_value) const override; + SMILAnimationValue CreateAnimationValue() const override; void ClearAnimationValue() override; bool CalculateToAtEndOfDurationValue( const String& to_at_end_of_duration_string) override;
diff --git a/third_party/blink/renderer/core/svg/svg_animation_element.h b/third_party/blink/renderer/core/svg/svg_animation_element.h index 0b1659f..779b21a 100644 --- a/third_party/blink/renderer/core/svg/svg_animation_element.h +++ b/third_party/blink/renderer/core/svg/svg_animation_element.h
@@ -72,8 +72,7 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(end, kEndEvent) DEFINE_ATTRIBUTE_EVENT_LISTENER(repeat, kRepeatEvent) - virtual SMILAnimationValue CreateAnimationValue( - bool needs_underlying_value) const = 0; + virtual SMILAnimationValue CreateAnimationValue() const = 0; void ApplyAnimation(SMILAnimationValue&); virtual void ApplyResultsToTarget(const SMILAnimationValue&) = 0;
diff --git a/third_party/blink/renderer/core/svg/svg_resource_client.h b/third_party/blink/renderer/core/svg/svg_resource_client.h index 19ab994..0de2357 100644 --- a/third_party/blink/renderer/core/svg/svg_resource_client.h +++ b/third_party/blink/renderer/core/svg/svg_resource_client.h
@@ -28,6 +28,9 @@ kPaintPropertiesInvalidation = 1 << 3, kClipCacheInvalidation = 1 << 4, kFilterCacheInvalidation = 1 << 5, + kInvalidateAll = kLayoutInvalidation | kBoundariesInvalidation | + kPaintInvalidation | kPaintPropertiesInvalidation | + kClipCacheInvalidation | kFilterCacheInvalidation, }; virtual void ResourceContentChanged(InvalidationModeMask) = 0; virtual void ResourceElementChanged() = 0;
diff --git a/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc b/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc index 3997607..6d8435f 100644 --- a/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc +++ b/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc
@@ -166,7 +166,8 @@ MemoryBreakdownEntry* ConvertBreakdown( const WebMemoryBreakdownEntryPtr& breakdown_entry) { auto* result = MemoryBreakdownEntry::Create(); - result->setBytes(breakdown_entry->bytes); + DCHECK(breakdown_entry->memory); + result->setBytes(breakdown_entry->memory->bytes); HeapVector<Member<MemoryAttribution>> attribution; for (const auto& entry : breakdown_entry->attribution) { attribution.push_back(ConvertAttribution(entry)); @@ -187,7 +188,9 @@ MemoryMeasurement* ConvertResult(const WebMemoryMeasurementPtr& measurement) { HeapVector<Member<MemoryBreakdownEntry>> breakdown; for (const auto& entry : measurement->breakdown) { - breakdown.push_back(ConvertBreakdown(entry)); + // Skip breakdowns that didn't get a measurement. + if (entry->memory) + breakdown.push_back(ConvertBreakdown(entry)); } // Add an empty breakdown entry as required by the spec. // See https://github.com/WICG/performance-measure-memory/issues/10.
diff --git a/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet.cc b/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet.cc index e567f7e..4fbe937d 100644 --- a/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet.cc +++ b/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/modules/csspaint/background_color_paint_worklet.h" #include "third_party/blink/renderer/core/animation/animation_effect.h" +#include "third_party/blink/renderer/core/animation/css/compositor_keyframe_double.h" #include "third_party/blink/renderer/core/animation/css_color_interpolation_type.h" #include "third_party/blink/renderer/core/animation/element_animations.h" #include "third_party/blink/renderer/core/css/css_color_value.h" @@ -29,16 +30,20 @@ const FloatSize& container_size, int worklet_id, const Vector<Color>& animated_colors, + const Vector<double>& offsets, cc::PaintWorkletInput::PropertyKeys property_keys) : PaintWorkletInput(container_size, worklet_id, std::move(property_keys)), - animated_colors_(animated_colors) {} + animated_colors_(animated_colors), + offsets_(offsets) {} ~BackgroundColorPaintWorkletInput() override = default; const Vector<Color>& AnimatedColors() const { return animated_colors_; } + const Vector<double>& Offsets() const { return offsets_; } private: Vector<Color> animated_colors_; + Vector<double> offsets_; }; class BackgroundColorPaintWorkletProxyClient @@ -64,18 +69,39 @@ static_cast<const BackgroundColorPaintWorkletInput*>(compositor_input); FloatSize container_size = input->ContainerSize(); Vector<Color> animated_colors = input->AnimatedColors(); + Vector<double> offsets = input->Offsets(); DCHECK_GT(animated_colors.size(), 1u); + DCHECK_EQ(animated_colors.size(), offsets.size()); DCHECK_EQ(animated_property_values.size(), 1u); const auto& entry = animated_property_values.begin(); float progress = entry->second.float_value.value(); + + // Get the start and end color based on the progress and offsets. + DCHECK_EQ(offsets.front(), 0); + DCHECK_EQ(offsets.back(), 1); + unsigned result_index = -1; + for (unsigned i = 0; i < offsets.size() - 1; i++) { + if (progress <= offsets[i + 1]) { + result_index = i; + break; + } + } + DCHECK_GE(result_index, 0u); + // Because the progress is a global one, we need to adjust it with offsets. + float adjusted_progress = + (progress - offsets[result_index]) / + (offsets[result_index + 1] - offsets[result_index]); std::unique_ptr<InterpolableValue> from = - CSSColorInterpolationType::CreateInterpolableColor(animated_colors[0]); + CSSColorInterpolationType::CreateInterpolableColor( + animated_colors[result_index]); std::unique_ptr<InterpolableValue> to = - CSSColorInterpolationType::CreateInterpolableColor(animated_colors[1]); + CSSColorInterpolationType::CreateInterpolableColor( + animated_colors[result_index + 1]); std::unique_ptr<InterpolableValue> result = - CSSColorInterpolationType::CreateInterpolableColor(animated_colors[1]); - from->Interpolate(*to, progress, *result); + CSSColorInterpolationType::CreateInterpolableColor( + animated_colors[result_index + 1]); + from->Interpolate(*to, adjusted_progress, *result); Color rgba = CSSColorInterpolationType::GetRGBA(*(result.get())); SkColor current_color = static_cast<SkColor>(rgba); @@ -88,6 +114,7 @@ } }; +// TODO(crbug.com/1163949): Support animation keyframes without 0% or 100%. void GetColorsFromStringKeyframe(const PropertySpecificKeyframe* frame, Vector<Color>* animated_colors, const Element* element) { @@ -103,6 +130,13 @@ animated_colors->push_back(color_value->Value()); } +void GetCompositorKeyframeOffset(const PropertySpecificKeyframe* frame, + Vector<double>* offsets) { + const CompositorKeyframeDouble& value = + To<CompositorKeyframeDouble>(*(frame->GetCompositorKeyframeValue())); + offsets->push_back(value.ToDouble()); +} + void GetColorsFromTransitionKeyframe(const PropertySpecificKeyframe* frame, Vector<Color>* animated_colors, const Element* element) { @@ -140,6 +174,7 @@ const Node* node) { DCHECK(node->IsElementNode()); Vector<Color> animated_colors; + Vector<double> offsets; const Element* element = static_cast<const Element*>(node); ElementAnimations* element_animations = element->GetElementAnimations(); // TODO(crbug.com/1153672): implement main-thread fall back logic for @@ -154,16 +189,12 @@ model->GetPropertySpecificKeyframes( PropertyHandle(GetCSSPropertyBackgroundColor())); DCHECK_GE(frames->size(), 2u); - // TODO(crbug.com/1153671): right now we keep the first and last keyframe - // values only, we need to keep all keyframe values. - if (model->IsStringKeyframeEffectModel()) { - GetColorsFromStringKeyframe(frames->front(), &animated_colors, element); - GetColorsFromStringKeyframe(frames->back(), &animated_colors, element); - } else { - GetColorsFromTransitionKeyframe(frames->front(), &animated_colors, - element); - GetColorsFromTransitionKeyframe(frames->back(), &animated_colors, - element); + for (const auto& frame : *frames) { + if (model->IsStringKeyframeEffectModel()) + GetColorsFromStringKeyframe(frame, &animated_colors, element); + else + GetColorsFromTransitionKeyframe(frame, &animated_colors, element); + GetCompositorKeyframeOffset(frame, &offsets); } } @@ -178,7 +209,7 @@ element_id); scoped_refptr<BackgroundColorPaintWorkletInput> input = base::MakeRefCounted<BackgroundColorPaintWorkletInput>( - container_size, worklet_id_, animated_colors, + container_size, worklet_id_, animated_colors, offsets, std::move(input_property_keys)); return PaintWorkletDeferredImage::Create(std::move(input), container_size); }
diff --git a/third_party/blink/renderer/modules/file_system_access/BUILD.gn b/third_party/blink/renderer/modules/file_system_access/BUILD.gn index 38f13af..6727d5d 100644 --- a/third_party/blink/renderer/modules/file_system_access/BUILD.gn +++ b/third_party/blink/renderer/modules/file_system_access/BUILD.gn
@@ -6,26 +6,26 @@ blink_modules_sources("file_system_access") { sources = [ - "data_transfer_item_native_file_system.cc", - "data_transfer_item_native_file_system.h", - "global_native_file_system.cc", - "global_native_file_system.h", - "native_file_system_directory_handle.cc", - "native_file_system_directory_handle.h", - "native_file_system_directory_iterator.cc", - "native_file_system_directory_iterator.h", - "native_file_system_error.cc", - "native_file_system_error.h", - "native_file_system_file_handle.cc", - "native_file_system_file_handle.h", - "native_file_system_handle.cc", - "native_file_system_handle.h", - "native_file_system_underlying_sink.cc", - "native_file_system_underlying_sink.h", - "native_file_system_writable_file_stream.cc", - "native_file_system_writable_file_stream.h", - "storage_manager_native_file_system.cc", - "storage_manager_native_file_system.h", + "data_transfer_item_file_system_access.cc", + "data_transfer_item_file_system_access.h", + "file_system_access_error.cc", + "file_system_access_error.h", + "file_system_directory_handle.cc", + "file_system_directory_handle.h", + "file_system_directory_iterator.cc", + "file_system_directory_iterator.h", + "file_system_file_handle.cc", + "file_system_file_handle.h", + "file_system_handle.cc", + "file_system_handle.h", + "file_system_underlying_sink.cc", + "file_system_underlying_sink.h", + "file_system_writable_file_stream.cc", + "file_system_writable_file_stream.h", + "global_file_system_access.cc", + "global_file_system_access.h", + "storage_manager_file_system_access.cc", + "storage_manager_file_system_access.h", ] deps = [ "//third_party/blink/renderer/platform" ] @@ -33,7 +33,7 @@ source_set("unit_tests") { testonly = true - sources = [ "global_native_file_system_test.cc" ] + sources = [ "global_file_system_access_test.cc" ] configs += [ "//third_party/blink/renderer:config",
diff --git a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.cc b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.cc similarity index 93% rename from third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.cc rename to third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.cc index b370f56..3e54366 100644 --- a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.cc +++ b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.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 "third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.h" +#include "third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" @@ -18,9 +18,9 @@ #include "third_party/blink/renderer/core/clipboard/data_transfer.h" #include "third_party/blink/renderer/core/clipboard/data_transfer_item.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -29,7 +29,7 @@ namespace blink { // static -ScriptPromise DataTransferItemNativeFileSystem::getAsFileSystemHandle( +ScriptPromise DataTransferItemFileSystemAccess::getAsFileSystemHandle( ScriptState* script_state, DataTransferItem& data_transfer_item) { if (!data_transfer_item.GetDataTransfer()->CanReadData()) { @@ -72,7 +72,7 @@ ScriptState* script_state = resolver->GetScriptState(); if (!script_state) return; - resolver->Resolve(NativeFileSystemHandle::CreateFromMojoEntry( + resolver->Resolve(FileSystemHandle::CreateFromMojoEntry( std::move(entry), ExecutionContext::From(script_state))); }, std::move(nfs_manager), WrapPersistent(resolver)));
diff --git a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.h b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.h similarity index 76% rename from third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.h rename to third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.h index e917182..6db9014 100644 --- a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.h +++ b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.h
@@ -2,18 +2,18 @@ // 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_FILE_SYSTEM_ACCESS_DATA_TRANSFER_ITEM_NATIVE_FILE_SYSTEM_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_DATA_TRANSFER_ITEM_NATIVE_FILE_SYSTEM_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_DATA_TRANSFER_ITEM_FILE_SYSTEM_ACCESS_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_DATA_TRANSFER_ITEM_FILE_SYSTEM_ACCESS_H_ #include "third_party/blink/renderer/core/clipboard/data_transfer_item.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" namespace blink { -class DataTransferItemNativeFileSystem { - STATIC_ONLY(DataTransferItemNativeFileSystem); +class DataTransferItemFileSystemAccess { + STATIC_ONLY(DataTransferItemFileSystemAccess); public: static ScriptPromise getAsFileSystemHandle(ScriptState*, DataTransferItem&); @@ -21,4 +21,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_DATA_TRANSFER_ITEM_NATIVE_FILE_SYSTEM_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_DATA_TRANSFER_ITEM_FILE_SYSTEM_ACCESS_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.idl b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.idl new file mode 100644 index 0000000..867af6cb --- /dev/null +++ b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_file_system_access.idl
@@ -0,0 +1,12 @@ +// Copyright 2020 The Chromium 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://wicg.github.io/file-system-access/#drag-and-drop +[ + ImplementedAs=DataTransferItemFileSystemAccess, + RuntimeEnabled=FileSystemAccess +] partial interface DataTransferItem { + [CallWith=ScriptState, MeasureAs=FileSystemAccessDragAndDrop] + Promise<FileSystemHandle?> getAsFileSystemHandle(); +};
diff --git a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.idl b/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.idl deleted file mode 100644 index 48a9f1d..0000000 --- a/third_party/blink/renderer/modules/file_system_access/data_transfer_item_native_file_system.idl +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -[ - ImplementedAs=DataTransferItemNativeFileSystem, - RuntimeEnabled=NativeFileSystem -] partial interface DataTransferItem { - [CallWith=ScriptState, MeasureAs=NativeFileSystemDragAndDrop] Promise<FileSystemHandle?> getAsFileSystemHandle(); -};
diff --git a/third_party/blink/renderer/modules/file_system_access/directory_picker_options.idl b/third_party/blink/renderer/modules/file_system_access/directory_picker_options.idl index c6160d5e..1f6af0e 100644 --- a/third_party/blink/renderer/modules/file_system_access/directory_picker_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/directory_picker_options.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-directorypickeroptions +// https://wicg.github.io/file-system-access/#dictdef-directorypickeroptions dictionary DirectoryPickerOptions { [RuntimeEnabled=FileSystemAccessAPIExperimental] CommonDirectory? startIn; };
diff --git a/third_party/blink/renderer/modules/file_system_access/file_picker_accept_type.idl b/third_party/blink/renderer/modules/file_system_access/file_picker_accept_type.idl index dc3f822..9dfee44 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_picker_accept_type.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_picker_accept_type.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-filepickeraccepttype +// https://wicg.github.io/file-system-access/#dictdef-filepickeraccepttype dictionary FilePickerAcceptType { USVString description; record<USVString, (USVString or sequence<USVString>)> accept;
diff --git a/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl b/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl index 3156525..3279e8a 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_picker_options.idl
@@ -12,7 +12,7 @@ "videos", }; -// https://wicg.github.io/native-file-system/#dictdef-filepickeroptions +// https://wicg.github.io/file-system-access/#dictdef-filepickeroptions dictionary FilePickerOptions { sequence<FilePickerAcceptType> types; boolean excludeAcceptAllOption = false;
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_error.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_error.cc similarity index 96% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_error.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_access_error.cc index 128f63a..541a2355 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_error.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_error.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 "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" @@ -13,7 +13,7 @@ #include "third_party/blink/renderer/platform/heap/heap.h" namespace blink { -namespace native_file_system_error { +namespace file_system_access_error { void Reject(ScriptPromiseResolver* resolver, const mojom::blink::FileSystemAccessError& error) { @@ -65,5 +65,5 @@ } } -} // namespace native_file_system_error +} // namespace file_system_access_error } // namespace blink
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_error.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_error.h similarity index 76% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_error.h rename to third_party/blink/renderer/modules/file_system_access/file_system_access_error.h index caa5d2e70f..5165fee2 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_error.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_error.h
@@ -2,15 +2,15 @@ // 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_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_ERROR_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_ERROR_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_ERROR_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_ERROR_H_ #include "base/files/file.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink-forward.h" namespace blink { class ScriptPromiseResolver; -namespace native_file_system_error { +namespace file_system_access_error { // Rejects |resolver| with an appropriate exception if |status| represents an // error. Resolves |resolver| with undefined otherwise. @@ -22,7 +22,7 @@ void Reject(ScriptPromiseResolver* resolver, const mojom::blink::FileSystemAccessError& error); -} // namespace native_file_system_error +} // namespace file_system_access_error } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_ERROR_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_ERROR_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_create_writer_options.idl b/third_party/blink/renderer/modules/file_system_access/file_system_create_writable_options.idl similarity index 68% rename from third_party/blink/renderer/modules/file_system_access/file_system_create_writer_options.idl rename to third_party/blink/renderer/modules/file_system_access/file_system_create_writable_options.idl index 4897040..d3ab371 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_create_writer_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_create_writable_options.idl
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-filesystemcreatewriteroptions -dictionary FileSystemCreateWriterOptions { +// https://wicg.github.io/file-system-access/#dictdef-filesystemcreatewritableoptions +dictionary FileSystemCreateWritableOptions { boolean keepExistingData = false; [RuntimeEnabled=FileSystemAccessAPIExperimental] boolean autoClose = false; };
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.cc similarity index 78% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.cc index ca377b0c..571df52 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.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 "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -19,9 +19,9 @@ #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/security_context.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -30,35 +30,33 @@ using mojom::blink::FileSystemAccessErrorPtr; -NativeFileSystemDirectoryHandle::NativeFileSystemDirectoryHandle( +FileSystemDirectoryHandle::FileSystemDirectoryHandle( ExecutionContext* context, const String& name, mojo::PendingRemote<mojom::blink::FileSystemAccessDirectoryHandle> mojo_ptr) - : NativeFileSystemHandle(context, name), mojo_ptr_(context) { + : FileSystemHandle(context, name), mojo_ptr_(context) { mojo_ptr_.Bind(std::move(mojo_ptr), context->GetTaskRunner(TaskType::kMiscPlatformAPI)); DCHECK(mojo_ptr_.is_bound()); } -NativeFileSystemDirectoryIterator* NativeFileSystemDirectoryHandle::entries() { - return MakeGarbageCollected<NativeFileSystemDirectoryIterator>( - this, NativeFileSystemDirectoryIterator::Mode::kKeyValue, +FileSystemDirectoryIterator* FileSystemDirectoryHandle::entries() { + return MakeGarbageCollected<FileSystemDirectoryIterator>( + this, FileSystemDirectoryIterator::Mode::kKeyValue, GetExecutionContext()); } -NativeFileSystemDirectoryIterator* NativeFileSystemDirectoryHandle::keys() { - return MakeGarbageCollected<NativeFileSystemDirectoryIterator>( - this, NativeFileSystemDirectoryIterator::Mode::kKey, - GetExecutionContext()); +FileSystemDirectoryIterator* FileSystemDirectoryHandle::keys() { + return MakeGarbageCollected<FileSystemDirectoryIterator>( + this, FileSystemDirectoryIterator::Mode::kKey, GetExecutionContext()); } -NativeFileSystemDirectoryIterator* NativeFileSystemDirectoryHandle::values() { - return MakeGarbageCollected<NativeFileSystemDirectoryIterator>( - this, NativeFileSystemDirectoryIterator::Mode::kValue, - GetExecutionContext()); +FileSystemDirectoryIterator* FileSystemDirectoryHandle::values() { + return MakeGarbageCollected<FileSystemDirectoryIterator>( + this, FileSystemDirectoryIterator::Mode::kValue, GetExecutionContext()); } -ScriptPromise NativeFileSystemDirectoryHandle::getFileHandle( +ScriptPromise FileSystemDirectoryHandle::getFileHandle( ScriptState* script_state, const String& name, const FileSystemGetFileOptions* options) { @@ -76,10 +74,10 @@ if (!context) return; if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } - resolver->Resolve(MakeGarbageCollected<NativeFileSystemFileHandle>( + resolver->Resolve(MakeGarbageCollected<FileSystemFileHandle>( context, name, std::move(handle))); }, WrapPersistent(resolver), name)); @@ -87,7 +85,7 @@ return result; } -ScriptPromise NativeFileSystemDirectoryHandle::getDirectoryHandle( +ScriptPromise FileSystemDirectoryHandle::getDirectoryHandle( ScriptState* script_state, const String& name, const FileSystemGetDirectoryOptions* options) { @@ -111,12 +109,11 @@ if (!context) return; if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } - resolver->Resolve( - MakeGarbageCollected<NativeFileSystemDirectoryHandle>( - context, name, std::move(handle))); + resolver->Resolve(MakeGarbageCollected<FileSystemDirectoryHandle>( + context, name, std::move(handle))); }, WrapPersistent(resolver), name)); @@ -131,10 +128,9 @@ } // namespace -ScriptValue NativeFileSystemDirectoryHandle::getEntries( - ScriptState* script_state) { - auto* iterator = MakeGarbageCollected<NativeFileSystemDirectoryIterator>( - this, NativeFileSystemDirectoryIterator::Mode::kValue, +ScriptValue FileSystemDirectoryHandle::getEntries(ScriptState* script_state) { + auto* iterator = MakeGarbageCollected<FileSystemDirectoryIterator>( + this, FileSystemDirectoryIterator::Mode::kValue, ExecutionContext::From(script_state)); auto* isolate = script_state->GetIsolate(); auto context = script_state->GetContext(); @@ -150,7 +146,7 @@ return ScriptValue(script_state->GetIsolate(), result); } -ScriptPromise NativeFileSystemDirectoryHandle::removeEntry( +ScriptPromise FileSystemDirectoryHandle::removeEntry( ScriptState* script_state, const String& name, const FileSystemRemoveOptions* options) { @@ -167,16 +163,16 @@ name, options->recursive(), WTF::Bind( [](ScriptPromiseResolver* resolver, FileSystemAccessErrorPtr result) { - native_file_system_error::ResolveOrReject(resolver, *result); + file_system_access_error::ResolveOrReject(resolver, *result); }, WrapPersistent(resolver))); return result; } -ScriptPromise NativeFileSystemDirectoryHandle::resolve( +ScriptPromise FileSystemDirectoryHandle::resolve( ScriptState* script_state, - NativeFileSystemHandle* possible_child) { + FileSystemHandle* possible_child) { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise result = resolver->Promise(); @@ -192,7 +188,7 @@ [](ScriptPromiseResolver* resolver, FileSystemAccessErrorPtr result, const base::Optional<Vector<String>>& path) { if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } if (!path.has_value()) { @@ -207,19 +203,19 @@ } mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> -NativeFileSystemDirectoryHandle::Transfer() { +FileSystemDirectoryHandle::Transfer() { mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> result; if (mojo_ptr_.is_bound()) mojo_ptr_->Transfer(result.InitWithNewPipeAndPassReceiver()); return result; } -void NativeFileSystemDirectoryHandle::Trace(Visitor* visitor) const { +void FileSystemDirectoryHandle::Trace(Visitor* visitor) const { visitor->Trace(mojo_ptr_); - NativeFileSystemHandle::Trace(visitor); + FileSystemHandle::Trace(visitor); } -void NativeFileSystemDirectoryHandle::QueryPermissionImpl( +void FileSystemDirectoryHandle::QueryPermissionImpl( bool writable, base::OnceCallback<void(mojom::blink::PermissionStatus)> callback) { if (!mojo_ptr_.is_bound()) { @@ -229,7 +225,7 @@ mojo_ptr_->GetPermissionStatus(writable, std::move(callback)); } -void NativeFileSystemDirectoryHandle::RequestPermissionImpl( +void FileSystemDirectoryHandle::RequestPermissionImpl( bool writable, base::OnceCallback<void(mojom::blink::FileSystemAccessErrorPtr, mojom::blink::PermissionStatus)> callback) { @@ -245,7 +241,7 @@ mojo_ptr_->RequestPermission(writable, std::move(callback)); } -void NativeFileSystemDirectoryHandle::IsSameEntryImpl( +void FileSystemDirectoryHandle::IsSameEntryImpl( mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> other, base::OnceCallback<void(mojom::blink::FileSystemAccessErrorPtr, bool)> callback) {
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h b/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h similarity index 79% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h rename to third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h index 6f0fd14..0ade0d7 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h
@@ -2,33 +2,33 @@ // 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_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_DIRECTORY_HANDLE_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_DIRECTORY_HANDLE_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_DIRECTORY_HANDLE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_DIRECTORY_HANDLE_H_ #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_directory_handle.mojom-blink.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" namespace blink { class FileSystemGetDirectoryOptions; class FileSystemGetFileOptions; class FileSystemRemoveOptions; -class NativeFileSystemDirectoryIterator; +class FileSystemDirectoryIterator; -class NativeFileSystemDirectoryHandle final : public NativeFileSystemHandle { +class FileSystemDirectoryHandle final : public FileSystemHandle { DEFINE_WRAPPERTYPEINFO(); public: - NativeFileSystemDirectoryHandle( + FileSystemDirectoryHandle( ExecutionContext* context, const String& name, mojo::PendingRemote<mojom::blink::FileSystemAccessDirectoryHandle>); // FileSystemDirectoryHandle IDL interface: - NativeFileSystemDirectoryIterator* entries(); - NativeFileSystemDirectoryIterator* keys(); - NativeFileSystemDirectoryIterator* values(); + FileSystemDirectoryIterator* entries(); + FileSystemDirectoryIterator* keys(); + FileSystemDirectoryIterator* values(); bool isDirectory() const override { return true; } @@ -43,7 +43,7 @@ const String& name, const FileSystemRemoveOptions*); - ScriptPromise resolve(ScriptState*, NativeFileSystemHandle* possible_child); + ScriptPromise resolve(ScriptState*, FileSystemHandle* possible_child); mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> Transfer() override; @@ -74,4 +74,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_DIRECTORY_HANDLE_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_DIRECTORY_HANDLE_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl b/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl index c63eac8..bf18156 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl
@@ -2,21 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#filesystemdirectoryhandle +// https://wicg.github.io/file-system-access/#filesystemdirectoryhandle [ Exposed=(Window,Worker), SecureContext, Serializable, - RuntimeEnabled=NativeFileSystem, - ImplementedAs=NativeFileSystemDirectoryHandle + RuntimeEnabled=FileSystemAccess ] interface FileSystemDirectoryHandle : FileSystemHandle { // TODO(https://crbug.com/1087157): This interface defines an async // iterable, however that isn't supported yet by the bindings. So for now // just explicitly define what an async iterable definition implies. //async iterable<USVString, FileSystemHandle>; - NativeFileSystemDirectoryIterator entries(); - NativeFileSystemDirectoryIterator keys(); - NativeFileSystemDirectoryIterator values(); + FileSystemDirectoryIterator entries(); + FileSystemDirectoryIterator keys(); + FileSystemDirectoryIterator values(); [CallWith=ScriptState] Promise<FileSystemFileHandle> getFileHandle(USVString name, optional FileSystemGetFileOptions options = {}); [CallWith=ScriptState] Promise<FileSystemDirectoryHandle> getDirectoryHandle(USVString name, optional FileSystemGetDirectoryOptions options = {});
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.cc b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc similarity index 80% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc index 70e7e113..69d8970 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.cc
@@ -2,22 +2,22 @@ // 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/file_system_access/native_file_system_directory_iterator.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/renderer/platform/wtf/functional.h" namespace blink { -NativeFileSystemDirectoryIterator::NativeFileSystemDirectoryIterator( - NativeFileSystemDirectoryHandle* directory, +FileSystemDirectoryIterator::FileSystemDirectoryIterator( + FileSystemDirectoryHandle* directory, Mode mode, ExecutionContext* execution_context) : ExecutionContextClient(execution_context), @@ -28,17 +28,16 @@ execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI))); } -ScriptPromise NativeFileSystemDirectoryIterator::next( - ScriptState* script_state) { +ScriptPromise FileSystemDirectoryIterator::next(ScriptState* script_state) { if (error_) { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); auto result = resolver->Promise(); - native_file_system_error::Reject(resolver, *error_); + file_system_access_error::Reject(resolver, *error_); return result; } if (!entries_.IsEmpty()) { - NativeFileSystemHandle* handle = entries_.TakeFirst(); + FileSystemHandle* handle = entries_.TakeFirst(); ScriptValue result; switch (mode_) { case Mode::kKey: @@ -68,11 +67,11 @@ return ScriptPromise::Cast(script_state, V8IteratorResultDone(script_state)); } -bool NativeFileSystemDirectoryIterator::HasPendingActivity() const { +bool FileSystemDirectoryIterator::HasPendingActivity() const { return pending_next_; } -void NativeFileSystemDirectoryIterator::Trace(Visitor* visitor) const { +void FileSystemDirectoryIterator::Trace(Visitor* visitor) const { ScriptWrappable::Trace(visitor); ExecutionContextClient::Trace(visitor); visitor->Trace(receiver_); @@ -81,7 +80,7 @@ visitor->Trace(directory_); } -void NativeFileSystemDirectoryIterator::DidReadDirectory( +void FileSystemDirectoryIterator::DidReadDirectory( mojom::blink::FileSystemAccessErrorPtr result, Vector<mojom::blink::FileSystemAccessEntryPtr> entries, bool has_more_entries) { @@ -90,13 +89,13 @@ if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { error_ = std::move(result); if (pending_next_) { - native_file_system_error::Reject(pending_next_, *error_); + file_system_access_error::Reject(pending_next_, *error_); pending_next_ = nullptr; } return; } for (auto& e : entries) { - entries_.push_back(NativeFileSystemHandle::CreateFromMojoEntry( + entries_.push_back(FileSystemHandle::CreateFromMojoEntry( std::move(e), GetExecutionContext())); } waiting_for_more_entries_ = has_more_entries;
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.h b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.h similarity index 71% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.h rename to third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.h index 05b9003f..c1dca83 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_DIRECTORY_ITERATOR_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_DIRECTORY_ITERATOR_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_DIRECTORY_ITERATOR_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_DIRECTORY_ITERATOR_H_ #include "base/files/file.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_directory_handle.mojom-blink.h" @@ -15,15 +15,15 @@ #include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h" namespace blink { -class NativeFileSystemDirectoryHandle; -class NativeFileSystemHandle; +class FileSystemDirectoryHandle; +class FileSystemHandle; class ScriptPromise; class ScriptPromiseResolver; class ScriptState; -class NativeFileSystemDirectoryIterator final +class FileSystemDirectoryIterator final : public ScriptWrappable, - public ActiveScriptWrappable<NativeFileSystemDirectoryIterator>, + public ActiveScriptWrappable<FileSystemDirectoryIterator>, public ExecutionContextClient, public mojom::blink::FileSystemAccessDirectoryEntriesListener { DEFINE_WRAPPERTYPEINFO(); @@ -32,9 +32,9 @@ // Should this iterator returns keys, values or both? enum Mode { kKey, kValue, kKeyValue }; - NativeFileSystemDirectoryIterator(NativeFileSystemDirectoryHandle* directory, - Mode mode, - ExecutionContext* execution_context); + FileSystemDirectoryIterator(FileSystemDirectoryHandle* directory, + Mode mode, + ExecutionContext* execution_context); ScriptPromise next(ScriptState*); @@ -51,15 +51,15 @@ Mode mode_; mojom::blink::FileSystemAccessErrorPtr error_; bool waiting_for_more_entries_ = true; - HeapDeque<Member<NativeFileSystemHandle>> entries_; + HeapDeque<Member<FileSystemHandle>> entries_; Member<ScriptPromiseResolver> pending_next_; - Member<NativeFileSystemDirectoryHandle> directory_; + Member<FileSystemDirectoryHandle> directory_; HeapMojoReceiver<mojom::blink::FileSystemAccessDirectoryEntriesListener, - NativeFileSystemDirectoryIterator, + FileSystemDirectoryIterator, HeapMojoWrapperMode::kWithoutContextObserver> receiver_; }; } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_DIRECTORY_ITERATOR_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_DIRECTORY_ITERATOR_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.idl b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl similarity index 72% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.idl rename to third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl index 59a4c98..b9169b2 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_directory_iterator.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl
@@ -3,12 +3,12 @@ // found in the LICENSE file. // Async iterator returned by FileSystemDirectoryHandle.getEntries(). -// https://github.com/WICG/writable-files/blob/master/EXPLAINER.md +// https://wicg.github.io/file-system-access/#api-filesystemdirectoryhandle-asynciterable // https://www.ecma-international.org/ecma-262/9.0/index.html#sec-asynciterator-interface [ LegacyNoInterfaceObject, ActiveScriptWrappable, - RuntimeEnabled=NativeFileSystem -] interface NativeFileSystemDirectoryIterator { + RuntimeEnabled=FileSystemAccess +] interface FileSystemDirectoryIterator { [CallWith=ScriptState] Promise<any> next(); };
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc similarity index 83% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc index 921a1ee1..0308f905 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.cc
@@ -2,18 +2,18 @@ // 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/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom-blink.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" -#include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writer_options.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_create_writable_options.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/file.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/file_metadata.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -22,19 +22,19 @@ namespace blink { using mojom::blink::FileSystemAccessErrorPtr; -NativeFileSystemFileHandle::NativeFileSystemFileHandle( +FileSystemFileHandle::FileSystemFileHandle( ExecutionContext* context, const String& name, mojo::PendingRemote<mojom::blink::FileSystemAccessFileHandle> mojo_ptr) - : NativeFileSystemHandle(context, name), mojo_ptr_(context) { + : FileSystemHandle(context, name), mojo_ptr_(context) { mojo_ptr_.Bind(std::move(mojo_ptr), context->GetTaskRunner(TaskType::kMiscPlatformAPI)); DCHECK(mojo_ptr_.is_bound()); } -ScriptPromise NativeFileSystemFileHandle::createWritable( +ScriptPromise FileSystemFileHandle::createWritable( ScriptState* script_state, - const FileSystemCreateWriterOptions* options, + const FileSystemCreateWritableOptions* options, ExceptionState& exception_state) { if (!mojo_ptr_.is_bound()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, ""); @@ -55,11 +55,11 @@ if (!script_state) return; if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } - resolver->Resolve(NativeFileSystemWritableFileStream::Create( + resolver->Resolve(FileSystemWritableFileStream::Create( script_state, std::move(writer))); }, WrapPersistent(resolver))); @@ -67,9 +67,8 @@ return result; } -ScriptPromise NativeFileSystemFileHandle::getFile( - ScriptState* script_state, - ExceptionState& exception_state) { +ScriptPromise FileSystemFileHandle::getFile(ScriptState* script_state, + ExceptionState& exception_state) { if (!mojo_ptr_.is_bound()) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, ""); return ScriptPromise(); @@ -83,7 +82,7 @@ FileSystemAccessErrorPtr result, const base::File::Info& info, const scoped_refptr<BlobDataHandle>& blob) { if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } resolver->Resolve(MakeGarbageCollected<File>( @@ -95,19 +94,19 @@ } mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> -NativeFileSystemFileHandle::Transfer() { +FileSystemFileHandle::Transfer() { mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> result; if (mojo_ptr_.is_bound()) mojo_ptr_->Transfer(result.InitWithNewPipeAndPassReceiver()); return result; } -void NativeFileSystemFileHandle::Trace(Visitor* visitor) const { +void FileSystemFileHandle::Trace(Visitor* visitor) const { visitor->Trace(mojo_ptr_); - NativeFileSystemHandle::Trace(visitor); + FileSystemHandle::Trace(visitor); } -void NativeFileSystemFileHandle::QueryPermissionImpl( +void FileSystemFileHandle::QueryPermissionImpl( bool writable, base::OnceCallback<void(mojom::blink::PermissionStatus)> callback) { if (!mojo_ptr_.is_bound()) { @@ -117,7 +116,7 @@ mojo_ptr_->GetPermissionStatus(writable, std::move(callback)); } -void NativeFileSystemFileHandle::RequestPermissionImpl( +void FileSystemFileHandle::RequestPermissionImpl( bool writable, base::OnceCallback<void(mojom::blink::FileSystemAccessErrorPtr, mojom::blink::PermissionStatus)> callback) { @@ -133,7 +132,7 @@ mojo_ptr_->RequestPermission(writable, std::move(callback)); } -void NativeFileSystemFileHandle::IsSameEntryImpl( +void FileSystemFileHandle::IsSameEntryImpl( mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken> other, base::OnceCallback<void(mojom::blink::FileSystemAccessErrorPtr, bool)> callback) {
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h similarity index 78% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h rename to third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h index 449f0536..1c46d61 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h
@@ -2,22 +2,22 @@ // 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_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_FILE_HANDLE_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_FILE_HANDLE_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_FILE_HANDLE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_FILE_HANDLE_H_ #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_file_handle.mojom-blink.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" namespace blink { -class FileSystemCreateWriterOptions; +class FileSystemCreateWritableOptions; -class NativeFileSystemFileHandle final : public NativeFileSystemHandle { +class FileSystemFileHandle final : public FileSystemHandle { DEFINE_WRAPPERTYPEINFO(); public: - NativeFileSystemFileHandle( + FileSystemFileHandle( ExecutionContext* context, const String& name, mojo::PendingRemote<mojom::blink::FileSystemAccessFileHandle>); @@ -25,7 +25,7 @@ bool isFile() const override { return true; } ScriptPromise createWritable(ScriptState*, - const FileSystemCreateWriterOptions* options, + const FileSystemCreateWritableOptions* options, ExceptionState&); ScriptPromise getFile(ScriptState*, ExceptionState&); @@ -56,4 +56,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_FILE_HANDLE_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_FILE_HANDLE_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl index b24362e..f8c4cf50 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl
@@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#filesystemfilehandle +// https://wicg.github.io/file-system-access/#filesystemfilehandle [ Exposed=(Window,Worker), SecureContext, Serializable, - RuntimeEnabled=NativeFileSystem, - ImplementedAs=NativeFileSystemFileHandle + RuntimeEnabled=FileSystemAccess ] interface FileSystemFileHandle : FileSystemHandle { - [CallWith=ScriptState, RaisesException] Promise<FileSystemWritableFileStream> createWritable(optional FileSystemCreateWriterOptions options = {}); + [CallWith=ScriptState, RaisesException] + Promise<FileSystemWritableFileStream> createWritable(optional FileSystemCreateWritableOptions options = {}); + [CallWith=ScriptState, RaisesException] Promise<File> getFile(); };
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl b/third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl index 529b8dd2..8c45a7f 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-filesystemgetdirectoryoptions +// https://wicg.github.io/file-system-access/#dictdef-filesystemgetdirectoryoptions dictionary FileSystemGetDirectoryOptions { boolean create = false; };
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_get_file_options.idl b/third_party/blink/renderer/modules/file_system_access/file_system_get_file_options.idl index 57c5a7d..ad7d5a5 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_get_file_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_get_file_options.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-filesystemgetfileoptions +// https://wicg.github.io/file-system-access/#dictdef-filesystemgetfileoptions dictionary FileSystemGetFileOptions { boolean create = false; };
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_handle.cc similarity index 81% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_handle.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_handle.cc index 2809a9e..6ad3884 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_handle.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_handle.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 "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink.h" #include "third_party/blink/public/platform/task_type.h" @@ -10,29 +10,28 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_file_system_handle_permission_descriptor.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/renderer/platform/wtf/functional.h" namespace blink { using mojom::blink::FileSystemAccessEntryPtr; using mojom::blink::FileSystemAccessErrorPtr; -NativeFileSystemHandle::NativeFileSystemHandle( - ExecutionContext* execution_context, - const String& name) +FileSystemHandle::FileSystemHandle(ExecutionContext* execution_context, + const String& name) : ExecutionContextClient(execution_context), name_(name) {} // static -NativeFileSystemHandle* NativeFileSystemHandle::CreateFromMojoEntry( +FileSystemHandle* FileSystemHandle::CreateFromMojoEntry( mojom::blink::FileSystemAccessEntryPtr e, ExecutionContext* execution_context) { if (e->entry_handle->is_file()) { - return MakeGarbageCollected<NativeFileSystemFileHandle>( + return MakeGarbageCollected<FileSystemFileHandle>( execution_context, e->name, std::move(e->entry_handle->get_file())); } - return MakeGarbageCollected<NativeFileSystemDirectoryHandle>( + return MakeGarbageCollected<FileSystemDirectoryHandle>( execution_context, e->name, std::move(e->entry_handle->get_directory())); } @@ -52,7 +51,7 @@ } // namespace -ScriptPromise NativeFileSystemHandle::queryPermission( +ScriptPromise FileSystemHandle::queryPermission( ScriptState* script_state, const FileSystemHandlePermissionDescriptor* descriptor) { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); @@ -70,7 +69,7 @@ return result; } -ScriptPromise NativeFileSystemHandle::requestPermission( +ScriptPromise FileSystemHandle::requestPermission( ScriptState* script_state, const FileSystemHandlePermissionDescriptor* descriptor) { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); @@ -82,7 +81,7 @@ [](ScriptPromiseResolver* resolver, FileSystemAccessErrorPtr result, mojom::blink::PermissionStatus status) { if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } resolver->Resolve(MojoPermissionStatusToString(status)); @@ -92,9 +91,8 @@ return result; } -ScriptPromise NativeFileSystemHandle::isSameEntry( - ScriptState* script_state, - NativeFileSystemHandle* other) { +ScriptPromise FileSystemHandle::isSameEntry(ScriptState* script_state, + FileSystemHandle* other) { auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise result = resolver->Promise(); @@ -104,7 +102,7 @@ [](ScriptPromiseResolver* resolver, FileSystemAccessErrorPtr result, bool same) { if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } resolver->Resolve(same); @@ -113,7 +111,7 @@ return result; } -void NativeFileSystemHandle::Trace(Visitor* visitor) const { +void FileSystemHandle::Trace(Visitor* visitor) const { ScriptWrappable::Trace(visitor); ExecutionContextClient::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h b/third_party/blink/renderer/modules/file_system_access/file_system_handle.h similarity index 82% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h rename to third_party/blink/renderer/modules/file_system_access/file_system_handle.h index e3385d8..8ef5fe4 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_handle.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_HANDLE_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_HANDLE_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_HANDLE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_HANDLE_H_ #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_directory_handle.mojom-blink-forward.h" @@ -21,14 +21,12 @@ class ExecutionContext; class FileSystemHandlePermissionDescriptor; -class NativeFileSystemHandle : public ScriptWrappable, - public ExecutionContextClient { +class FileSystemHandle : public ScriptWrappable, public ExecutionContextClient { DEFINE_WRAPPERTYPEINFO(); public: - NativeFileSystemHandle(ExecutionContext* execution_context, - const String& name); - static NativeFileSystemHandle* CreateFromMojoEntry( + FileSystemHandle(ExecutionContext* execution_context, const String& name); + static FileSystemHandle* CreateFromMojoEntry( mojom::blink::FileSystemAccessEntryPtr, ExecutionContext* execution_context); @@ -42,7 +40,7 @@ ScriptPromise requestPermission(ScriptState*, const FileSystemHandlePermissionDescriptor*); - ScriptPromise isSameEntry(ScriptState*, NativeFileSystemHandle* other); + ScriptPromise isSameEntry(ScriptState*, FileSystemHandle* other); // Grab a handle to a transfer token. This may return an invalid PendingRemote // if the context is already destroyed. @@ -69,4 +67,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_HANDLE_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_HANDLE_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_handle.idl b/third_party/blink/renderer/modules/file_system_access/file_system_handle.idl index 1cab690..bff43870 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_handle.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_handle.idl
@@ -2,19 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#enumdef-filesystemhandlekind +// https://wicg.github.io/file-system-access/#enumdef-filesystemhandlekind enum FileSystemHandleKind { "file", "directory", }; -// https://wicg.github.io/native-file-system/#filesystemhandle +// https://wicg.github.io/file-system-access/#filesystemhandle [ Exposed=(Window,Worker), SecureContext, Serializable, - RuntimeEnabled=NativeFileSystem, - ImplementedAs=NativeFileSystemHandle + RuntimeEnabled=FileSystemAccess ] interface FileSystemHandle { // Brand checking APIs because javascript makes it otherwise really hard to // figure out what type an object is when you don't know in which global @@ -28,5 +27,6 @@ [CallWith=ScriptState] Promise<PermissionState> requestPermission( optional FileSystemHandlePermissionDescriptor descriptor = {}); - [CallWith=ScriptState, Measure] Promise<boolean> isSameEntry(FileSystemHandle other); + [CallWith=ScriptState, Measure] + Promise<boolean> isSameEntry(FileSystemHandle other); };
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_handle_permission_descriptor.idl b/third_party/blink/renderer/modules/file_system_access/file_system_handle_permission_descriptor.idl index c4762fc..4dd4048a 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_handle_permission_descriptor.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_handle_permission_descriptor.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. -// http://wicg.github.io/native-file-system/#enumdef-filesystempermissionmode +// http://wicg.github.io/file-system-access/#enumdef-filesystempermissionmode enum FileSystemPermissionMode { "read", "readwrite" }; -// http://wicg.github.io/native-file-system/#dictdef-filesystemhandlepermissiondescriptor +// http://wicg.github.io/file-system-access/#dictdef-filesystemhandlepermissiondescriptor dictionary FileSystemHandlePermissionDescriptor { FileSystemPermissionMode mode = "read"; };
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_remove_options.idl b/third_party/blink/renderer/modules/file_system_access/file_system_remove_options.idl index f3f8566..786bc94 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_remove_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_remove_options.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-filesystemremoveoptions +// https://wicg.github.io/file-system-access/#dictdef-filesystemremoveoptions dictionary FileSystemRemoveOptions { boolean recursive = false; };
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.cc b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc similarity index 82% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc index e59cc974..ff365fad 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.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 "third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.h" #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view_or_blob_or_usv_string.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" @@ -12,14 +12,14 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_write_params.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/blob.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/blob/blob_data.h" namespace blink { -NativeFileSystemUnderlyingSink::NativeFileSystemUnderlyingSink( +FileSystemUnderlyingSink::FileSystemUnderlyingSink( ExecutionContext* context, mojo::PendingRemote<mojom::blink::FileSystemAccessFileWriter> writer_remote) : writer_remote_(context) { @@ -28,14 +28,14 @@ DCHECK(writer_remote_.is_bound()); } -ScriptPromise NativeFileSystemUnderlyingSink::start( +ScriptPromise FileSystemUnderlyingSink::start( ScriptState* script_state, WritableStreamDefaultController* controller, ExceptionState& exception_state) { return ScriptPromise::CastUndefined(script_state); } -ScriptPromise NativeFileSystemUnderlyingSink::write( +ScriptPromise FileSystemUnderlyingSink::write( ScriptState* script_state, ScriptValue chunk, WritableStreamDefaultController* controller, @@ -70,9 +70,8 @@ exception_state); } -ScriptPromise NativeFileSystemUnderlyingSink::close( - ScriptState* script_state, - ExceptionState& exception_state) { +ScriptPromise FileSystemUnderlyingSink::close(ScriptState* script_state, + ExceptionState& exception_state) { if (!writer_remote_.is_bound() || pending_operation_) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, "Object reached an invalid state"); @@ -81,16 +80,15 @@ pending_operation_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise result = pending_operation_->Promise(); - writer_remote_->Close(WTF::Bind( - &NativeFileSystemUnderlyingSink::CloseComplete, WrapPersistent(this))); + writer_remote_->Close(WTF::Bind(&FileSystemUnderlyingSink::CloseComplete, + WrapPersistent(this))); return result; } -ScriptPromise NativeFileSystemUnderlyingSink::abort( - ScriptState* script_state, - ScriptValue reason, - ExceptionState& exception_state) { +ScriptPromise FileSystemUnderlyingSink::abort(ScriptState* script_state, + ScriptValue reason, + ExceptionState& exception_state) { // The specification guarantees that this will only be called after all // pending writes have been aborted. Terminating the remote connection // will ensure that the writes are not closed successfully. @@ -99,7 +97,7 @@ return ScriptPromise::CastUndefined(script_state); } -ScriptPromise NativeFileSystemUnderlyingSink::HandleParams( +ScriptPromise FileSystemUnderlyingSink::HandleParams( ScriptState* script_state, const WriteParams& params, ExceptionState& exception_state) { @@ -140,7 +138,7 @@ return ScriptPromise(); } -ScriptPromise NativeFileSystemUnderlyingSink::WriteData( +ScriptPromise FileSystemUnderlyingSink::WriteData( ScriptState* script_state, uint64_t position, const ArrayBufferOrArrayBufferViewOrBlobOrUSVString& data, @@ -173,7 +171,7 @@ return WriteBlob(script_state, position, blob, exception_state); } -ScriptPromise NativeFileSystemUnderlyingSink::WriteBlob( +ScriptPromise FileSystemUnderlyingSink::WriteBlob( ScriptState* script_state, uint64_t position, Blob* blob, @@ -186,14 +184,13 @@ pending_operation_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise result = pending_operation_->Promise(); - writer_remote_->Write( - position, blob->AsMojoBlob(), - WTF::Bind(&NativeFileSystemUnderlyingSink::WriteComplete, - WrapPersistent(this))); + writer_remote_->Write(position, blob->AsMojoBlob(), + WTF::Bind(&FileSystemUnderlyingSink::WriteComplete, + WrapPersistent(this))); return result; } -ScriptPromise NativeFileSystemUnderlyingSink::Truncate( +ScriptPromise FileSystemUnderlyingSink::Truncate( ScriptState* script_state, uint64_t size, ExceptionState& exception_state) { @@ -206,15 +203,14 @@ MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise result = pending_operation_->Promise(); writer_remote_->Truncate( - size, WTF::Bind(&NativeFileSystemUnderlyingSink::TruncateComplete, + size, WTF::Bind(&FileSystemUnderlyingSink::TruncateComplete, WrapPersistent(this), size)); return result; } -ScriptPromise NativeFileSystemUnderlyingSink::Seek( - ScriptState* script_state, - uint64_t offset, - ExceptionState& exception_state) { +ScriptPromise FileSystemUnderlyingSink::Seek(ScriptState* script_state, + uint64_t offset, + ExceptionState& exception_state) { if (!writer_remote_.is_bound() || pending_operation_) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, "Object reached an invalid state"); @@ -224,11 +220,11 @@ return ScriptPromise::CastUndefined(script_state); } -void NativeFileSystemUnderlyingSink::WriteComplete( +void FileSystemUnderlyingSink::WriteComplete( mojom::blink::FileSystemAccessErrorPtr result, uint64_t bytes_written) { DCHECK(pending_operation_); - native_file_system_error::ResolveOrReject(pending_operation_, *result); + file_system_access_error::ResolveOrReject(pending_operation_, *result); pending_operation_ = nullptr; if (result->status == mojom::blink::FileSystemAccessStatus::kOk) { @@ -237,11 +233,11 @@ } } -void NativeFileSystemUnderlyingSink::TruncateComplete( +void FileSystemUnderlyingSink::TruncateComplete( uint64_t to_size, mojom::blink::FileSystemAccessErrorPtr result) { DCHECK(pending_operation_); - native_file_system_error::ResolveOrReject(pending_operation_, *result); + file_system_access_error::ResolveOrReject(pending_operation_, *result); pending_operation_ = nullptr; if (result->status == mojom::blink::FileSystemAccessStatus::kOk) { @@ -251,17 +247,17 @@ } } -void NativeFileSystemUnderlyingSink::CloseComplete( +void FileSystemUnderlyingSink::CloseComplete( mojom::blink::FileSystemAccessErrorPtr result) { DCHECK(pending_operation_); - native_file_system_error::ResolveOrReject(pending_operation_, *result); + file_system_access_error::ResolveOrReject(pending_operation_, *result); pending_operation_ = nullptr; // We close the mojo pipe because we intend this writable file stream to be // discarded after close. Subsequent operations will fail. writer_remote_.reset(); } -void NativeFileSystemUnderlyingSink::Trace(Visitor* visitor) const { +void FileSystemUnderlyingSink::Trace(Visitor* visitor) const { ScriptWrappable::Trace(visitor); UnderlyingSinkBase::Trace(visitor); visitor->Trace(writer_remote_);
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.h b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.h similarity index 87% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.h rename to third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.h index 853a900..23cb4cd 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_UNDERLYING_SINK_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_UNDERLYING_SINK_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_UNDERLYING_SINK_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_UNDERLYING_SINK_H_ #include "third_party/blink/public/mojom/file_system_access/file_system_access_file_writer.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view_or_blob_or_usv_string.h" @@ -18,9 +18,9 @@ class ScriptPromiseResolver; class WriteParams; -class NativeFileSystemUnderlyingSink final : public UnderlyingSinkBase { +class FileSystemUnderlyingSink final : public UnderlyingSinkBase { public: - explicit NativeFileSystemUnderlyingSink( + explicit FileSystemUnderlyingSink( ExecutionContext*, mojo::PendingRemote<mojom::blink::FileSystemAccessFileWriter>); @@ -66,4 +66,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_UNDERLYING_SINK_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_UNDERLYING_SINK_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.cc b/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.cc similarity index 86% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.cc rename to third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.cc index 4e599eb..9d88ef3f 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.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 "third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h" #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view_or_blob_or_usv_string.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" @@ -12,13 +12,13 @@ #include "third_party/blink/renderer/core/streams/count_queuing_strategy.h" #include "third_party/blink/renderer/core/streams/writable_stream_default_controller.h" #include "third_party/blink/renderer/core/streams/writable_stream_default_writer.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_underlying_sink.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" namespace blink { -NativeFileSystemWritableFileStream* NativeFileSystemWritableFileStream::Create( +FileSystemWritableFileStream* FileSystemWritableFileStream::Create( ScriptState* script_state, mojo::PendingRemote<mojom::blink::FileSystemAccessFileWriter> writer_pending_remote) { @@ -27,9 +27,9 @@ ExecutionContext* context = ExecutionContext::From(script_state); - auto* stream = MakeGarbageCollected<NativeFileSystemWritableFileStream>(); + auto* stream = MakeGarbageCollected<FileSystemWritableFileStream>(); - auto* underlying_sink = MakeGarbageCollected<NativeFileSystemUnderlyingSink>( + auto* underlying_sink = MakeGarbageCollected<FileSystemUnderlyingSink>( context, std::move(writer_pending_remote)); stream->underlying_sink_ = underlying_sink; auto underlying_sink_value = ScriptValue::From(script_state, underlying_sink); @@ -43,7 +43,7 @@ ExceptionState exception_state(script_state->GetIsolate(), ExceptionState::kConstructionContext, - "NativeFileSystemWritableFileStream"); + "FileSystemWritableFileStream"); stream->InitInternal(script_state, underlying_sink_value, strategy_value, exception_state); @@ -53,7 +53,7 @@ return stream; } -ScriptPromise NativeFileSystemWritableFileStream::write( +ScriptPromise FileSystemWritableFileStream::write( ScriptState* script_state, const ArrayBufferOrArrayBufferViewOrBlobOrUSVStringOrWriteParams& data, ExceptionState& exception_state) { @@ -69,7 +69,7 @@ return promise; } -ScriptPromise NativeFileSystemWritableFileStream::truncate( +ScriptPromise FileSystemWritableFileStream::truncate( ScriptState* script_state, uint64_t size, ExceptionState& exception_state) { @@ -89,7 +89,7 @@ return promise; } -ScriptPromise NativeFileSystemWritableFileStream::close( +ScriptPromise FileSystemWritableFileStream::close( ScriptState* script_state, ExceptionState& exception_state) { WritableStreamDefaultWriter* writer = @@ -103,7 +103,7 @@ return promise; } -ScriptPromise NativeFileSystemWritableFileStream::seek( +ScriptPromise FileSystemWritableFileStream::seek( ScriptState* script_state, uint64_t offset, ExceptionState& exception_state) { @@ -123,7 +123,7 @@ return promise; } -void NativeFileSystemWritableFileStream::Trace(Visitor* visitor) const { +void FileSystemWritableFileStream::Trace(Visitor* visitor) const { WritableStream::Trace(visitor); visitor->Trace(underlying_sink_); }
diff --git a/third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.h b/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h similarity index 72% rename from third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.h rename to third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h index 55327a4..2f87469 100644 --- a/third_party/blink/renderer/modules/file_system_access/native_file_system_writable_file_stream.h +++ b/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_ #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom-blink.h" @@ -17,19 +17,19 @@ class ScriptPromise; class ScriptState; -class NativeFileSystemUnderlyingSink; +class FileSystemUnderlyingSink; -class NativeFileSystemWritableFileStream final : public WritableStream { +class FileSystemWritableFileStream final : public WritableStream { DEFINE_WRAPPERTYPEINFO(); public: - static NativeFileSystemWritableFileStream* Create( + static FileSystemWritableFileStream* Create( ScriptState*, mojo::PendingRemote<mojom::blink::FileSystemAccessFileWriter>); void Trace(Visitor* visitor) const override; - // IDL defined functions specific to NativeFileSystemWritableFileStream. + // IDL defined functions specific to FileSystemWritableFileStream. ScriptPromise write( ScriptState*, const ArrayBufferOrArrayBufferViewOrBlobOrUSVStringOrWriteParams& data, @@ -39,8 +39,8 @@ ScriptPromise seek(ScriptState*, uint64_t offset, ExceptionState&); private: - Member<NativeFileSystemUnderlyingSink> underlying_sink_; + Member<FileSystemUnderlyingSink> underlying_sink_; }; } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_NATIVE_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_FILE_SYSTEM_WRITABLE_FILE_STREAM_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.idl b/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.idl index e09e63d9..32a8914 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.idl +++ b/third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.idl
@@ -2,12 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#filesystemwritablefilestream +// https://wicg.github.io/file-system-access/#filesystemwritablefilestream [ Exposed=(Window,Worker), SecureContext, - ImplementedAs=NativeFileSystemWritableFileStream, - RuntimeEnabled=NativeFileSystem + RuntimeEnabled=FileSystemAccess ] interface FileSystemWritableFileStream : WritableStream { [CallWith=ScriptState, RaisesException] Promise<void> write((BufferSource or Blob or USVString or WriteParams) data); [CallWith=ScriptState, RaisesException] Promise<void> truncate(unsigned long long size);
diff --git a/third_party/blink/renderer/modules/file_system_access/global_native_file_system.cc b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc similarity index 94% rename from third_party/blink/renderer/modules/file_system_access/global_native_file_system.cc rename to third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc index e0dad660..ba70723 100644 --- a/third_party/blink/renderer/modules/file_system_access/global_native_file_system.cc +++ b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.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 "third_party/blink/renderer/modules/file_system_access/global_native_file_system.h" +#include "third_party/blink/renderer/modules/file_system_access/global_file_system_access.h" #include <utility> @@ -25,9 +25,9 @@ #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/workers/worker_global_scope.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_file_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_file_handle.h" #include "third_party/blink/renderer/platform/bindings/enumeration_base.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -142,7 +142,7 @@ return; } - if (!window.GetSecurityOrigin()->CanAccessNativeFileSystem()) { + if (!window.GetSecurityOrigin()->CanAccessFileSystem()) { if (window.IsSandboxed(network::mojom::blink::WebSandboxFlags::kOrigin)) { exception_state.ThrowSecurityError( "Sandboxed documents aren't allowed to show a file picker."); @@ -229,7 +229,7 @@ return; if (file_operation_result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, + file_system_access_error::Reject(resolver, *file_operation_result); return; } @@ -237,25 +237,25 @@ // While it would be better to not trust the renderer process, // we're doing this here to avoid potential mojo message pipe // ordering problems, where the frame activation state - // reconciliation messages would compete with concurrent Native File - // System messages to the browser. + // reconciliation messages would compete with concurrent File + // System Access messages to the browser. // TODO(https://crbug.com/1017270): Remove this after spec change, // or when activation moves to browser. LocalFrame::NotifyUserActivation( local_frame, mojom::blink::UserActivationNotificationType:: - kNativeFileSystem); + kFileSystemAccess); if (return_as_sequence) { - HeapVector<Member<NativeFileSystemHandle>> results; + HeapVector<Member<FileSystemHandle>> results; results.ReserveInitialCapacity(entries.size()); for (auto& entry : entries) { - results.push_back(NativeFileSystemHandle::CreateFromMojoEntry( + results.push_back(FileSystemHandle::CreateFromMojoEntry( std::move(entry), context)); } resolver->Resolve(results); } else { DCHECK_EQ(1u, entries.size()); - resolver->Resolve(NativeFileSystemHandle::CreateFromMojoEntry( + resolver->Resolve(FileSystemHandle::CreateFromMojoEntry( std::move(entries[0]), context)); } }, @@ -267,7 +267,7 @@ } // namespace // static -ScriptPromise GlobalNativeFileSystem::showOpenFilePicker( +ScriptPromise GlobalFileSystemAccess::showOpenFilePicker( ScriptState* script_state, LocalDOMWindow& window, const OpenFilePickerOptions* options, @@ -308,7 +308,7 @@ } // static -ScriptPromise GlobalNativeFileSystem::showSaveFilePicker( +ScriptPromise GlobalFileSystemAccess::showSaveFilePicker( ScriptState* script_state, LocalDOMWindow& window, const SaveFilePickerOptions* options, @@ -346,7 +346,7 @@ } // static -ScriptPromise GlobalNativeFileSystem::showDirectoryPicker( +ScriptPromise GlobalFileSystemAccess::showDirectoryPicker( ScriptState* script_state, LocalDOMWindow& window, const DirectoryPickerOptions* options,
diff --git a/third_party/blink/renderer/modules/file_system_access/global_native_file_system.h b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.h similarity index 90% rename from third_party/blink/renderer/modules/file_system_access/global_native_file_system.h rename to third_party/blink/renderer/modules/file_system_access/global_file_system_access.h index e0ee3bca..b6190eb3 100644 --- a/third_party/blink/renderer/modules/file_system_access/global_native_file_system.h +++ b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_GLOBAL_NATIVE_FILE_SYSTEM_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_GLOBAL_NATIVE_FILE_SYSTEM_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_GLOBAL_FILE_SYSTEM_ACCESS_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_GLOBAL_FILE_SYSTEM_ACCESS_H_ #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -18,8 +18,8 @@ class ScriptPromise; class ScriptState; -class GlobalNativeFileSystem { - STATIC_ONLY(GlobalNativeFileSystem); +class GlobalFileSystemAccess { + STATIC_ONLY(GlobalFileSystemAccess); public: static ScriptPromise showOpenFilePicker(ScriptState*, @@ -38,4 +38,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_GLOBAL_NATIVE_FILE_SYSTEM_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_GLOBAL_FILE_SYSTEM_ACCESS_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/global_native_file_system_test.cc b/third_party/blink/renderer/modules/file_system_access/global_file_system_access_test.cc similarity index 88% rename from third_party/blink/renderer/modules/file_system_access/global_native_file_system_test.cc rename to third_party/blink/renderer/modules/file_system_access/global_file_system_access_test.cc index 31f21e6..77bc8b04 100644 --- a/third_party/blink/renderer/modules/file_system_access/global_native_file_system_test.cc +++ b/third_party/blink/renderer/modules/file_system_access/global_file_system_access_test.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 "third_party/blink/renderer/modules/file_system_access/global_native_file_system.h" +#include "third_party/blink/renderer/modules/file_system_access/global_file_system_access.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -21,27 +21,27 @@ namespace blink { -class MockNativeFileSystemManager +class MockFileSystemAccessManager : public mojom::blink::FileSystemAccessManager { public: - MockNativeFileSystemManager(BrowserInterfaceBrokerProxy& broker, + MockFileSystemAccessManager(BrowserInterfaceBrokerProxy& broker, base::OnceClosure reached_callback) : reached_callback_(std::move(reached_callback)), broker_(broker) { broker_.SetBinderForTesting( mojom::blink::FileSystemAccessManager::Name_, WTF::BindRepeating( - &MockNativeFileSystemManager::BindNativeFileSystemManager, + &MockFileSystemAccessManager::BindFileSystemAccessManager, WTF::Unretained(this))); } - MockNativeFileSystemManager(BrowserInterfaceBrokerProxy& broker) + MockFileSystemAccessManager(BrowserInterfaceBrokerProxy& broker) : broker_(broker) { broker_.SetBinderForTesting( mojom::blink::FileSystemAccessManager::Name_, WTF::BindRepeating( - &MockNativeFileSystemManager::BindNativeFileSystemManager, + &MockFileSystemAccessManager::BindFileSystemAccessManager, WTF::Unretained(this))); } - ~MockNativeFileSystemManager() override { + ~MockFileSystemAccessManager() override { broker_.SetBinderForTesting(mojom::blink::FileSystemAccessManager::Name_, {}); } @@ -91,7 +91,7 @@ GetEntryFromDragDropTokenCallback callback) override {} private: - void BindNativeFileSystemManager(mojo::ScopedMessagePipeHandle handle) { + void BindFileSystemAccessManager(mojo::ScopedMessagePipeHandle handle) { receivers_.Add(this, mojo::PendingReceiver<mojom::blink::FileSystemAccessManager>( std::move(handle))); @@ -103,7 +103,7 @@ BrowserInterfaceBrokerProxy& broker_; }; -class GlobalNativeFileSystemTest : public PageTestBase { +class GlobalFileSystemAccessTest : public PageTestBase { public: void SetUp() override { PageTestBase::SetUp(); @@ -122,13 +122,13 @@ } }; -TEST_F(GlobalNativeFileSystemTest, UserActivationRequiredOtherwiseDenied) { +TEST_F(GlobalFileSystemAccessTest, UserActivationRequiredOtherwiseDenied) { LocalFrame* frame = &GetFrame(); EXPECT_FALSE(frame->HasStickyUserActivation()); - MockNativeFileSystemManager manager(frame->GetBrowserInterfaceBroker()); + MockFileSystemAccessManager manager(frame->GetBrowserInterfaceBroker()); manager.SetChooseEntriesResponse(WTF::Bind( - [](MockNativeFileSystemManager::ChooseEntriesCallback callback) { + [](MockFileSystemAccessManager::ChooseEntriesCallback callback) { FAIL(); })); ClassicScript::CreateUnspecifiedScript( @@ -138,7 +138,7 @@ EXPECT_FALSE(frame->HasStickyUserActivation()); } -TEST_F(GlobalNativeFileSystemTest, UserActivationChooseEntriesSuccessful) { +TEST_F(GlobalFileSystemAccessTest, UserActivationChooseEntriesSuccessful) { LocalFrame* frame = &GetFrame(); EXPECT_FALSE(frame->HasStickyUserActivation()); @@ -147,10 +147,10 @@ EXPECT_TRUE(frame->HasStickyUserActivation()); base::RunLoop manager_run_loop; - MockNativeFileSystemManager manager(frame->GetBrowserInterfaceBroker(), + MockFileSystemAccessManager manager(frame->GetBrowserInterfaceBroker(), manager_run_loop.QuitClosure()); manager.SetChooseEntriesResponse(WTF::Bind( - [](MockNativeFileSystemManager::ChooseEntriesCallback callback) { + [](MockFileSystemAccessManager::ChooseEntriesCallback callback) { auto error = mojom::blink::FileSystemAccessError::New(); error->status = mojom::blink::FileSystemAccessStatus::kOk; error->message = ""; @@ -183,7 +183,7 @@ EXPECT_TRUE(frame->HasStickyUserActivation()); } -TEST_F(GlobalNativeFileSystemTest, UserActivationChooseEntriesErrors) { +TEST_F(GlobalFileSystemAccessTest, UserActivationChooseEntriesErrors) { LocalFrame* frame = &GetFrame(); EXPECT_FALSE(frame->HasStickyUserActivation()); @@ -197,7 +197,7 @@ // kOperationAborted is when the user cancels the file selection. FileSystemAccessStatus::kOperationAborted, }; - MockNativeFileSystemManager manager(frame->GetBrowserInterfaceBroker()); + MockFileSystemAccessManager manager(frame->GetBrowserInterfaceBroker()); for (const FileSystemAccessStatus& status : statuses) { LocalFrame::NotifyUserActivation( @@ -208,7 +208,7 @@ manager.SetQuitClosure(manager_run_loop.QuitClosure()); manager.SetChooseEntriesResponse(WTF::Bind( [](mojom::blink::FileSystemAccessStatus status, - MockNativeFileSystemManager::ChooseEntriesCallback callback) { + MockFileSystemAccessManager::ChooseEntriesCallback callback) { auto error = mojom::blink::FileSystemAccessError::New(); error->status = status; error->message = "";
diff --git a/third_party/blink/renderer/modules/file_system_access/idls.gni b/third_party/blink/renderer/modules/file_system_access/idls.gni index a3b719a..2d4f323 100644 --- a/third_party/blink/renderer/modules/file_system_access/idls.gni +++ b/third_party/blink/renderer/modules/file_system_access/idls.gni
@@ -3,7 +3,7 @@ # found in the LICENSE file. modules_idl_files = [ - "native_file_system_directory_iterator.idl", + "file_system_directory_iterator.idl", "file_system_directory_handle.idl", "file_system_file_handle.idl", "file_system_handle.idl", @@ -14,7 +14,7 @@ "directory_picker_options.idl", "file_picker_accept_type.idl", "file_picker_options.idl", - "file_system_create_writer_options.idl", + "file_system_create_writable_options.idl", "file_system_get_directory_options.idl", "file_system_get_file_options.idl", "file_system_handle_permission_descriptor.idl", @@ -25,7 +25,7 @@ ] modules_dependency_idl_files = [ - "data_transfer_item_native_file_system.idl", - "storage_manager_native_file_system.idl", - "window_native_file_system.idl", + "data_transfer_item_file_system_access.idl", + "storage_manager_file_system_access.idl", + "window_file_system_access.idl", ]
diff --git a/third_party/blink/renderer/modules/file_system_access/open_file_picker_options.idl b/third_party/blink/renderer/modules/file_system_access/open_file_picker_options.idl index 96456f75..d74f2c1 100644 --- a/third_party/blink/renderer/modules/file_system_access/open_file_picker_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/open_file_picker_options.idl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-openfilepickeroptions +// https://wicg.github.io/file-system-access/#dictdef-openfilepickeroptions dictionary OpenFilePickerOptions : FilePickerOptions { boolean multiple = false; };
diff --git a/third_party/blink/renderer/modules/file_system_access/save_file_picker_options.idl b/third_party/blink/renderer/modules/file_system_access/save_file_picker_options.idl index d18f9d01..c3f1237 100644 --- a/third_party/blink/renderer/modules/file_system_access/save_file_picker_options.idl +++ b/third_party/blink/renderer/modules/file_system_access/save_file_picker_options.idl
@@ -2,6 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#dictdef-savefilepickeroptions +// https://wicg.github.io/file-system-access/#dictdef-savefilepickeroptions dictionary SaveFilePickerOptions : FilePickerOptions { };
diff --git a/third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.cc b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc similarity index 92% rename from third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.cc rename to third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc index b6fa20c..c21b28d 100644 --- a/third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.cc +++ b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.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 "third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.h" +#include "third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.h" #include <utility> @@ -18,8 +18,8 @@ #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/workers/worker_global_scope.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_directory_handle.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_access_error.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h" @@ -61,10 +61,10 @@ if (!context) return; if (result->status != mojom::blink::FileSystemAccessStatus::kOk) { - native_file_system_error::Reject(resolver, *result); + file_system_access_error::Reject(resolver, *result); return; } - resolver->Resolve(MakeGarbageCollected<NativeFileSystemDirectoryHandle>( + resolver->Resolve(MakeGarbageCollected<FileSystemDirectoryHandle>( context, kSandboxRootDirectoryName, std::move(handle))); }, WrapPersistent(resolver), std::move(manager))); @@ -73,13 +73,13 @@ } // namespace // static -ScriptPromise StorageManagerNativeFileSystem::getDirectory( +ScriptPromise StorageManagerFileSystemAccess::getDirectory( ScriptState* script_state, const StorageManager& storage, ExceptionState& exception_state) { ExecutionContext* context = ExecutionContext::From(script_state); - if (!context->GetSecurityOrigin()->CanAccessNativeFileSystem()) { + if (!context->GetSecurityOrigin()->CanAccessFileSystem()) { if (context->IsSandboxed(network::mojom::blink::WebSandboxFlags::kOrigin)) { exception_state.ThrowSecurityError( "Storage directory access is denied because the context is "
diff --git a/third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.h b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.h similarity index 79% rename from third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.h rename to third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.h index 300eef49..2ee916a 100644 --- a/third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.h +++ b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_STORAGE_MANAGER_NATIVE_FILE_SYSTEM_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_STORAGE_MANAGER_NATIVE_FILE_SYSTEM_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_STORAGE_MANAGER_FILE_SYSTEM_ACCESS_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_STORAGE_MANAGER_FILE_SYSTEM_ACCESS_H_ #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -15,8 +15,8 @@ class ScriptState; class StorageManager; -class StorageManagerNativeFileSystem { - STATIC_ONLY(StorageManagerNativeFileSystem); +class StorageManagerFileSystemAccess { + STATIC_ONLY(StorageManagerFileSystemAccess); public: static ScriptPromise getDirectory(ScriptState*, @@ -26,4 +26,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_STORAGE_MANAGER_NATIVE_FILE_SYSTEM_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_FILE_SYSTEM_ACCESS_STORAGE_MANAGER_FILE_SYSTEM_ACCESS_H_
diff --git a/third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.idl b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.idl similarity index 69% rename from third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.idl rename to third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.idl index f3a36d59..d73337e3 100644 --- a/third_party/blink/renderer/modules/file_system_access/storage_manager_native_file_system.idl +++ b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.idl
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#sandboxed-filesystem +// https://wicg.github.io/file-system-access/#sandboxed-filesystem [ SecureContext, - RuntimeEnabled=NativeFileSystem, - ImplementedAs=StorageManagerNativeFileSystem + RuntimeEnabled=FileSystemAccess, + ImplementedAs=StorageManagerFileSystemAccess ] partial interface StorageManager { [CallWith=ScriptState, RaisesException, Measure] Promise<FileSystemDirectoryHandle> getDirectory();
diff --git a/third_party/blink/renderer/modules/file_system_access/window_native_file_system.idl b/third_party/blink/renderer/modules/file_system_access/window_file_system_access.idl similarity index 76% rename from third_party/blink/renderer/modules/file_system_access/window_native_file_system.idl rename to third_party/blink/renderer/modules/file_system_access/window_file_system_access.idl index e2d65ef..5ea043ca 100644 --- a/third_party/blink/renderer/modules/file_system_access/window_native_file_system.idl +++ b/third_party/blink/renderer/modules/file_system_access/window_file_system_access.idl
@@ -2,12 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#native-filesystem -// https://wicg.github.io/native-file-system/#api-getoriginprivatefilesystem +// https://wicg.github.io/file-system-access/#local-filesystem [ SecureContext, - RuntimeEnabled=NativeFileSystem, - ImplementedAs=GlobalNativeFileSystem + RuntimeEnabled=FileSystemAccess, + ImplementedAs=GlobalFileSystemAccess ] partial interface Window { [CallWith=ScriptState, RaisesException, Measure] Promise<sequence<FileSystemFileHandle>> showOpenFilePicker(
diff --git a/third_party/blink/renderer/modules/file_system_access/write_params.idl b/third_party/blink/renderer/modules/file_system_access/write_params.idl index 9e6a39c..f62eff5 100644 --- a/third_party/blink/renderer/modules/file_system_access/write_params.idl +++ b/third_party/blink/renderer/modules/file_system_access/write_params.idl
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://wicg.github.io/native-file-system/#enumdef-writecommandtype +// https://wicg.github.io/file-system-access/#enumdef-writecommandtype enum WriteCommandType { "truncate", "seek", "write", }; -// https://wicg.github.io/native-file-system/#dictdef-writeparams +// https://wicg.github.io/file-system-access/#dictdef-writeparams dictionary WriteParams { required WriteCommandType type; unsigned long long? size;
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_value.cc b/third_party/blink/renderer/modules/indexeddb/idb_value.cc index 6257731..99e6a8c 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_value.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_value.cc
@@ -22,10 +22,10 @@ scoped_refptr<SharedBuffer> data, Vector<WebBlobInfo> blob_info, Vector<mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken>> - native_file_system_tokens) + file_system_access_tokens) : data_(std::move(data)), blob_info_(std::move(blob_info)), - native_file_system_tokens_(std::move(native_file_system_tokens)) {} + file_system_access_tokens_(std::move(file_system_access_tokens)) {} IDBValue::~IDBValue() { if (isolate_ && external_allocated_size_)
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_value.h b/third_party/blink/renderer/modules/indexeddb/idb_value.h index 344d71b..73cb14d 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_value.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_value.h
@@ -55,8 +55,8 @@ const IDBKeyPath& KeyPath() const { return key_path_; } Vector<mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken>>& - NativeFileSystemTokens() { - return native_file_system_tokens_; + FileSystemAccessTokens() { + return file_system_access_tokens_; } // Injects a primary key into a value coming from the backend. @@ -104,7 +104,7 @@ Vector<WebBlobInfo> blob_info_; Vector<mojo::PendingRemote<mojom::blink::FileSystemAccessTransferToken>> - native_file_system_tokens_; + file_system_access_tokens_; std::unique_ptr<IDBKey> primary_key_; IDBKeyPath key_path_;
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h b/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h index c4980be..5d60000 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_value_wrapping.h
@@ -161,7 +161,7 @@ DCHECK(owns_file_system_handles_) << __func__ << " called twice"; owns_file_system_handles_ = false; #endif // DCHECK_IS_ON() - return std::move(serialized_value_->NativeFileSystemTokens()); + return std::move(serialized_value_->FileSystemAccessTokens()); } size_t DataLengthBeforeWrapInBytes() { return original_data_length_; }
diff --git a/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc index 16dad28..3b82ac6 100644 --- a/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc +++ b/third_party/blink/renderer/modules/indexeddb/indexed_db_blink_mojom_traits.cc
@@ -174,7 +174,7 @@ external_objects(const std::unique_ptr<blink::IDBValue>& input) { Vector<blink::mojom::blink::IDBExternalObjectPtr> external_objects; external_objects.ReserveInitialCapacity( - input->BlobInfo().size() + input->NativeFileSystemTokens().size()); + input->BlobInfo().size() + input->FileSystemAccessTokens().size()); for (const blink::WebBlobInfo& info : input->BlobInfo()) { auto blob_info = blink::mojom::blink::IDBBlobInfo::New(); if (info.IsFile()) { @@ -198,7 +198,7 @@ blink::mojom::blink::IDBExternalObject::NewBlobOrFile( std::move(blob_info))); } - for (auto& token : input->NativeFileSystemTokens()) { + for (auto& token : input->FileSystemAccessTokens()) { external_objects.push_back( blink::mojom::blink::IDBExternalObject::NewFileSystemAccessToken( std::move(token)));
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc index 6687744..c28f7640 100644 --- a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc +++ b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/modules/launch/dom_window_launch_queue.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/renderer/modules/launch/launch_params.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/heap/visitor.h" @@ -24,7 +24,7 @@ void DOMWindowLaunchQueue::UpdateLaunchFiles( LocalDOMWindow* window, - HeapVector<Member<NativeFileSystemHandle>> files) { + HeapVector<Member<FileSystemHandle>> files) { FromState(window)->launch_queue_->Enqueue( MakeGarbageCollected<LaunchParams>(std::move(files))); }
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h index d1337421..51ae6529 100644 --- a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h +++ b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.h
@@ -32,7 +32,7 @@ static Member<LaunchQueue> launchQueue(LocalDOMWindow&); static void UpdateLaunchFiles(LocalDOMWindow*, - HeapVector<Member<NativeFileSystemHandle>>); + HeapVector<Member<FileSystemHandle>>); void Trace(Visitor*) const override;
diff --git a/third_party/blink/renderer/modules/launch/launch_params.cc b/third_party/blink/renderer/modules/launch/launch_params.cc index 02d23256..733f82f 100644 --- a/third_party/blink/renderer/modules/launch/launch_params.cc +++ b/third_party/blink/renderer/modules/launch/launch_params.cc
@@ -4,13 +4,13 @@ #include "third_party/blink/renderer/modules/launch/launch_params.h" -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/renderer/platform/heap/visitor.h" namespace blink { -LaunchParams::LaunchParams(HeapVector<Member<NativeFileSystemHandle>> files) - : files_(files) {} +LaunchParams::LaunchParams(HeapVector<Member<FileSystemHandle>> files) + : files_(std::move(files)) {} LaunchParams::~LaunchParams() = default;
diff --git a/third_party/blink/renderer/modules/launch/launch_params.h b/third_party/blink/renderer/modules/launch/launch_params.h index 4e773c8..07b1805 100644 --- a/third_party/blink/renderer/modules/launch/launch_params.h +++ b/third_party/blink/renderer/modules/launch/launch_params.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_LAUNCH_LAUNCH_PARAMS_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_LAUNCH_LAUNCH_PARAMS_H_ -#include "third_party/blink/renderer/modules/file_system_access/native_file_system_handle.h" +#include "third_party/blink/renderer/modules/file_system_access/file_system_handle.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/heap/heap_allocator.h" @@ -18,16 +18,16 @@ DEFINE_WRAPPERTYPEINFO(); public: - explicit LaunchParams(HeapVector<Member<NativeFileSystemHandle>> files); + explicit LaunchParams(HeapVector<Member<FileSystemHandle>> files); ~LaunchParams() override; // LaunchParams IDL interface. - const HeapVector<Member<NativeFileSystemHandle>>& files() { return files_; } + const HeapVector<Member<FileSystemHandle>>& files() { return files_; } void Trace(Visitor*) const override; private: - HeapVector<Member<NativeFileSystemHandle>> files_; + HeapVector<Member<FileSystemHandle>> files_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc b/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc index 54a60780..8bd62ab 100644 --- a/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc +++ b/third_party/blink/renderer/modules/launch/web_launch_service_impl.cc
@@ -37,9 +37,9 @@ if (!window_) return; - HeapVector<Member<NativeFileSystemHandle>> files; + HeapVector<Member<FileSystemHandle>> files; for (auto& entry : entries) { - files.push_back(NativeFileSystemHandle::CreateFromMojoEntry( + files.push_back(FileSystemHandle::CreateFromMojoEntry( std::move(entry), window_->GetExecutionContext())); }
diff --git a/third_party/blink/renderer/modules/webcodecs/color_space_primary_id.idl b/third_party/blink/renderer/modules/webcodecs/color_space_primary_id.idl index 60392d5..68ef2e9 100644 --- a/third_party/blink/renderer/modules/webcodecs/color_space_primary_id.idl +++ b/third_party/blink/renderer/modules/webcodecs/color_space_primary_id.idl
@@ -6,7 +6,7 @@ enum ColorSpacePrimaryID { "BT709", - "BT407M", + "BT470M", "BT470BG", "SMPTE170M", "SMPTE240M",
diff --git a/third_party/blink/renderer/modules/webgl/DEPS b/third_party/blink/renderer/modules/webgl/DEPS index bb4a18d4..2e4eb396 100644 --- a/third_party/blink/renderer/modules/webgl/DEPS +++ b/third_party/blink/renderer/modules/webgl/DEPS
@@ -8,6 +8,7 @@ "+gpu/config/gpu_feature_info.h", "+media/base/video_frame.h", "+media/base/wait_and_replace_sync_token_client.h", + "+media/video/gpu_memory_buffer_video_frame_pool.h", "+skia/ext", "+third_party/blink/renderer/modules/webcodecs", "+ui/gl/gpu_preference.h",
diff --git a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc index ed8db318..cf82e9b2 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc
@@ -6,12 +6,16 @@ #include "build/build_config.h" #include "media/base/wait_and_replace_sync_token_client.h" +#include "media/video/gpu_memory_buffer_video_frame_pool.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_color_space.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_webgl_webcodecs_texture_info.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_webgl_webcodecs_video_frame_handle.h" #include "third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h" #include "third_party/blink/renderer/modules/webgl/webgl_unowned_texture.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" +#include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" +#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" #include "ui/gfx/color_transform.h" namespace blink { @@ -19,15 +23,168 @@ namespace { #if defined(OS_WIN) -const char* kRequiredExtension = "GL_NV_EGL_stream_consumer_external"; +const char kRequiredExtension[] = "GL_NV_EGL_stream_consumer_external"; #elif defined(OS_MAC) -const char* kRequiredExtension = "GL_ANGLE_texture_rectangle"; +const char kRequiredExtension[] = "GL_ANGLE_texture_rectangle"; #elif defined(OS_ANDROID) || defined(OS_CHROMEOS) -const char* kRequiredExtension = "GL_OES_EGL_image_external"; +const char kRequiredExtension[] = "GL_OES_EGL_image_external"; #else -const char* kRequiredExtension = ""; +const char kRequiredExtension[] = ""; #endif +void FillVideoColorSpace(VideoColorSpace* video_color_space, + gfx::ColorSpace& gfx_color_space) { + gfx::ColorSpace::PrimaryID primaries = gfx_color_space.GetPrimaryID(); + switch (primaries) { + case gfx::ColorSpace::PrimaryID::BT709: + video_color_space->setPrimaryID("BT709"); + break; + case gfx::ColorSpace::PrimaryID::BT470M: + video_color_space->setPrimaryID("BT470M"); + break; + case gfx::ColorSpace::PrimaryID::BT470BG: + video_color_space->setPrimaryID("BT470BG"); + break; + case gfx::ColorSpace::PrimaryID::SMPTE170M: + video_color_space->setPrimaryID("SMPTE170M"); + break; + case gfx::ColorSpace::PrimaryID::SMPTE240M: + video_color_space->setPrimaryID("SMPTE240M"); + break; + case gfx::ColorSpace::PrimaryID::FILM: + video_color_space->setPrimaryID("FILM"); + break; + case gfx::ColorSpace::PrimaryID::BT2020: + video_color_space->setPrimaryID("BT2020"); + break; + case gfx::ColorSpace::PrimaryID::SMPTEST428_1: + video_color_space->setPrimaryID("SMPTEST428_1"); + break; + case gfx::ColorSpace::PrimaryID::SMPTEST431_2: + video_color_space->setPrimaryID("SMPTEST431_2"); + break; + case gfx::ColorSpace::PrimaryID::SMPTEST432_1: + video_color_space->setPrimaryID("SMPTEST432_1"); + break; + // TODO(jie.a.chen@intel.com): Need to check EBU_3213_E. + default:; + } + + gfx::ColorSpace::TransferID transfer = gfx_color_space.GetTransferID(); + switch (transfer) { + case gfx::ColorSpace::TransferID::BT709: +#if defined(OS_MAC) + // TODO(jie.a.chen@intel.com): BT709_APPLE is not available in WebCodecs. + case gfx::ColorSpace::TransferID::BT709_APPLE: +#endif + video_color_space->setTransferID("BT709"); + break; + case gfx::ColorSpace::TransferID::GAMMA22: + video_color_space->setTransferID("GAMMA22"); + break; + case gfx::ColorSpace::TransferID::GAMMA28: + video_color_space->setTransferID("GAMMA28"); + break; + case gfx::ColorSpace::TransferID::SMPTE170M: + video_color_space->setTransferID("SMPTE170M"); + break; + case gfx::ColorSpace::TransferID::SMPTE240M: + video_color_space->setTransferID("SMPTE240M"); + break; + case gfx::ColorSpace::TransferID::LINEAR: + video_color_space->setTransferID("LINEAR"); + break; + case gfx::ColorSpace::TransferID::LOG: + video_color_space->setTransferID("LOG"); + break; + case gfx::ColorSpace::TransferID::LOG_SQRT: + video_color_space->setTransferID("LOG_SQRT"); + break; + case gfx::ColorSpace::TransferID::IEC61966_2_4: + video_color_space->setTransferID("IEC61966_2_4"); + break; + case gfx::ColorSpace::TransferID::BT1361_ECG: + video_color_space->setTransferID("BT1361_ECG"); + break; + case gfx::ColorSpace::TransferID::IEC61966_2_1: + video_color_space->setTransferID("IEC61966_2_1"); + break; + case gfx::ColorSpace::TransferID::BT2020_10: + video_color_space->setTransferID("BT2020_10"); + break; + + case gfx::ColorSpace::TransferID::BT2020_12: + video_color_space->setTransferID("BT2020_12"); + break; + case gfx::ColorSpace::TransferID::SMPTEST2084: + video_color_space->setTransferID("SMPTEST2084"); + break; + case gfx::ColorSpace::TransferID::SMPTEST428_1: + video_color_space->setTransferID("SMPTEST428_1"); + break; + default:; + } + + gfx::ColorSpace::MatrixID matrix = gfx_color_space.GetMatrixID(); + switch (matrix) { + case gfx::ColorSpace::MatrixID::RGB: + video_color_space->setMatrixID("RGB"); + break; + case gfx::ColorSpace::MatrixID::BT709: + video_color_space->setMatrixID("BT709"); + break; + case gfx::ColorSpace::MatrixID::FCC: + video_color_space->setMatrixID("FCC"); + break; + case gfx::ColorSpace::MatrixID::BT470BG: + video_color_space->setMatrixID("BT470BG"); + break; + case gfx::ColorSpace::MatrixID::SMPTE170M: + video_color_space->setMatrixID("SMPTE170M"); + break; + case gfx::ColorSpace::MatrixID::SMPTE240M: + video_color_space->setMatrixID("SMPTE240M"); + break; + case gfx::ColorSpace::MatrixID::YCOCG: + video_color_space->setMatrixID("YCOCG"); + break; + case gfx::ColorSpace::MatrixID::BT2020_NCL: + video_color_space->setMatrixID("BT2020_NCL"); + break; + case gfx::ColorSpace::MatrixID::BT2020_CL: + video_color_space->setMatrixID("BT2020_CL"); + break; + case gfx::ColorSpace::MatrixID::YDZDX: + video_color_space->setMatrixID("YDZDX"); + break; + default:; + } + + gfx::ColorSpace::RangeID range = gfx_color_space.GetRangeID(); + switch (range) { + case gfx::ColorSpace::RangeID::LIMITED: + video_color_space->setRangeID("LIMITED"); + break; + case gfx::ColorSpace::RangeID::FULL: + video_color_space->setRangeID("FULL"); + break; + case gfx::ColorSpace::RangeID::DERIVED: + video_color_space->setRangeID("DERIVED"); + break; + default:; + } +} + +void GetMediaTaskRunnerAndGpuFactoriesOnMainThread( + scoped_refptr<base::SingleThreadTaskRunner>* media_task_runner_out, + media::GpuVideoAcceleratorFactories** gpu_factories_out, + base::WaitableEvent* waitable_event) { + DCHECK(IsMainThread()); + *media_task_runner_out = Platform::Current()->MediaThreadTaskRunner(); + *gpu_factories_out = Platform::Current()->GetGpuFactories(); + waitable_event->Signal(); +} + } // namespace WebGLWebCodecsVideoFrame::WebGLWebCodecsVideoFrame( @@ -40,29 +197,39 @@ context->ContextGL()->Enable(GC3D_TEXTURE_RECTANGLE_ARB); #endif - // TODO(jie.a.chen@intel.com): More supports for HDR video. #if defined(OS_WIN) - sampler_type_ = "samplerExternalOES"; - sampler_func_ = "texture2D"; formats_supported[media::PIXEL_FORMAT_NV12] = true; - auto& components = format_to_components_map_[media::PIXEL_FORMAT_NV12]; - components[media::VideoFrame::kYPlane] = "r"; - components[media::VideoFrame::kUPlane] = "rg"; + auto& components_nv12 = format_to_components_map_[media::PIXEL_FORMAT_NV12]; + components_nv12[media::VideoFrame::kYPlane] = "r"; + components_nv12[media::VideoFrame::kUPlane] = "rg"; #elif defined(OS_MAC) - sampler_type_ = "sampler2DRect"; - sampler_func_ = "texture2DRect"; formats_supported[media::PIXEL_FORMAT_XRGB] = true; - auto& components = format_to_components_map_[media::PIXEL_FORMAT_XRGB]; - components[media::VideoFrame::kYPlane] = "rgba"; -#elif defined(OS_ANDROID) || defined(OS_CHROMEOS) - sampler_type_ = "samplerExternalOES"; - sampler_func_ = "texture2D"; + auto& components_xrgb = format_to_components_map_[media::PIXEL_FORMAT_XRGB]; + components_xrgb[media::VideoFrame::kYPlane] = "rgba"; +#elif defined(OS_ANDROID) formats_supported[media::PIXEL_FORMAT_ABGR] = true; - auto& components = format_to_components_map_[media::PIXEL_FORMAT_ABGR]; - components[media::VideoFrame::kYPlane] = "rgb"; + auto& components_abgr = format_to_components_map_[media::PIXEL_FORMAT_ABGR]; + components_abgr[media::VideoFrame::kYPlane] = "rgb"; + + // GpuMemoryBufferVideoFramePool + formats_supported[media::PIXEL_FORMAT_NV12] = true; + auto& components_nv12 = format_to_components_map_[media::PIXEL_FORMAT_NV12]; + components_nv12[media::VideoFrame::kYPlane] = "r"; + components_nv12[media::VideoFrame::kUPlane] = "rg"; +#elif defined(OS_CHROMEOS) + formats_supported[media::PIXEL_FORMAT_ABGR] = true; + auto& components_abgr = format_to_components_map_[media::PIXEL_FORMAT_ABGR]; + components_abgr[media::VideoFrame::kYPlane] = "rgb"; #endif } +WebGLWebCodecsVideoFrame::~WebGLWebCodecsVideoFrame() { + if (gpu_memory_buffer_pool_) { + media_task_runner_->DeleteSoon(FROM_HERE, + std::move(gpu_memory_buffer_pool_)); + } +} + WebGLExtensionName WebGLWebCodecsVideoFrame::GetName() const { return kWebGLWebCodecsVideoFrameName; } @@ -92,29 +259,68 @@ if (!video_frame || scoped.IsLost()) return nullptr; + const char* sampler_type = "sampler2D"; + const char* sampler_func = "texture2D"; + gfx::ColorSpace src_color_space = gfx::ColorSpace::CreateREC709(); + media::VideoPixelFormat pixel_format = media::PIXEL_FORMAT_UNKNOWN; +#if defined(OS_WIN) + sampler_type = "samplerExternalOES"; + pixel_format = media::PIXEL_FORMAT_NV12; +#elif defined(OS_MAC) + sampler_type = "sampler2DRect"; + sampler_func = "texture2DRect"; + pixel_format = media::PIXEL_FORMAT_XRGB; +#elif defined(OS_ANDROID) || defined(OS_CHROMEOS) + sampler_type = "samplerExternalOES"; + pixel_format = media::PIXEL_FORMAT_ABGR; + src_color_space = gfx::ColorSpace::CreateSRGB(); +#endif + scoped_refptr<media::VideoFrame> frame = video_frame->frame(); if (!frame->HasTextures()) { - exception_state.ThrowTypeError("Unable to import a software video frame."); + InitializeGpuMemoryBufferPool(); + base::WaitableEvent waitable_event; + media_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame, + base::Unretained(gpu_memory_buffer_pool_.get()), + base::RetainedRef(frame), + base::BindOnce( + &WebGLWebCodecsVideoFrame::OnHardwareVideoFrameCreated, + base::Unretained(this), base::Unretained(&waitable_event)))); + waitable_event.Wait(); + + if (frame == hardware_video_frame_) { + exception_state.ThrowTypeError( + "Unable to import a software video frame."); + return nullptr; + } + frame = std::move(hardware_video_frame_); +#if defined(OS_WIN) + sampler_type = "sampler2D"; +#elif defined(OS_ANDROID) + sampler_type = "sampler2D"; + pixel_format = frame->format(); + src_color_space = frame->ColorSpace(); +#endif + } + + if (!formats_supported[pixel_format]) { + exception_state.ThrowTypeError( + String::Format("VideoPixelFormat:%s is not supported yet.", + media::VideoPixelFormatToString(pixel_format).c_str())); return nullptr; } - if (!formats_supported[frame->format()]) { - std::ostringstream ss; - ss << "VideoPixelFormat:" - << media::VideoPixelFormatToString(frame->format()) - << " is not supported yet."; - exception_state.ThrowTypeError(ss.str().c_str()); - return nullptr; - } - - const auto& components = format_to_components_map_[frame->format()]; + const auto& components = format_to_components_map_[pixel_format]; HeapVector<Member<WebGLWebCodecsTextureInfo>> info_array; for (size_t tex = 0; tex < frame->NumTextures(); ++tex) { WebGLWebCodecsTextureInfo* texture_info = MakeGarbageCollected<WebGLWebCodecsTextureInfo>(); info_array.push_back(texture_info); - texture_info->setSamplerType(sampler_type_.c_str()); - texture_info->setSamplerFunc(sampler_func_.c_str()); + texture_info->setSamplerType(sampler_type); + texture_info->setSamplerFunc(sampler_func); texture_info->setComponents(components[tex].c_str()); auto* gl = scoped.Context()->ContextGL(); @@ -144,45 +350,27 @@ if (std::string(kRequiredExtension) != "") { video_frame_handle->setRequiredExtension(kRequiredExtension); } + // Remove "PIXEL_FORMAT_" prefix + video_frame_handle->setPixelFormat( + &VideoPixelFormatToString(pixel_format)[13]); + // TODO(jie.a.chen@intel.com): Is the colorspace/flip-y/pre-alpha of video // frame specific to OS only? For the same OS, does it vary for different // video streams? video_frame_handle->setFlipY(true); video_frame_handle->setPremultipliedAlpha(false); - gfx::ColorSpace src_color_space = frame->ColorSpace(); #if defined(OS_WIN) - video_frame_handle->setPixelFormat("NV12"); + DCHECK(frame->format() == media::PIXEL_FORMAT_NV12); + src_color_space = frame->ColorSpace(); #elif defined(OS_MAC) video_frame_handle->setRequiredExtension("GL_ARB_texture_rectangle"); - video_frame_handle->setPixelFormat("XRGB"); video_frame_handle->setPremultipliedAlpha(true); + src_color_space = frame->ColorSpace(); src_color_space = src_color_space.GetAsFullRangeRGB(); -#elif defined(OS_ANDROID) || defined(OS_CHROMEOS) - if (!frame->ColorSpace().IsValid()) { - video_frame_handle->setPixelFormat("ABGR"); - src_color_space = gfx::ColorSpace::CreateSRGB(); - } #endif VideoColorSpace* video_frame_color_space = MakeGarbageCollected<VideoColorSpace>(); - // TODO(jie.a.chen@intel.com): Add ToString() for color space members. -#if defined(OS_WIN) - video_frame_color_space->setPrimaryID("BT709"); - video_frame_color_space->setTransferID("BT709"); - video_frame_color_space->setMatrixID("BT709"); - video_frame_color_space->setRangeID("LIMITED"); -#elif defined(OS_MAC) - video_frame_color_space->setPrimaryID("SMPTE240M"); - // TODO(jie.a.chen@intel.com): The actual BT709_APPLE is not available. - video_frame_color_space->setTransferID("BT709"); - video_frame_color_space->setMatrixID("RGB"); - video_frame_color_space->setRangeID("FULL"); -#elif defined(OS_ANDROID) || defined(OS_CHROMEOS) - video_frame_color_space->setPrimaryID("BT709"); - video_frame_color_space->setTransferID("IEC61966_2_1"); - video_frame_color_space->setMatrixID("RGB"); - video_frame_color_space->setRangeID("FULL"); -#endif + FillVideoColorSpace(video_frame_color_space, src_color_space); video_frame_handle->setColorSpace(video_frame_color_space); gfx::ColorSpace dst_color_space = gfx::ColorSpace::CreateSRGB(); @@ -225,4 +413,39 @@ return true; } +void WebGLWebCodecsVideoFrame::OnHardwareVideoFrameCreated( + base::WaitableEvent* waitable_event, + scoped_refptr<media::VideoFrame> video_frame) { + hardware_video_frame_ = std::move(video_frame); + waitable_event->Signal(); +} + +void WebGLWebCodecsVideoFrame::InitializeGpuMemoryBufferPool() { + if (!worker_task_runner_) { + worker_task_runner_ = worker_pool::CreateSequencedTaskRunner({}); + } + if (!gpu_memory_buffer_pool_) { + media::GpuVideoAcceleratorFactories* gpu_factories = nullptr; + if (IsMainThread()) { + media_task_runner_ = Platform::Current()->MediaThreadTaskRunner(); + gpu_factories = Platform::Current()->GetGpuFactories(); + } else { + base::WaitableEvent waitable_event; + // TODO(crbug.com/1164152): Lift the main thread restriction. + if (PostCrossThreadTask( + *Thread::MainThread()->GetTaskRunner(), FROM_HERE, + CrossThreadBindOnce( + &GetMediaTaskRunnerAndGpuFactoriesOnMainThread, + CrossThreadUnretained(&media_task_runner_), + CrossThreadUnretained(&gpu_factories), + CrossThreadUnretained(&waitable_event)))) { + waitable_event.Wait(); + } + } + gpu_memory_buffer_pool_ = + std::make_unique<media::GpuMemoryBufferVideoFramePool>( + media_task_runner_, worker_task_runner_, gpu_factories); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h index c6fa3374..644d01c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h +++ b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.h
@@ -10,6 +10,10 @@ #include "third_party/blink/renderer/modules/webcodecs/video_frame.h" #include "third_party/blink/renderer/modules/webgl/webgl_extension.h" +namespace media { +class GpuMemoryBufferVideoFramePool; +} // namespace media + namespace blink { class WebGLWebCodecsVideoFrameHandle; @@ -18,6 +22,8 @@ DEFINE_WRAPPERTYPEINFO(); public: + ~WebGLWebCodecsVideoFrame() override; + static bool Supported(WebGLRenderingContextBase*); static const char* ExtensionName(); @@ -36,9 +42,13 @@ ExceptionState&); private: + void OnHardwareVideoFrameCreated( + base::WaitableEvent* waitable_event, + scoped_refptr<media::VideoFrame> video_frame); + + void InitializeGpuMemoryBufferPool(); + std::bitset<media::PIXEL_FORMAT_MAX + 1> formats_supported; - std::string sampler_type_; - std::string sampler_func_; std::array<std::array<std::string, media::VideoFrame::kMaxPlanes>, media::PIXEL_FORMAT_MAX + 1> format_to_components_map_; @@ -47,6 +57,11 @@ // This holds the reference for all video frames being imported, but not // yet released. VideoFrameHandleMap tex0_to_video_frame_map_; + + std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_; + scoped_refptr<base::SequencedTaskRunner> worker_task_runner_; + scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; + scoped_refptr<media::VideoFrame> hardware_video_frame_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc index 3b8a918..a6404fa9 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
@@ -178,22 +178,22 @@ void GPUQueue::writeBuffer(GPUBuffer* buffer, uint64_t buffer_offset, const MaybeShared<DOMArrayBufferView>& data, - uint64_t data_byte_offset, + uint64_t data_element_offset, ExceptionState& exception_state) { WriteBufferImpl(buffer, buffer_offset, data->byteLength(), data->BaseAddressMaybeShared(), data->TypeSize(), - data_byte_offset, {}, exception_state); + data_element_offset, {}, exception_state); } void GPUQueue::writeBuffer(GPUBuffer* buffer, uint64_t buffer_offset, const MaybeShared<DOMArrayBufferView>& data, - uint64_t data_byte_offset, - uint64_t byte_size, + uint64_t data_element_offset, + uint64_t data_element_count, ExceptionState& exception_state) { WriteBufferImpl(buffer, buffer_offset, data->byteLength(), data->BaseAddressMaybeShared(), data->TypeSize(), - data_byte_offset, byte_size, exception_state); + data_element_offset, data_element_count, exception_state); } void GPUQueue::writeBuffer(GPUBuffer* buffer, @@ -222,41 +222,40 @@ uint64_t data_byte_length, const void* data_base_ptr, unsigned data_bytes_per_element, - uint64_t data_byte_offset, - base::Optional<uint64_t> byte_size, + uint64_t data_element_offset, + base::Optional<uint64_t> data_element_count, ExceptionState& exception_state) { if (buffer_offset % 4 != 0) { exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, - "bufferOffset must be a multiple of 4"); + "Buffer offset must be a multiple of 4"); return; } - if (data_byte_offset % data_bytes_per_element != 0) { - exception_state.ThrowDOMException( - DOMExceptionCode::kOperationError, - "dataByteOffset must be a multiple of data.BYTES_PER_ELEMENT"); - return; - } + CHECK_LE(data_bytes_per_element, 8u); - if (data_byte_offset > data_byte_length) { + if (data_element_offset > data_byte_length / data_bytes_per_element) { exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, - "dataByteOffset is too large"); + "Data offset is too large"); return; } + + uint64_t data_byte_offset = data_element_offset * data_bytes_per_element; uint64_t max_write_size = data_byte_length - data_byte_offset; uint64_t write_byte_size = max_write_size; - if (byte_size.has_value()) { - write_byte_size = byte_size.value(); - if (write_byte_size > max_write_size) { - exception_state.ThrowDOMException(DOMExceptionCode::kOperationError, - "byteSize is too large"); + if (data_element_count.has_value()) { + if (data_element_count.value() > max_write_size / data_bytes_per_element) { + exception_state.ThrowDOMException( + DOMExceptionCode::kOperationError, + "Number of bytes to write is too large"); return; } + write_byte_size = data_element_count.value() * data_bytes_per_element; } - if (write_byte_size % std::max(4u, data_bytes_per_element) != 0) { - exception_state.ThrowRangeError( - "byteSize must be a multiple of max(4, data.BYTES_PER_ELEMENT)"); + if (write_byte_size % 4 != 0) { + exception_state.ThrowDOMException( + DOMExceptionCode::kOperationError, + "Number of bytes to write must be a multiple of 4"); return; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.h b/third_party/blink/renderer/modules/webgpu/gpu_queue.h index 7ada744..282cbd5 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_queue.h +++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.h
@@ -37,13 +37,13 @@ void writeBuffer(GPUBuffer* buffer, uint64_t buffer_offset, const MaybeShared<DOMArrayBufferView>& data, - uint64_t data_byte_offset, + uint64_t data_element_offset, ExceptionState& exception_state); void writeBuffer(GPUBuffer* buffer, uint64_t buffer_offset, const MaybeShared<DOMArrayBufferView>& data, - uint64_t data_byte_offset, - uint64_t byte_size, + uint64_t data_element_offset, + uint64_t data_element_count, ExceptionState& exception_state); void writeBuffer(GPUBuffer* buffer, uint64_t buffer_offset,
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.idl b/third_party/blink/renderer/modules/webgpu/gpu_queue.idl index 26be9a3..4da8ca40 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_queue.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.idl
@@ -19,8 +19,8 @@ GPUBuffer buffer, GPUSize64 bufferOffset, [AllowShared] ArrayBufferView data, - optional GPUSize64 dataByteOffset = 0, - optional GPUSize64 byteSize); + optional GPUSize64 dataElementOffset = 0, + optional GPUSize64 dataElementCount); [RaisesException] void writeBuffer( GPUBuffer buffer, GPUSize64 bufferOffset,
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 1d87a9f..edef967 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1658,6 +1658,7 @@ "//third_party/blink/public/common", "//third_party/blink/public/strings", "//third_party/blink/renderer/platform/wtf", + "//third_party/blink/renderer/platform/wtf:buildflags", "//third_party/ced", "//third_party/emoji-segmenter", "//third_party/harfbuzz-ng:hb_scoped_util", @@ -2193,6 +2194,7 @@ "//ui/gfx/geometry/mojom:test_interfaces_blink", "//ui/gfx/mojom:test_interfaces_blink", "//url", + "//url:url_test_support", "//url/mojom:test_url_mojom_gurl_blink", ]
diff --git a/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.h b/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.h index ed8bac6b..371a8a4 100644 --- a/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.h +++ b/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.h
@@ -24,6 +24,14 @@ virtual bool IsContextDestroyed() const = 0; virtual bool DispatchHasPendingActivity() const = 0; + // See trait below. + // + // Registering the ActiveScriptWrappableBase after construction means that + // the garbage collector does not need to deal with objects that are + // currently under construction. This is important as checking whether ASW + // should be treated as active involves calling virtual functions which may + // not work during construction. The objects in construction are kept alive + // via conservative stack scanning. void ActiveScriptWrappableBaseConstructed(); protected: @@ -33,6 +41,31 @@ DISALLOW_COPY_AND_ASSIGN(ActiveScriptWrappableBase); }; +} // namespace blink + +#if BUILDFLAG(USE_V8_OILPAN) + +namespace cppgc { +template <typename T, typename = void> +struct PostConstructionCallbackTrait; + +template <typename T> +struct PostConstructionCallbackTrait< + T, + base::void_t<decltype( + std::declval<T>().ActiveScriptWrappableBaseConstructed())>> { + static void Call(T* object) { + static_assert(std::is_base_of<blink::ActiveScriptWrappableBase, T>::value, + "Only ActiveScriptWrappableBase should use the " + "post-construction hook."); + object->ActiveScriptWrappableBaseConstructed(); + } +}; +} // namespace cppgc + +#else // !USE_V8_OILPAN + +namespace blink { template <typename T> struct PostConstructionHookTrait< T, @@ -42,16 +75,12 @@ static_assert(std::is_base_of<ActiveScriptWrappableBase, T>::value, "Only ActiveScriptWrappableBase should use the " "post-construction hook."); - // Registering the ActiveScriptWrappableBase after construction means that - // the garbage collector does not need to deal with objects that are - // currently under construction. This is imnportant as checking whether ASW - // should be treated as active involves calling virtual functions which may - // not work during construction. The objects in construction are kept alive - // via conservative stack scanning. object->ActiveScriptWrappableBaseConstructed(); } }; } // namespace blink +#endif // !USE_V8_OILPAN + #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_ACTIVE_SCRIPT_WRAPPABLE_BASE_H_
diff --git a/third_party/blink/renderer/platform/bindings/idl_member_installer.cc b/third_party/blink/renderer/platform/bindings/idl_member_installer.cc index 520ff5d..81dbc9c 100644 --- a/third_party/blink/renderer/platform/bindings/idl_member_installer.cc +++ b/third_party/blink/renderer/platform/bindings/idl_member_installer.cc
@@ -161,10 +161,10 @@ V8PrivateProperty::GetCachedAccessor(isolate, v8_cached_accessor) .GetPrivate(), v8::Local<v8::Value>(), signature, length, v8_side_effect); + function_template->RemovePrototype(); } function_template->SetClassName(name); - function_template->RemovePrototype(); function_template->SetAcceptAnyReceiver( GetConfigCrossOriginCheck<kind>(config) == IDLMemberInstaller::FlagCrossOriginCheck::kDoNotCheck);
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 865c5c5c..2a9c47f 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
@@ -11,9 +11,18 @@ #include "base/macros.h" #include "third_party/blink/renderer/platform/heap/unified_heap_marking_visitor.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/buildflags.h" +#include "third_party/blink/renderer/platform/wtf/hash_traits.h" #include "third_party/blink/renderer/platform/wtf/vector_traits.h" #include "v8/include/v8.h" +namespace cppgc { + +template <typename T> +struct TraceTrait; + +} // namespace cppgc + namespace blink { template <typename T> @@ -70,7 +79,8 @@ } template <class S> - TraceWrapperV8Reference(TraceWrapperV8Reference<S>&& other) noexcept { + TraceWrapperV8Reference( // NOLINT + TraceWrapperV8Reference<S>&& other) noexcept { *this = std::move(other); } @@ -123,13 +133,37 @@ } v8::TracedReference<T> handle_; -}; + friend struct cppgc::TraceTrait<TraceWrapperV8Reference<T>>; +}; +} // namespace blink + +#if BUILDFLAG(USE_V8_OILPAN) + +namespace cppgc { +template <typename T> +struct TraceTrait<blink::TraceWrapperV8Reference<T>> { + STATIC_ONLY(TraceTrait); + + static cppgc::TraceDescriptor GetTraceDescriptor( + const blink::TraceWrapperV8Reference<T>* ref) { + return {ref, Trace}; + } + + static void Trace(Visitor* visitor, const void* self) { + visitor->Trace( + static_cast<const blink::TraceWrapperV8Reference<T>*>(self)->handle_); + } +}; +} // namespace cppgc + +#else // !USE_V8_OILPAN + +namespace blink { template <typename T> struct TraceTrait<TraceWrapperV8Reference<T>> { STATIC_ONLY(TraceTrait); - public: static TraceDescriptor GetTraceDescriptor( const TraceWrapperV8Reference<T>* ref) { return {ref, TraceTrait<TraceWrapperV8Reference<T>>::Trace}; @@ -139,9 +173,10 @@ visitor->Trace(*static_cast<const TraceWrapperV8Reference<T>*>(ref)); } }; - } // namespace blink +#endif // !USE_V8_OILPAN + namespace WTF { template <typename T>
diff --git a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h index e544f77..5ce607c 100644 --- a/third_party/blink/renderer/platform/bindings/wrapper_type_info.h +++ b/third_party/blink/renderer/platform/bindings/wrapper_type_info.h
@@ -33,6 +33,7 @@ #include "gin/public/wrapper_info.h" #include "third_party/blink/renderer/platform/bindings/v8_interface_bridge_base.h" +#include "third_party/blink/renderer/platform/heap/visitor.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/assertions.h" @@ -43,7 +44,6 @@ class CustomWrappable; class DOMWrapperWorld; class ScriptWrappable; -class Visitor; static const int kV8DOMWrapperTypeIndex = static_cast<int>(gin::kWrapperInfoIndex);
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc index 847557a..9f46f5ea 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_context.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
@@ -503,6 +503,30 @@ return UnionRect(bounds, offset_bounds); } +static void AdjustHoleForSideClipping(FloatRect& hole_rect, + const FloatSize& shadow_offset, + float shadow_blur, + GraphicsContext::Edges clipped_edges) { + if (clipped_edges & GraphicsContext::kLeftEdge) { + float extend_by = std::max(shadow_offset.Width(), 0.0f) + shadow_blur; + hole_rect.Move(-extend_by, 0); + hole_rect.SetWidth(hole_rect.Width() + extend_by); + } + if (clipped_edges & GraphicsContext::kTopEdge) { + float extend_by = std::max(shadow_offset.Height(), 0.0f) + shadow_blur; + hole_rect.Move(0, -extend_by); + hole_rect.SetHeight(hole_rect.Height() + extend_by); + } + if (clipped_edges & GraphicsContext::kRightEdge) { + float shrink_by = std::min(shadow_offset.Width(), 0.0f) - shadow_blur; + hole_rect.SetWidth(hole_rect.Width() - shrink_by); + } + if (clipped_edges & GraphicsContext::kBottomEdge) { + float shrink_by = std::min(shadow_offset.Height(), 0.0f) - shadow_blur; + hole_rect.SetHeight(hole_rect.Height() - shrink_by); + } +} + void GraphicsContext::DrawInnerShadow(const FloatRoundedRect& rect, const Color& orig_shadow_color, const FloatSize& shadow_offset, @@ -514,34 +538,13 @@ FloatRect hole_rect(rect.Rect()); hole_rect.Inflate(-shadow_spread); - if (hole_rect.IsEmpty()) { FillRoundedRect(rect, Color(shadow_color)); return; } + AdjustHoleForSideClipping(hole_rect, shadow_offset, shadow_blur, + clipped_edges); - if (clipped_edges & kLeftEdge) { - hole_rect.Move(-std::max(shadow_offset.Width(), 0.0f) - shadow_blur, 0); - hole_rect.SetWidth(hole_rect.Width() + - std::max(shadow_offset.Width(), 0.0f) + shadow_blur); - } - if (clipped_edges & kTopEdge) { - hole_rect.Move(0, -std::max(shadow_offset.Height(), 0.0f) - shadow_blur); - hole_rect.SetHeight(hole_rect.Height() + - std::max(shadow_offset.Height(), 0.0f) + shadow_blur); - } - if (clipped_edges & kRightEdge) - hole_rect.SetWidth(hole_rect.Width() - - std::min(shadow_offset.Width(), 0.0f) + shadow_blur); - if (clipped_edges & kBottomEdge) - hole_rect.SetHeight(hole_rect.Height() - - std::min(shadow_offset.Height(), 0.0f) + shadow_blur); - - Color fill_color(SkColorGetR(shadow_color), SkColorGetG(shadow_color), - SkColorGetB(shadow_color), 255); - - FloatRect outer_rect = AreaCastingShadowInHole(rect.Rect(), shadow_blur, - shadow_spread, shadow_offset); FloatRoundedRect rounded_hole(hole_rect, rect.GetRadii()); GraphicsContextStateSaver state_saver(*this); @@ -556,11 +559,15 @@ } DrawLooperBuilder draw_looper_builder; - draw_looper_builder.AddShadow(FloatSize(shadow_offset), shadow_blur, - shadow_color, + draw_looper_builder.AddShadow(shadow_offset, shadow_blur, shadow_color, DrawLooperBuilder::kShadowRespectsTransforms, DrawLooperBuilder::kShadowIgnoresAlpha); SetDrawLooper(draw_looper_builder.DetachDrawLooper()); + + Color fill_color(SkColorGetR(shadow_color), SkColorGetG(shadow_color), + SkColorGetB(shadow_color)); + FloatRect outer_rect = AreaCastingShadowInHole(rect.Rect(), shadow_blur, + shadow_spread, shadow_offset); FillRectWithRoundedHole(outer_rect, rounded_hole, fill_color); }
diff --git a/third_party/blink/renderer/platform/heap/BUILD.gn b/third_party/blink/renderer/platform/heap/BUILD.gn index c627958..e7419b5 100644 --- a/third_party/blink/renderer/platform/heap/BUILD.gn +++ b/third_party/blink/renderer/platform/heap/BUILD.gn
@@ -54,10 +54,15 @@ sources = [ "blink_gc_memory_dump_provider.h", + "collection_support/heap_deque.h", + "collection_support/heap_hash_counted_set.h", + "collection_support/heap_hash_map.h", + "collection_support/heap_hash_set.h", "collection_support/heap_hash_table_backing.h", "collection_support/heap_linked_hash_set.h", "collection_support/heap_linked_stack.h", "collection_support/heap_list_hash_set.h", + "collection_support/heap_vector.h", "collection_support/heap_vector_backing.h", "disallow_new_wrapper.h", "garbage_collected.h", @@ -65,6 +70,7 @@ "handle.h", "heap.h", "heap_allocator.h", + "heap_allocator_impl.h", "heap_stats_collector.h", "heap_traits.h", "member.h", @@ -128,8 +134,8 @@ "impl/gc_task_runner.h", "impl/heap.cc", "impl/heap.h", - "impl/heap_allocator.cc", - "impl/heap_allocator.h", + "impl/heap_allocator_impl.cc", + "impl/heap_allocator_impl.h", "impl/heap_compact.cc", "impl/heap_compact.h", "impl/heap_page.cc",
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_deque.h b/third_party/blink/renderer/platform/heap/collection_support/heap_deque.h new file mode 100644 index 0000000..323d0190 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_deque.h
@@ -0,0 +1,57 @@ +// Copyright 2021 The Chromium 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_COLLECTION_SUPPORT_HEAP_DEQUE_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_DEQUE_H_ + +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" +#include "third_party/blink/renderer/platform/heap/visitor.h" +#include "third_party/blink/renderer/platform/wtf/deque.h" +#include "third_party/blink/renderer/platform/wtf/type_traits.h" + +namespace blink { + +template <typename T> +class HeapDeque final : public GarbageCollected<HeapDeque<T>>, + public Deque<T, 0, HeapAllocator> { + DISALLOW_NEW(); + + public: + HeapDeque() = default; + + explicit HeapDeque(wtf_size_t size) : Deque<T, 0, HeapAllocator>(size) { + } + + HeapDeque(wtf_size_t size, const T& val) + : Deque<T, 0, HeapAllocator>(size, val) { + } + + HeapDeque& operator=(const HeapDeque& other) { + HeapDeque<T> copy(other); + Deque<T, 0, HeapAllocator>::Swap(copy); + return *this; + } + + HeapDeque(const HeapDeque<T>& other) : Deque<T, 0, HeapAllocator>(other) {} + + void Trace(Visitor* visitor) const { + CheckType(); + Deque<T, 0, HeapAllocator>::Trace(visitor); + } + + private: + static constexpr void CheckType() { + static_assert(WTF::IsMemberType<T>::value, + "HeapDeque supports only Member."); + static_assert(std::is_trivially_destructible<HeapDeque>::value, + "HeapDeque must be trivially destructible."); + static_assert(WTF::IsTraceable<T>::value, + "For vectors without traceable elements, use Deque<> instead " + "of HeapDeque<>"); + } +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_DEQUE_H_
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_counted_set.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_counted_set.h new file mode 100644 index 0000000..ed1034f9 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_counted_set.h
@@ -0,0 +1,63 @@ +// Copyright 2021 The Chromium 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_COLLECTION_SUPPORT_HEAP_HASH_COUNTED_SET_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_COUNTED_SET_H_ + +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" +#include "third_party/blink/renderer/platform/wtf/hash_counted_set.h" + +namespace blink { + +template <typename Value, + typename HashFunctions = typename DefaultHash<Value>::Hash, + typename Traits = HashTraits<Value>> +class HeapHashCountedSet final + : public HashCountedSet<Value, HashFunctions, Traits, HeapAllocator> { + IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); + DISALLOW_NEW(); + + static void CheckType() { + static_assert(WTF::IsMemberOrWeakMemberType<Value>::value, + "HeapHashCountedSet supports only Member and WeakMember."); + static_assert(std::is_trivially_destructible<HeapHashCountedSet>::value, + "HeapHashCountedSet must be trivially destructible."); + static_assert(WTF::IsTraceable<Value>::value, + "For counted sets without traceable elements, use " + "HashCountedSet<> instead of HeapHashCountedSet<>."); + } + + public: + template <typename> + static void* AllocateObject(size_t size) { + return ThreadHeap::Allocate< + HeapHashCountedSet<Value, HashFunctions, Traits>>(size); + } + + HeapHashCountedSet() { CheckType(); } +}; + +template <typename T, typename U, typename V> +struct GCInfoTrait<HeapHashCountedSet<T, U, V>> + : public GCInfoTrait<HashCountedSet<T, U, V, HeapAllocator>> {}; + +} // namespace blink + +namespace WTF { + +template <typename Value, + typename HashFunctions, + typename Traits, + typename VectorType> +inline void CopyToVector( + const blink::HeapHashCountedSet<Value, HashFunctions, Traits>& set, + VectorType& vector) { + CopyToVector(static_cast<const HashCountedSet<Value, HashFunctions, Traits, + blink::HeapAllocator>&>(set), + vector); +} + +} // namespace WTF + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_COUNTED_SET_H_
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h new file mode 100644 index 0000000..a184316d --- /dev/null +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h
@@ -0,0 +1,64 @@ +// Copyright 2021 The Chromium 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_COLLECTION_SUPPORT_HEAP_HASH_MAP_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_MAP_H_ + +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" +#include "third_party/blink/renderer/platform/wtf/hash_map.h" + +namespace blink { + +template <typename KeyArg, + typename MappedArg, + typename HashArg = typename DefaultHash<KeyArg>::Hash, + typename KeyTraitsArg = HashTraits<KeyArg>, + typename MappedTraitsArg = HashTraits<MappedArg>> +class HeapHashMap final : public HashMap<KeyArg, + MappedArg, + HashArg, + KeyTraitsArg, + MappedTraitsArg, + HeapAllocator> { + IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); + DISALLOW_NEW(); + + static void CheckType() { + static_assert(std::is_trivially_destructible<HeapHashMap>::value, + "HeapHashMap must be trivially destructible."); + static_assert( + WTF::IsTraceable<KeyArg>::value || WTF::IsTraceable<MappedArg>::value, + "For hash maps without traceable elements, use HashMap<> " + "instead of HeapHashMap<>."); + static_assert(WTF::IsMemberOrWeakMemberType<KeyArg>::value || + !WTF::IsTraceable<KeyArg>::value, + "HeapHashMap supports only Member, WeakMember and " + "non-traceable types as keys."); + static_assert(WTF::IsMemberOrWeakMemberType<MappedArg>::value || + !WTF::IsTraceable<MappedArg>::value || + WTF::IsSubclassOfTemplate<MappedArg, + TraceWrapperV8Reference>::value, + "HeapHashMap supports only Member, WeakMember, " + "TraceWrapperV8Reference and " + "non-traceable types as values."); + } + + public: + template <typename> + static void* AllocateObject(size_t size) { + return ThreadHeap::Allocate< + HeapHashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>>( + size); + } + + HeapHashMap() { CheckType(); } +}; + +template <typename T, typename U, typename V, typename W, typename X> +struct GCInfoTrait<HeapHashMap<T, U, V, W, X>> + : public GCInfoTrait<HashMap<T, U, V, W, X, HeapAllocator>> {}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_MAP_H_
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h new file mode 100644 index 0000000..03207de75 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h
@@ -0,0 +1,47 @@ +// Copyright 2021 The Chromium 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_COLLECTION_SUPPORT_HEAP_HASH_SET_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_SET_H_ + +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" + +namespace blink { + +template <typename ValueArg, + typename HashArg = typename DefaultHash<ValueArg>::Hash, + typename TraitsArg = HashTraits<ValueArg>> +class HeapHashSet + : public HashSet<ValueArg, HashArg, TraitsArg, HeapAllocator> { + IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); + DISALLOW_NEW(); + + static void CheckType() { + static_assert(WTF::IsMemberOrWeakMemberType<ValueArg>::value, + "HeapHashSet supports only Member and WeakMember."); + static_assert(std::is_trivially_destructible<HeapHashSet>::value, + "HeapHashSet must be trivially destructible."); + static_assert(WTF::IsTraceable<ValueArg>::value, + "For hash sets without traceable elements, use HashSet<> " + "instead of HeapHashSet<>."); + } + + public: + template <typename> + static void* AllocateObject(size_t size) { + return ThreadHeap::Allocate<HeapHashSet<ValueArg, HashArg, TraitsArg>>( + size); + } + + HeapHashSet() { CheckType(); } +}; + +template <typename T, typename U, typename V> +struct GCInfoTrait<HeapHashSet<T, U, V>> + : public GCInfoTrait<HashSet<T, U, V, HeapAllocator>> {}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_HASH_SET_H_
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h b/third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h index 7e9b074..12a4600 100644 --- a/third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_LINKED_HASH_SET_H_ #include "third_party/blink/renderer/platform/heap/heap.h" +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" #include "third_party/blink/renderer/platform/wtf/linked_hash_set.h" #include "third_party/blink/renderer/platform/wtf/type_traits.h"
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_linked_stack.h b/third_party/blink/renderer/platform/heap/collection_support/heap_linked_stack.h index 051dc07..e56c90e 100644 --- a/third_party/blink/renderer/platform/heap/collection_support/heap_linked_stack.h +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_linked_stack.h
@@ -32,9 +32,10 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_LINKED_STACK_H_ #include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/heap/heap_allocator.h" +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" #include "third_party/blink/renderer/platform/heap/visitor.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/type_traits.h" namespace blink { @@ -76,7 +77,7 @@ }; static void CheckType() { - static_assert(internal::IsMember<T>, + static_assert(WTF::IsMemberType<T>::value, "HeapLinkedStack supports only Member."); }
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_vector.h b/third_party/blink/renderer/platform/heap/collection_support/heap_vector.h new file mode 100644 index 0000000..b0f439e --- /dev/null +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_vector.h
@@ -0,0 +1,167 @@ +// Copyright 2021 The Chromium 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_COLLECTION_SUPPORT_HEAP_VECTOR_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_VECTOR_H_ + +#include "third_party/blink/renderer/platform/heap/heap_allocator_impl.h" +#include "third_party/blink/renderer/platform/wtf/type_traits.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" + +namespace blink { + +template <typename T, wtf_size_t inlineCapacity = 0> +class HeapVector final : public Vector<T, inlineCapacity, HeapAllocator> { + IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); + DISALLOW_NEW(); + + static void CheckType() { + static_assert( + std::is_trivially_destructible<HeapVector>::value || inlineCapacity, + "HeapVector must be trivially destructible."); + static_assert(WTF::IsTraceable<T>::value, + "For vectors without traceable elements, use Vector<> " + "instead of HeapVector<>."); + static_assert(!WTF::IsWeak<T>::value, + "Weak types are not allowed in HeapVector."); + static_assert(WTF::IsTraceableInCollectionTrait<VectorTraits<T>>::value, + "Type must be traceable in collection"); + } + + public: + template <typename> + static void* AllocateObject(size_t size) { + // On-heap HeapVectors generally should not have inline capacity, but it is + // hard to avoid when using a type alias. Hence we only disallow the + // VectorTraits<T>::kNeedsDestruction case for now. + static_assert(inlineCapacity == 0 || !VectorTraits<T>::kNeedsDestruction, + "on-heap HeapVector<> should not have an inline capacity"); + return ThreadHeap::Allocate<HeapVector<T, inlineCapacity>>(size); + } + + HeapVector() { CheckType(); } + + explicit HeapVector(wtf_size_t size) + : Vector<T, inlineCapacity, HeapAllocator>(size) { + CheckType(); + } + + HeapVector(wtf_size_t size, const T& val) + : Vector<T, inlineCapacity, HeapAllocator>(size, val) { + CheckType(); + } + + template <wtf_size_t otherCapacity> + HeapVector(const HeapVector<T, otherCapacity>& other) // NOLINT + : Vector<T, inlineCapacity, HeapAllocator>(other) { + CheckType(); + } + + HeapVector(const HeapVector& other) + : Vector<T, inlineCapacity, HeapAllocator>(other) { + CheckType(); + } + + HeapVector& operator=(const HeapVector& other) { + Vector<T, inlineCapacity, HeapAllocator>::operator=(other); + return *this; + } + + HeapVector(HeapVector&& other) noexcept + : Vector<T, inlineCapacity, HeapAllocator>(std::move(other)) { + CheckType(); + } + + HeapVector& operator=(HeapVector&& other) noexcept { + Vector<T, inlineCapacity, HeapAllocator>::operator=(std::move(other)); + return *this; + } + + HeapVector(std::initializer_list<T> elements) + : Vector<T, inlineCapacity, HeapAllocator>(elements) { + CheckType(); + } +}; + +template <typename T, wtf_size_t inlineCapacity> +struct GCInfoTrait<HeapVector<T, inlineCapacity>> + : public GCInfoTrait<Vector<T, inlineCapacity, HeapAllocator>> {}; + +} // namespace blink + +namespace WTF { + +template <typename T> +struct VectorTraits<blink::Member<T>> : VectorTraitsBase<blink::Member<T>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = false; + static const bool kCanInitializeWithMemset = true; + static const bool kCanClearUnusedSlotsWithMemset = true; + static const bool kCanCopyWithMemcpy = true; + static const bool kCanMoveWithMemcpy = true; + + static constexpr bool kCanTraceConcurrently = true; +}; + +// These traits are used in VectorBackedLinkedList to support WeakMember in +// HeapLinkedHashSet though HeapVector<WeakMember> usage is still banned. +// (See the discussion in https://crrev.com/c/2246014) +template <typename T> +struct VectorTraits<blink::WeakMember<T>> + : VectorTraitsBase<blink::WeakMember<T>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = false; + static const bool kCanInitializeWithMemset = true; + static const bool kCanClearUnusedSlotsWithMemset = true; + static const bool kCanCopyWithMemcpy = true; + static const bool kCanMoveWithMemcpy = true; + + static constexpr bool kCanTraceConcurrently = true; +}; + +template <typename T> +struct VectorTraits<blink::UntracedMember<T>> + : VectorTraitsBase<blink::UntracedMember<T>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = false; + static const bool kCanInitializeWithMemset = true; + static const bool kCanClearUnusedSlotsWithMemset = true; + static const bool kCanMoveWithMemcpy = true; +}; + +template <typename T> +struct VectorTraits<blink::HeapVector<T, 0>> + : VectorTraitsBase<blink::HeapVector<T, 0>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = false; + static const bool kCanInitializeWithMemset = true; + static const bool kCanClearUnusedSlotsWithMemset = true; + static const bool kCanMoveWithMemcpy = true; +}; + +template <typename T> +struct VectorTraits<blink::HeapDeque<T>> + : VectorTraitsBase<blink::HeapDeque<T>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = false; + static const bool kCanInitializeWithMemset = true; + static const bool kCanClearUnusedSlotsWithMemset = true; + static const bool kCanMoveWithMemcpy = true; +}; + +template <typename T, wtf_size_t inlineCapacity> +struct VectorTraits<blink::HeapVector<T, inlineCapacity>> + : VectorTraitsBase<blink::HeapVector<T, inlineCapacity>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = VectorTraits<T>::kNeedsDestruction; + static const bool kCanInitializeWithMemset = + VectorTraits<T>::kCanInitializeWithMemset; + static const bool kCanClearUnusedSlotsWithMemset = + VectorTraits<T>::kCanClearUnusedSlotsWithMemset; + static const bool kCanMoveWithMemcpy = VectorTraits<T>::kCanMoveWithMemcpy; +}; + +} // namespace WTF + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_COLLECTION_SUPPORT_HEAP_VECTOR_H_
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_vector_backing.h b/third_party/blink/renderer/platform/heap/collection_support/heap_vector_backing.h index b75d0fc..bf51857 100644 --- a/third_party/blink/renderer/platform/heap/collection_support/heap_vector_backing.h +++ b/third_party/blink/renderer/platform/heap/collection_support/heap_vector_backing.h
@@ -7,7 +7,6 @@ #include "base/check_op.h" #include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/heap/heap_allocator.h" #include "third_party/blink/renderer/platform/heap/impl/finalizer_traits.h" #include "third_party/blink/renderer/platform/heap/impl/gc_info.h" #include "third_party/blink/renderer/platform/heap/impl/threading_traits.h"
diff --git a/third_party/blink/renderer/platform/heap/heap_allocator.h b/third_party/blink/renderer/platform/heap/heap_allocator.h index 7d8916d..90fbb02 100644 --- a/third_party/blink/renderer/platform/heap/heap_allocator.h +++ b/third_party/blink/renderer/platform/heap/heap_allocator.h
@@ -5,12 +5,15 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_ALLOCATOR_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_ALLOCATOR_H_ +// Legacy: Users including `heap_allocator.h` actually expect it to pull in the +// containers. +#include "third_party/blink/renderer/platform/heap/collection_support/heap_deque.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_counted_set.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_list_hash_set.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" #include "third_party/blink/renderer/platform/wtf/buildflags.h" -#if BUILDFLAG(USE_V8_OILPAN) -#include "third_party/blink/renderer/platform/heap/v8_wrapper/heap_allocator.h" -#else // !USE_V8_OILPAN -#include "third_party/blink/renderer/platform/heap/impl/heap_allocator.h" -#endif // !USE_V8_OILPAN - #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_ALLOCATOR_H_
diff --git a/third_party/blink/renderer/platform/heap/heap_allocator_impl.h b/third_party/blink/renderer/platform/heap/heap_allocator_impl.h new file mode 100644 index 0000000..05a45a6 --- /dev/null +++ b/third_party/blink/renderer/platform/heap/heap_allocator_impl.h
@@ -0,0 +1,16 @@ +// Copyright 2020 The Chromium 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_HEAP_ALLOCATOR_IMPL_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_ALLOCATOR_IMPL_H_ + +#include "third_party/blink/renderer/platform/wtf/buildflags.h" + +#if BUILDFLAG(USE_V8_OILPAN) +// TODO(1056170): Add wrapper version. +#else // !USE_V8_OILPAN +#include "third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h" +#endif // !USE_V8_OILPAN + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_HEAP_ALLOCATOR_IMPL_H_
diff --git a/third_party/blink/renderer/platform/heap/impl/heap_allocator.h b/third_party/blink/renderer/platform/heap/impl/heap_allocator.h deleted file mode 100644 index 9d1af70..0000000 --- a/third_party/blink/renderer/platform/heap/impl/heap_allocator.h +++ /dev/null
@@ -1,631 +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. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_HEAP_ALLOCATOR_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_HEAP_ALLOCATOR_H_ - -#include <type_traits> - -#include "build/build_config.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_linked_hash_set.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_list_hash_set.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector_backing.h" -#include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/heap/heap_buildflags.h" -#include "third_party/blink/renderer/platform/heap/impl/marking_visitor.h" -#include "third_party/blink/renderer/platform/heap/impl/trace_traits.h" -#include "third_party/blink/renderer/platform/heap/thread_state_scopes.h" -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -#include "third_party/blink/renderer/platform/wtf/assertions.h" -#include "third_party/blink/renderer/platform/wtf/construct_traits.h" -#include "third_party/blink/renderer/platform/wtf/deque.h" -#include "third_party/blink/renderer/platform/wtf/doubly_linked_list.h" -#include "third_party/blink/renderer/platform/wtf/hash_counted_set.h" -#include "third_party/blink/renderer/platform/wtf/hash_map.h" -#include "third_party/blink/renderer/platform/wtf/hash_set.h" -#include "third_party/blink/renderer/platform/wtf/hash_table.h" -#include "third_party/blink/renderer/platform/wtf/type_traits.h" -#include "third_party/blink/renderer/platform/wtf/vector.h" - -namespace blink { - -namespace internal { - -template <typename T> -constexpr bool IsMember = WTF::IsSubclassOfTemplate<T, Member>::value; - -} // namespace internal - -// This is a static-only class used as a trait on collections to make them heap -// allocated. -class PLATFORM_EXPORT HeapAllocator { - STATIC_ONLY(HeapAllocator); - - public: - using LivenessBroker = blink::LivenessBroker; - using Visitor = blink::Visitor; - static constexpr bool kIsGarbageCollected = true; - - // See wtf/size_t.h for details. - static constexpr size_t kMaxHeapObjectSizeLog2 = 27; - static constexpr size_t kMaxHeapObjectSize = 1 << kMaxHeapObjectSizeLog2; - - template <typename T> - static size_t MaxElementCountInBackingStore() { - return kMaxHeapObjectSize / sizeof(T); - } - - template <typename T> - static size_t QuantizedSize(size_t count) { - CHECK_LE(count, MaxElementCountInBackingStore<T>()); - // Oilpan's internal size is independent of MaxElementCountInBackingStore() - // and the required size to match capacity needs. - return count * sizeof(T); - } - - template <typename T> - static T* AllocateVectorBacking(size_t size) { - return reinterpret_cast<T*>( - MakeGarbageCollected<HeapVectorBacking<T>>(size / sizeof(T))); - } - static void FreeVectorBacking(void*); - static bool ExpandVectorBacking(void*, size_t); - static bool ShrinkVectorBacking(void* address, - size_t quantized_current_size, - size_t quantized_shrunk_size); - - template <typename T, typename HashTable> - static T* AllocateHashTableBacking(size_t size) { - return reinterpret_cast<T*>( - MakeGarbageCollected<HeapHashTableBacking<HashTable>>( - size / sizeof(typename HashTable::ValueType))); - } - template <typename T, typename HashTable> - static T* AllocateZeroedHashTableBacking(size_t size) { - return AllocateHashTableBacking<T, HashTable>(size); - } - static void FreeHashTableBacking(void* address); - static bool ExpandHashTableBacking(void*, size_t); - - static bool IsAllocationAllowed() { - return ThreadState::Current()->IsAllocationAllowed(); - } - - static bool IsIncrementalMarking() { - return ThreadState::IsAnyIncrementalMarking() && - ThreadState::Current()->IsIncrementalMarking(); - } - - static void EnterGCForbiddenScope() { - ThreadState::Current()->EnterGCForbiddenScope(); - } - - static void LeaveGCForbiddenScope() { - ThreadState::Current()->LeaveGCForbiddenScope(); - } - - template <typename T, typename Traits> - static void Trace(Visitor* visitor, const T& t) { - TraceCollectionIfEnabled<WTF::WeakHandlingTrait<T>::value, T, - Traits>::Trace(visitor, &t); - } - - template <typename T> - static void TraceVectorBacking(Visitor* visitor, - const T* backing, - const T* const* backing_slot) { - visitor->TraceMovablePointer(backing_slot); - visitor->Trace(reinterpret_cast<const HeapVectorBacking<T>*>(backing)); - } - - template <typename T, typename HashTable> - static void TraceHashTableBackingStrongly(Visitor* visitor, - const T* backing, - const T* const* backing_slot) { - visitor->TraceMovablePointer(backing_slot); - visitor->Trace( - reinterpret_cast<const HeapHashTableBacking<HashTable>*>(backing)); - } - - template <typename T, typename HashTable> - static void TraceHashTableBackingWeakly(Visitor* visitor, - const T* backing, - const T* const* backing_slot, - WeakCallback callback, - const void* parameter) { - visitor->TraceMovablePointer(backing_slot); - visitor->TraceWeakContainer( - reinterpret_cast<const HeapHashTableBacking<HashTable>*>(backing), - reinterpret_cast<const HeapHashTableBacking<HashTable>* const*>( - backing_slot), - TraceTrait<HeapHashTableBacking<HashTable>>::GetTraceDescriptor( - backing), - TraceTrait<HeapHashTableBacking<HashTable>>::GetWeakTraceDescriptor( - backing), - callback, parameter); - } - - template <typename T> - static void BackingWriteBarrier(T** slot) { - MarkingVisitor::WriteBarrier(reinterpret_cast<void**>(slot)); - } - - static void TraceBackingStoreIfMarked(const void* object) { - MarkingVisitor::RetraceObject(object); - } - - template <typename T, typename Traits> - static void NotifyNewObject(T* object) { - MarkingVisitor::WriteBarrier( - []() { return ThreadState::Current(); }, object, sizeof(T), 1, - TraceCollectionIfEnabled<WTF::kNoWeakHandling, T, Traits>::Trace); - } - - template <typename T, typename Traits> - static void NotifyNewObjects(T* array, size_t len) { - MarkingVisitor::WriteBarrier( - []() { return ThreadState::Current(); }, array, sizeof(T), len, - TraceCollectionIfEnabled<WTF::kNoWeakHandling, T, Traits>::Trace); - } - - private: - static void BackingFree(void*); - static bool BackingExpand(void*, size_t); - static bool BackingShrink(void*, - size_t quantized_current_size, - size_t quantized_shrunk_size); -}; - -template <typename KeyArg, - typename MappedArg, - typename HashArg = typename DefaultHash<KeyArg>::Hash, - typename KeyTraitsArg = HashTraits<KeyArg>, - typename MappedTraitsArg = HashTraits<MappedArg>> -class HeapHashMap final : public HashMap<KeyArg, - MappedArg, - HashArg, - KeyTraitsArg, - MappedTraitsArg, - HeapAllocator> { - IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); - DISALLOW_NEW(); - - static void CheckType() { - static_assert(std::is_trivially_destructible<HeapHashMap>::value, - "HeapHashMap must be trivially destructible."); - static_assert( - WTF::IsTraceable<KeyArg>::value || WTF::IsTraceable<MappedArg>::value, - "For hash maps without traceable elements, use HashMap<> " - "instead of HeapHashMap<>."); - static_assert(WTF::IsMemberOrWeakMemberType<KeyArg>::value || - !WTF::IsTraceable<KeyArg>::value, - "HeapHashMap supports only Member, WeakMember and " - "non-traceable types as keys."); - static_assert(WTF::IsMemberOrWeakMemberType<MappedArg>::value || - !WTF::IsTraceable<MappedArg>::value || - WTF::IsSubclassOfTemplate<MappedArg, - TraceWrapperV8Reference>::value, - "HeapHashMap supports only Member, WeakMember, " - "TraceWrapperV8Reference and " - "non-traceable types as values."); - } - - public: - template <typename> - static void* AllocateObject(size_t size) { - return ThreadHeap::Allocate< - HeapHashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg>>( - size); - } - - HeapHashMap() { CheckType(); } -}; - -template <typename T, typename U, typename V, typename W, typename X> -struct GCInfoTrait<HeapHashMap<T, U, V, W, X>> - : public GCInfoTrait<HashMap<T, U, V, W, X, HeapAllocator>> {}; - -template <typename ValueArg, - typename HashArg = typename DefaultHash<ValueArg>::Hash, - typename TraitsArg = HashTraits<ValueArg>> -class HeapHashSet - : public HashSet<ValueArg, HashArg, TraitsArg, HeapAllocator> { - IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); - DISALLOW_NEW(); - - static void CheckType() { - static_assert(WTF::IsMemberOrWeakMemberType<ValueArg>::value, - "HeapHashSet supports only Member and WeakMember."); - static_assert(std::is_trivially_destructible<HeapHashSet>::value, - "HeapHashSet must be trivially destructible."); - static_assert(WTF::IsTraceable<ValueArg>::value, - "For hash sets without traceable elements, use HashSet<> " - "instead of HeapHashSet<>."); - } - - public: - template <typename> - static void* AllocateObject(size_t size) { - return ThreadHeap::Allocate<HeapHashSet<ValueArg, HashArg, TraitsArg>>( - size); - } - - HeapHashSet() { CheckType(); } -}; - -template <typename T, typename U, typename V> -struct GCInfoTrait<HeapHashSet<T, U, V>> - : public GCInfoTrait<HashSet<T, U, V, HeapAllocator>> {}; - -template <typename Value, - typename HashFunctions = typename DefaultHash<Value>::Hash, - typename Traits = HashTraits<Value>> -class HeapHashCountedSet final - : public HashCountedSet<Value, HashFunctions, Traits, HeapAllocator> { - IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); - DISALLOW_NEW(); - - static void CheckType() { - static_assert(WTF::IsMemberOrWeakMemberType<Value>::value, - "HeapHashCountedSet supports only Member and WeakMember."); - static_assert(std::is_trivially_destructible<HeapHashCountedSet>::value, - "HeapHashCountedSet must be trivially destructible."); - static_assert(WTF::IsTraceable<Value>::value, - "For counted sets without traceable elements, use " - "HashCountedSet<> instead of HeapHashCountedSet<>."); - } - - public: - template <typename> - static void* AllocateObject(size_t size) { - return ThreadHeap::Allocate< - HeapHashCountedSet<Value, HashFunctions, Traits>>(size); - } - - HeapHashCountedSet() { CheckType(); } -}; - -template <typename T, typename U, typename V> -struct GCInfoTrait<HeapHashCountedSet<T, U, V>> - : public GCInfoTrait<HashCountedSet<T, U, V, HeapAllocator>> {}; - -template <typename T, wtf_size_t inlineCapacity = 0> -class HeapVector final : public Vector<T, inlineCapacity, HeapAllocator> { - IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); - DISALLOW_NEW(); - - static void CheckType() { - static_assert( - std::is_trivially_destructible<HeapVector>::value || inlineCapacity, - "HeapVector must be trivially destructible."); - static_assert(WTF::IsTraceable<T>::value, - "For vectors without traceable elements, use Vector<> " - "instead of HeapVector<>."); - static_assert(!WTF::IsWeak<T>::value, - "Weak types are not allowed in HeapVector."); - static_assert(WTF::IsTraceableInCollectionTrait<VectorTraits<T>>::value, - "Type must be traceable in collection"); - } - - public: - template <typename> - static void* AllocateObject(size_t size) { - // On-heap HeapVectors generally should not have inline capacity, but it is - // hard to avoid when using a type alias. Hence we only disallow the - // VectorTraits<T>::kNeedsDestruction case for now. - static_assert(inlineCapacity == 0 || !VectorTraits<T>::kNeedsDestruction, - "on-heap HeapVector<> should not have an inline capacity"); - return ThreadHeap::Allocate<HeapVector<T, inlineCapacity>>(size); - } - - HeapVector() { CheckType(); } - - explicit HeapVector(wtf_size_t size) - : Vector<T, inlineCapacity, HeapAllocator>(size) { - CheckType(); - } - - HeapVector(wtf_size_t size, const T& val) - : Vector<T, inlineCapacity, HeapAllocator>(size, val) { - CheckType(); - } - - template <wtf_size_t otherCapacity> - HeapVector(const HeapVector<T, otherCapacity>& other) - : Vector<T, inlineCapacity, HeapAllocator>(other) { - CheckType(); - } - - HeapVector(const HeapVector& other) - : Vector<T, inlineCapacity, HeapAllocator>(other) { - CheckType(); - } - - HeapVector& operator=(const HeapVector& other) { - Vector<T, inlineCapacity, HeapAllocator>::operator=(other); - return *this; - } - - HeapVector(HeapVector&& other) noexcept - : Vector<T, inlineCapacity, HeapAllocator>(std::move(other)) { - CheckType(); - } - - HeapVector& operator=(HeapVector&& other) noexcept { - Vector<T, inlineCapacity, HeapAllocator>::operator=(std::move(other)); - return *this; - } - - HeapVector(std::initializer_list<T> elements) - : Vector<T, inlineCapacity, HeapAllocator>(elements) { - CheckType(); - } -}; - -template <typename T, wtf_size_t inlineCapacity> -struct GCInfoTrait<HeapVector<T, inlineCapacity>> - : public GCInfoTrait<Vector<T, inlineCapacity, HeapAllocator>> {}; - -template <typename T> -class HeapDeque final : public Deque<T, 0, HeapAllocator> { - IS_GARBAGE_COLLECTED_CONTAINER_TYPE(); - DISALLOW_NEW(); - - static void CheckType() { - static_assert(internal::IsMember<T>, "HeapDeque supports only Member."); - static_assert(std::is_trivially_destructible<HeapDeque>::value, - "HeapDeque must be trivially destructible."); - static_assert(WTF::IsTraceable<T>::value, - "For vectors without traceable elements, use Deque<> instead " - "of HeapDeque<>"); - } - - public: - template <typename> - static void* AllocateObject(size_t size) { - return ThreadHeap::Allocate<HeapDeque<T>>(size); - } - - HeapDeque() { CheckType(); } - - explicit HeapDeque(wtf_size_t size) : Deque<T, 0, HeapAllocator>(size) { - CheckType(); - } - - HeapDeque(wtf_size_t size, const T& val) - : Deque<T, 0, HeapAllocator>(size, val) { - CheckType(); - } - - HeapDeque& operator=(const HeapDeque& other) { - HeapDeque<T> copy(other); - Deque<T, 0, HeapAllocator>::Swap(copy); - return *this; - } - - HeapDeque(const HeapDeque<T>& other) : Deque<T, 0, HeapAllocator>(other) {} -}; - -template <typename T> -struct GCInfoTrait<HeapDeque<T>> - : public GCInfoTrait<Deque<T, 0, HeapAllocator>> {}; - -} // namespace blink - -namespace WTF { - -template <typename T> -struct VectorTraits<blink::Member<T>> : VectorTraitsBase<blink::Member<T>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = false; - static const bool kCanInitializeWithMemset = true; - static const bool kCanClearUnusedSlotsWithMemset = true; - static const bool kCanCopyWithMemcpy = true; - static const bool kCanMoveWithMemcpy = true; - - static constexpr bool kCanTraceConcurrently = true; -}; - -// These traits are used in VectorBackedLinkedList to support WeakMember in -// HeapLinkedHashSet though HeapVector<WeakMember> usage is still banned. -// (See the discussion in https://crrev.com/c/2246014) -template <typename T> -struct VectorTraits<blink::WeakMember<T>> - : VectorTraitsBase<blink::WeakMember<T>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = false; - static const bool kCanInitializeWithMemset = true; - static const bool kCanClearUnusedSlotsWithMemset = true; - static const bool kCanCopyWithMemcpy = true; - static const bool kCanMoveWithMemcpy = true; - - static constexpr bool kCanTraceConcurrently = true; -}; - -template <typename T> -struct VectorTraits<blink::UntracedMember<T>> - : VectorTraitsBase<blink::UntracedMember<T>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = false; - static const bool kCanInitializeWithMemset = true; - static const bool kCanClearUnusedSlotsWithMemset = true; - static const bool kCanMoveWithMemcpy = true; -}; - -template <typename T> -struct VectorTraits<blink::HeapVector<T, 0>> - : VectorTraitsBase<blink::HeapVector<T, 0>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = false; - static const bool kCanInitializeWithMemset = true; - static const bool kCanClearUnusedSlotsWithMemset = true; - static const bool kCanMoveWithMemcpy = true; -}; - -template <typename T> -struct VectorTraits<blink::HeapDeque<T>> - : VectorTraitsBase<blink::HeapDeque<T>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = false; - static const bool kCanInitializeWithMemset = true; - static const bool kCanClearUnusedSlotsWithMemset = true; - static const bool kCanMoveWithMemcpy = true; -}; - -template <typename T, wtf_size_t inlineCapacity> -struct VectorTraits<blink::HeapVector<T, inlineCapacity>> - : VectorTraitsBase<blink::HeapVector<T, inlineCapacity>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = VectorTraits<T>::kNeedsDestruction; - static const bool kCanInitializeWithMemset = - VectorTraits<T>::kCanInitializeWithMemset; - static const bool kCanClearUnusedSlotsWithMemset = - VectorTraits<T>::kCanClearUnusedSlotsWithMemset; - static const bool kCanMoveWithMemcpy = VectorTraits<T>::kCanMoveWithMemcpy; -}; - -template <typename T> -struct HashTraits<blink::Member<T>> : SimpleClassHashTraits<blink::Member<T>> { - STATIC_ONLY(HashTraits); - // FIXME: Implement proper const'ness for iterator types. Requires support - // in the marking Visitor. - using PeekInType = T*; - using IteratorGetType = blink::Member<T>*; - using IteratorConstGetType = const blink::Member<T>*; - using IteratorReferenceType = blink::Member<T>&; - using IteratorConstReferenceType = const blink::Member<T>&; - static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { - return *x; - } - static IteratorConstReferenceType GetToReferenceConstConversion( - IteratorConstGetType x) { - return *x; - } - - using PeekOutType = T*; - - template <typename U> - static void Store(const U& value, blink::Member<T>& storage) { - storage = value; - } - - static PeekOutType Peek(const blink::Member<T>& value) { return value; } - - static void ConstructDeletedValue(blink::Member<T>& slot, bool) { - slot = WTF::kHashTableDeletedValue; - } - - static constexpr bool kCanTraceConcurrently = true; -}; - -template <typename T> -struct HashTraits<blink::WeakMember<T>> - : SimpleClassHashTraits<blink::WeakMember<T>> { - STATIC_ONLY(HashTraits); - static const bool kNeedsDestruction = false; - // FIXME: Implement proper const'ness for iterator types. Requires support - // in the marking Visitor. - using PeekInType = T*; - using IteratorGetType = blink::WeakMember<T>*; - using IteratorConstGetType = const blink::WeakMember<T>*; - using IteratorReferenceType = blink::WeakMember<T>&; - using IteratorConstReferenceType = const blink::WeakMember<T>&; - static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { - return *x; - } - static IteratorConstReferenceType GetToReferenceConstConversion( - IteratorConstGetType x) { - return *x; - } - - using PeekOutType = T*; - - template <typename U> - static void Store(const U& value, blink::WeakMember<T>& storage) { - storage = value; - } - - static PeekOutType Peek(const blink::WeakMember<T>& value) { return value; } - - static void ConstructDeletedValue(blink::WeakMember<T>& slot, bool) { - slot = WTF::kHashTableDeletedValue; - } - - static constexpr bool kCanTraceConcurrently = true; -}; - -template <typename T> -struct HashTraits<blink::UntracedMember<T>> - : SimpleClassHashTraits<blink::UntracedMember<T>> { - STATIC_ONLY(HashTraits); - static const bool kNeedsDestruction = false; - // FIXME: Implement proper const'ness for iterator types. - using PeekInType = T*; - using IteratorGetType = blink::UntracedMember<T>*; - using IteratorConstGetType = const blink::UntracedMember<T>*; - using IteratorReferenceType = blink::UntracedMember<T>&; - using IteratorConstReferenceType = const blink::UntracedMember<T>&; - static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { - return *x; - } - static IteratorConstReferenceType GetToReferenceConstConversion( - IteratorConstGetType x) { - return *x; - } - using PeekOutType = T*; - - template <typename U> - static void Store(const U& value, blink::UntracedMember<T>& storage) { - storage = value; - } - - static PeekOutType Peek(const blink::UntracedMember<T>& value) { - return value; - } -}; - -template <typename T, typename H> -struct HandleHashTraits : SimpleClassHashTraits<H> { - STATIC_ONLY(HandleHashTraits); - // TODO: Implement proper const'ness for iterator types. Requires support - // in the marking Visitor. - using PeekInType = T*; - using IteratorGetType = H*; - using IteratorConstGetType = const H*; - using IteratorReferenceType = H&; - using IteratorConstReferenceType = const H&; - static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { - return *x; - } - static IteratorConstReferenceType GetToReferenceConstConversion( - IteratorConstGetType x) { - return *x; - } - - using PeekOutType = T*; - - template <typename U> - static void Store(const U& value, H& storage) { - storage = value; - } - - static PeekOutType Peek(const H& value) { return value; } -}; - -template <typename Value, - typename HashFunctions, - typename Traits, - typename VectorType> -inline void CopyToVector( - const blink::HeapHashCountedSet<Value, HashFunctions, Traits>& set, - VectorType& vector) { - CopyToVector(static_cast<const HashCountedSet<Value, HashFunctions, Traits, - blink::HeapAllocator>&>(set), - vector); -} - -} // namespace WTF - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_HEAP_ALLOCATOR_H_
diff --git a/third_party/blink/renderer/platform/heap/impl/heap_allocator.cc b/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.cc similarity index 96% rename from third_party/blink/renderer/platform/heap/impl/heap_allocator.cc rename to third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.cc index f4e2745e..8f0efaa 100644 --- a/third_party/blink/renderer/platform/heap/impl/heap_allocator.cc +++ b/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.cc
@@ -1,8 +1,8 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// Copyright 2021 The Chromium 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/heap_allocator.h" +#include "third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h" namespace blink {
diff --git a/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h b/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h new file mode 100644 index 0000000..33d8c6e --- /dev/null +++ b/third_party/blink/renderer/platform/heap/impl/heap_allocator_impl.h
@@ -0,0 +1,160 @@ +// 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. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_HEAP_ALLOCATOR_IMPL_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_HEAP_ALLOCATOR_IMPL_H_ + +#include "build/build_config.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h" +#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector_backing.h" +#include "third_party/blink/renderer/platform/heap/impl/heap.h" +#include "third_party/blink/renderer/platform/heap/impl/marking_visitor.h" +#include "third_party/blink/renderer/platform/heap/impl/trace_traits.h" +#include "third_party/blink/renderer/platform/wtf/type_traits.h" + +namespace blink { + +// This is a static-only class used as a trait on collections to make them heap +// allocated. +class PLATFORM_EXPORT HeapAllocator { + STATIC_ONLY(HeapAllocator); + + public: + using LivenessBroker = blink::LivenessBroker; + using Visitor = blink::Visitor; + static constexpr bool kIsGarbageCollected = true; + + // See wtf/size_t.h for details. + static constexpr size_t kMaxHeapObjectSizeLog2 = 27; + static constexpr size_t kMaxHeapObjectSize = 1 << kMaxHeapObjectSizeLog2; + + template <typename T> + static size_t MaxElementCountInBackingStore() { + return kMaxHeapObjectSize / sizeof(T); + } + + template <typename T> + static size_t QuantizedSize(size_t count) { + CHECK_LE(count, MaxElementCountInBackingStore<T>()); + // Oilpan's internal size is independent of MaxElementCountInBackingStore() + // and the required size to match capacity needs. + return count * sizeof(T); + } + + template <typename T> + static T* AllocateVectorBacking(size_t size) { + return reinterpret_cast<T*>( + MakeGarbageCollected<HeapVectorBacking<T>>(size / sizeof(T))); + } + static void FreeVectorBacking(void*); + static bool ExpandVectorBacking(void*, size_t); + static bool ShrinkVectorBacking(void* address, + size_t quantized_current_size, + size_t quantized_shrunk_size); + + template <typename T, typename HashTable> + static T* AllocateHashTableBacking(size_t size) { + return reinterpret_cast<T*>( + MakeGarbageCollected<HeapHashTableBacking<HashTable>>( + size / sizeof(typename HashTable::ValueType))); + } + template <typename T, typename HashTable> + static T* AllocateZeroedHashTableBacking(size_t size) { + return AllocateHashTableBacking<T, HashTable>(size); + } + static void FreeHashTableBacking(void* address); + static bool ExpandHashTableBacking(void*, size_t); + + static bool IsAllocationAllowed() { + return ThreadState::Current()->IsAllocationAllowed(); + } + + static bool IsIncrementalMarking() { + return ThreadState::IsAnyIncrementalMarking() && + ThreadState::Current()->IsIncrementalMarking(); + } + + static void EnterGCForbiddenScope() { + ThreadState::Current()->EnterGCForbiddenScope(); + } + + static void LeaveGCForbiddenScope() { + ThreadState::Current()->LeaveGCForbiddenScope(); + } + + template <typename T, typename Traits> + static void Trace(Visitor* visitor, const T& t) { + TraceCollectionIfEnabled<WTF::WeakHandlingTrait<T>::value, T, + Traits>::Trace(visitor, &t); + } + + template <typename T> + static void TraceVectorBacking(Visitor* visitor, + const T* backing, + const T* const* backing_slot) { + visitor->TraceMovablePointer(backing_slot); + visitor->Trace(reinterpret_cast<const HeapVectorBacking<T>*>(backing)); + } + + template <typename T, typename HashTable> + static void TraceHashTableBackingStrongly(Visitor* visitor, + const T* backing, + const T* const* backing_slot) { + visitor->TraceMovablePointer(backing_slot); + visitor->Trace( + reinterpret_cast<const HeapHashTableBacking<HashTable>*>(backing)); + } + + template <typename T, typename HashTable> + static void TraceHashTableBackingWeakly(Visitor* visitor, + const T* backing, + const T* const* backing_slot, + WeakCallback callback, + const void* parameter) { + visitor->TraceMovablePointer(backing_slot); + visitor->TraceWeakContainer( + reinterpret_cast<const HeapHashTableBacking<HashTable>*>(backing), + reinterpret_cast<const HeapHashTableBacking<HashTable>* const*>( + backing_slot), + TraceTrait<HeapHashTableBacking<HashTable>>::GetTraceDescriptor( + backing), + TraceTrait<HeapHashTableBacking<HashTable>>::GetWeakTraceDescriptor( + backing), + callback, parameter); + } + + template <typename T> + static void BackingWriteBarrier(T** slot) { + MarkingVisitor::WriteBarrier(reinterpret_cast<void**>(slot)); + } + + static void TraceBackingStoreIfMarked(const void* object) { + MarkingVisitor::RetraceObject(object); + } + + template <typename T, typename Traits> + static void NotifyNewObject(T* object) { + MarkingVisitor::WriteBarrier( + []() { return ThreadState::Current(); }, object, sizeof(T), 1, + TraceCollectionIfEnabled<WTF::kNoWeakHandling, T, Traits>::Trace); + } + + template <typename T, typename Traits> + static void NotifyNewObjects(T* array, size_t len) { + MarkingVisitor::WriteBarrier( + []() { return ThreadState::Current(); }, array, sizeof(T), len, + TraceCollectionIfEnabled<WTF::kNoWeakHandling, T, Traits>::Trace); + } + + private: + static void BackingFree(void*); + static bool BackingExpand(void*, size_t); + static bool BackingShrink(void*, + size_t quantized_current_size, + size_t quantized_shrunk_size); +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_HEAP_ALLOCATOR_IMPL_H_
diff --git a/third_party/blink/renderer/platform/heap/impl/member.h b/third_party/blink/renderer/platform/heap/impl/member.h index 17dd6db..f9c8fe7 100644 --- a/third_party/blink/renderer/platform/heap/impl/member.h +++ b/third_party/blink/renderer/platform/heap/impl/member.h
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/platform/heap/impl/heap_page.h" #include "third_party/blink/renderer/platform/heap/impl/marking_visitor.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/construct_traits.h" #include "third_party/blink/renderer/platform/wtf/hash_functions.h" #include "third_party/blink/renderer/platform/wtf/hash_traits.h"
diff --git a/third_party/blink/renderer/platform/heap/impl/persistent.h b/third_party/blink/renderer/platform/heap/impl/persistent.h index 00cff273..09ef3bc1 100644 --- a/third_party/blink/renderer/platform/heap/impl/persistent.h +++ b/third_party/blink/renderer/platform/heap/impl/persistent.h
@@ -886,86 +886,4 @@ } // namespace blink -namespace WTF { - -template < - typename T, - blink::WeaknessPersistentConfiguration weaknessConfiguration, - blink::CrossThreadnessPersistentConfiguration crossThreadnessConfiguration> -struct VectorTraits<blink::PersistentBase<T, - weaknessConfiguration, - crossThreadnessConfiguration>> - : VectorTraitsBase<blink::PersistentBase<T, - weaknessConfiguration, - crossThreadnessConfiguration>> { - STATIC_ONLY(VectorTraits); - static const bool kNeedsDestruction = true; - static const bool kCanInitializeWithMemset = true; - static const bool kCanClearUnusedSlotsWithMemset = false; - static const bool kCanMoveWithMemcpy = true; -}; - -template <typename T> -struct HashTraits<blink::Persistent<T>> - : HandleHashTraits<T, blink::Persistent<T>> {}; - -template <typename T> -struct HashTraits<blink::CrossThreadPersistent<T>> - : HandleHashTraits<T, blink::CrossThreadPersistent<T>> {}; - -template <typename T> -struct DefaultHash<blink::Persistent<T>> { - STATIC_ONLY(DefaultHash); - using Hash = MemberHash<T>; -}; - -template <typename T> -struct DefaultHash<blink::WeakPersistent<T>> { - STATIC_ONLY(DefaultHash); - using Hash = MemberHash<T>; -}; - -template <typename T> -struct DefaultHash<blink::CrossThreadPersistent<T>> { - STATIC_ONLY(DefaultHash); - using Hash = MemberHash<T>; -}; - -template <typename T> -struct DefaultHash<blink::CrossThreadWeakPersistent<T>> { - STATIC_ONLY(DefaultHash); - using Hash = MemberHash<T>; -}; - -template <typename T> -struct CrossThreadCopier<blink::CrossThreadPersistent<T>> - : public CrossThreadCopierPassThrough<blink::CrossThreadPersistent<T>> { - STATIC_ONLY(CrossThreadCopier); -}; - -template <typename T> -struct CrossThreadCopier<blink::CrossThreadWeakPersistent<T>> - : public CrossThreadCopierPassThrough<blink::CrossThreadWeakPersistent<T>> { - STATIC_ONLY(CrossThreadCopier); -}; - -} // namespace WTF - -namespace base { - -template <typename T> -struct IsWeakReceiver<blink::WeakPersistent<T>> : std::true_type {}; - -template <typename T> -struct IsWeakReceiver<blink::CrossThreadWeakPersistent<T>> : std::true_type {}; - -template <typename T> -struct BindUnwrapTraits<blink::CrossThreadWeakPersistent<T>> { - static blink::CrossThreadPersistent<T> Unwrap( - const blink::CrossThreadWeakPersistent<T>& wrapped) { - return blink::CrossThreadPersistent<T>(wrapped); - } -}; -} // namespace base - #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_IMPL_PERSISTENT_H_
diff --git a/third_party/blink/renderer/platform/heap/member.h b/third_party/blink/renderer/platform/heap/member.h index 82e4557..d01f2714 100644 --- a/third_party/blink/renderer/platform/heap/member.h +++ b/third_party/blink/renderer/platform/heap/member.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_MEMBER_H_ #include "third_party/blink/renderer/platform/wtf/buildflags.h" +#include "third_party/blink/renderer/platform/wtf/hash_traits.h" #if BUILDFLAG(USE_V8_OILPAN) #include "third_party/blink/renderer/platform/heap/v8_wrapper/member.h" @@ -13,4 +14,108 @@ #include "third_party/blink/renderer/platform/heap/impl/member.h" #endif // !USE_V8_OILPAN +namespace WTF { + +template <typename T> +struct HashTraits<blink::Member<T>> : SimpleClassHashTraits<blink::Member<T>> { + STATIC_ONLY(HashTraits); + // FIXME: Implement proper const'ness for iterator types. Requires support + // in the marking Visitor. + using PeekInType = T*; + using IteratorGetType = blink::Member<T>*; + using IteratorConstGetType = const blink::Member<T>*; + using IteratorReferenceType = blink::Member<T>&; + using IteratorConstReferenceType = const blink::Member<T>&; + static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { + return *x; + } + static IteratorConstReferenceType GetToReferenceConstConversion( + IteratorConstGetType x) { + return *x; + } + + using PeekOutType = T*; + + template <typename U> + static void Store(const U& value, blink::Member<T>& storage) { + storage = value; + } + + static PeekOutType Peek(const blink::Member<T>& value) { return value; } + + static void ConstructDeletedValue(blink::Member<T>& slot, bool) { + slot = WTF::kHashTableDeletedValue; + } + + static constexpr bool kCanTraceConcurrently = true; +}; + +template <typename T> +struct HashTraits<blink::WeakMember<T>> + : SimpleClassHashTraits<blink::WeakMember<T>> { + STATIC_ONLY(HashTraits); + static const bool kNeedsDestruction = false; + // FIXME: Implement proper const'ness for iterator types. Requires support + // in the marking Visitor. + using PeekInType = T*; + using IteratorGetType = blink::WeakMember<T>*; + using IteratorConstGetType = const blink::WeakMember<T>*; + using IteratorReferenceType = blink::WeakMember<T>&; + using IteratorConstReferenceType = const blink::WeakMember<T>&; + static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { + return *x; + } + static IteratorConstReferenceType GetToReferenceConstConversion( + IteratorConstGetType x) { + return *x; + } + + using PeekOutType = T*; + + template <typename U> + static void Store(const U& value, blink::WeakMember<T>& storage) { + storage = value; + } + + static PeekOutType Peek(const blink::WeakMember<T>& value) { return value; } + + static void ConstructDeletedValue(blink::WeakMember<T>& slot, bool) { + slot = WTF::kHashTableDeletedValue; + } + + static constexpr bool kCanTraceConcurrently = true; +}; + +template <typename T> +struct HashTraits<blink::UntracedMember<T>> + : SimpleClassHashTraits<blink::UntracedMember<T>> { + STATIC_ONLY(HashTraits); + static const bool kNeedsDestruction = false; + // FIXME: Implement proper const'ness for iterator types. + using PeekInType = T*; + using IteratorGetType = blink::UntracedMember<T>*; + using IteratorConstGetType = const blink::UntracedMember<T>*; + using IteratorReferenceType = blink::UntracedMember<T>&; + using IteratorConstReferenceType = const blink::UntracedMember<T>&; + static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { + return *x; + } + static IteratorConstReferenceType GetToReferenceConstConversion( + IteratorConstGetType x) { + return *x; + } + using PeekOutType = T*; + + template <typename U> + static void Store(const U& value, blink::UntracedMember<T>& storage) { + storage = value; + } + + static PeekOutType Peek(const blink::UntracedMember<T>& value) { + return value; + } +}; + +} // namespace WTF + #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_MEMBER_H_
diff --git a/third_party/blink/renderer/platform/heap/persistent.h b/third_party/blink/renderer/platform/heap/persistent.h index d3815f9..ff2311d3 100644 --- a/third_party/blink/renderer/platform/heap/persistent.h +++ b/third_party/blink/renderer/platform/heap/persistent.h
@@ -13,4 +13,115 @@ #include "third_party/blink/renderer/platform/heap/impl/persistent.h" #endif // !USE_V8_OILPAN +namespace WTF { + +template < + typename T, + blink::WeaknessPersistentConfiguration weaknessConfiguration, + blink::CrossThreadnessPersistentConfiguration crossThreadnessConfiguration> +struct VectorTraits<blink::PersistentBase<T, + weaknessConfiguration, + crossThreadnessConfiguration>> + : VectorTraitsBase<blink::PersistentBase<T, + weaknessConfiguration, + crossThreadnessConfiguration>> { + STATIC_ONLY(VectorTraits); + static const bool kNeedsDestruction = true; + static const bool kCanInitializeWithMemset = true; + static const bool kCanClearUnusedSlotsWithMemset = false; + static const bool kCanMoveWithMemcpy = true; +}; + +template <typename T, typename H> +struct HandleHashTraits : SimpleClassHashTraits<H> { + STATIC_ONLY(HandleHashTraits); + // TODO: Implement proper const'ness for iterator types. Requires support + // in the marking Visitor. + using PeekInType = T*; + using IteratorGetType = H*; + using IteratorConstGetType = const H*; + using IteratorReferenceType = H&; + using IteratorConstReferenceType = const H&; + static IteratorReferenceType GetToReferenceConversion(IteratorGetType x) { + return *x; + } + static IteratorConstReferenceType GetToReferenceConstConversion( + IteratorConstGetType x) { + return *x; + } + + using PeekOutType = T*; + + template <typename U> + static void Store(const U& value, H& storage) { + storage = value; + } + + static PeekOutType Peek(const H& value) { return value; } +}; + +template <typename T> +struct HashTraits<blink::Persistent<T>> + : HandleHashTraits<T, blink::Persistent<T>> {}; + +template <typename T> +struct HashTraits<blink::CrossThreadPersistent<T>> + : HandleHashTraits<T, blink::CrossThreadPersistent<T>> {}; + +template <typename T> +struct DefaultHash<blink::Persistent<T>> { + STATIC_ONLY(DefaultHash); + using Hash = MemberHash<T>; +}; + +template <typename T> +struct DefaultHash<blink::WeakPersistent<T>> { + STATIC_ONLY(DefaultHash); + using Hash = MemberHash<T>; +}; + +template <typename T> +struct DefaultHash<blink::CrossThreadPersistent<T>> { + STATIC_ONLY(DefaultHash); + using Hash = MemberHash<T>; +}; + +template <typename T> +struct DefaultHash<blink::CrossThreadWeakPersistent<T>> { + STATIC_ONLY(DefaultHash); + using Hash = MemberHash<T>; +}; + +template <typename T> +struct CrossThreadCopier<blink::CrossThreadPersistent<T>> + : public CrossThreadCopierPassThrough<blink::CrossThreadPersistent<T>> { + STATIC_ONLY(CrossThreadCopier); +}; + +template <typename T> +struct CrossThreadCopier<blink::CrossThreadWeakPersistent<T>> + : public CrossThreadCopierPassThrough<blink::CrossThreadWeakPersistent<T>> { + STATIC_ONLY(CrossThreadCopier); +}; + +} // namespace WTF + +namespace base { + +template <typename T> +struct IsWeakReceiver<blink::WeakPersistent<T>> : std::true_type {}; + +template <typename T> +struct IsWeakReceiver<blink::CrossThreadWeakPersistent<T>> : std::true_type {}; + +template <typename T> +struct BindUnwrapTraits<blink::CrossThreadWeakPersistent<T>> { + static blink::CrossThreadPersistent<T> Unwrap( + const blink::CrossThreadWeakPersistent<T>& wrapped) { + return blink::CrossThreadPersistent<T>(wrapped); + } +}; + +} // namespace base + #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_PERSISTENT_H_
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/garbage_collected.h b/third_party/blink/renderer/platform/heap/v8_wrapper/garbage_collected.h index 30a62187..a06d0e7 100644 --- a/third_party/blink/renderer/platform/heap/v8_wrapper/garbage_collected.h +++ b/third_party/blink/renderer/platform/heap/v8_wrapper/garbage_collected.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_GARBAGE_COLLECTED_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_GARBAGE_COLLECTED_H_ +#include "v8/include/cppgc/garbage-collected.h" #include "v8/include/cppgc/type-traits.h" // GC_PLUGIN_IGNORE is used to make the plugin ignore a particular class or @@ -20,6 +21,8 @@ namespace blink { +using GarbageCollectedMixin = cppgc::GarbageCollectedMixin; + template <typename T> struct IsGarbageCollectedMixin { public:
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/heap.h b/third_party/blink/renderer/platform/heap/v8_wrapper/heap.h index 30dc9f55..c16ea2e6 100644 --- a/third_party/blink/renderer/platform/heap/v8_wrapper/heap.h +++ b/third_party/blink/renderer/platform/heap/v8_wrapper/heap.h
@@ -14,8 +14,6 @@ template <typename T> using GarbageCollected = cppgc::GarbageCollected<T>; -using GarbageCollectedMixin = cppgc::GarbageCollectedMixin; - // Default MakeGarbageCollected: Constructs an instance of T, which is a garbage // collected type. template <typename T, typename... Args>
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc index 06cb2110..d230b83 100644 --- a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc +++ b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc
@@ -34,9 +34,9 @@ } ThreadState::ThreadState(v8::CppHeap& cpp_heap) - : cpp_heap_(cpp_heap), - allocation_handle_(cpp_heap.GetAllocationHandle()) - thread_id_(CurrentThread()) {} + : allocation_handle_(cpp_heap.GetAllocationHandle()), + cpp_heap_(cpp_heap), + thread_id_(CurrentThread()) {} ThreadState::~ThreadState() { DCHECK(!IsMainThread());
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h index c759d89..fd5d6bba 100644 --- a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h +++ b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_THREAD_STATE_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_WRAPPER_THREAD_STATE_H_ +#include "base/compiler_specific.h" #include "base/lazy_instance.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/thread_specific.h" @@ -68,6 +69,12 @@ ALWAYS_INLINE cppgc::AllocationHandle& allocation_handle() const { return allocation_handle_; } + ALWAYS_INLINE v8::CppHeap& cpp_heap() const { return cpp_heap_; } + ALWAYS_INLINE v8::Isolate* GetIsolate() const { + // TODO(1056170): Refer to cpp_heap_ once getter for v8::Isolate is + // implemented. + return nullptr; + } private: // Main-thread ThreadState avoids TLS completely by using a regular global.
diff --git a/third_party/blink/renderer/platform/mojo/drag_mojom_traits.cc b/third_party/blink/renderer/platform/mojo/drag_mojom_traits.cc index 8074424..3aa3c34 100644 --- a/third_party/blink/renderer/platform/mojo/drag_mojom_traits.cc +++ b/third_party/blink/renderer/platform/mojo/drag_mojom_traits.cc
@@ -103,12 +103,12 @@ item.filename_data = blink::FilePathToWebString(filename_data); item.display_name_data = blink::FilePathToWebString(display_name_data); mojo::PendingRemote<::blink::mojom::blink::FileSystemAccessDragDropToken> - native_file_system_token( + file_system_access_token( data.TakeFileSystemAccessToken<mojo::PendingRemote< ::blink::mojom::blink::FileSystemAccessDragDropToken>>()); - item.native_file_system_entry = - base::MakeRefCounted<::blink::NativeFileSystemDropData>( - std::move(native_file_system_token)); + item.file_system_access_entry = + base::MakeRefCounted<::blink::FileSystemAccessDropData>( + std::move(file_system_access_token)); *out = std::move(item); return true; @@ -187,7 +187,7 @@ file_system_access_token(const blink::WebDragData::Item& item) { // Should never have to send a transfer token information from the renderer // to the browser. - DCHECK(!item.native_file_system_entry); + DCHECK(!item.file_system_access_entry); return mojo::NullRemote(); }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index e39f4db7..aeafd89b 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -614,6 +614,17 @@ name: "CSSSnapSize", status: "experimental", }, + { + // Support for CSS ::spelling-error, ::grammar-error, and the + // spelling-error and grammar-error values in text-decoration-line. + // + // https://drafts.csswg.org/css-pseudo-4/#selectordef-spelling-error + // https://drafts.csswg.org/css-pseudo-4/#selectordef-grammar-error + // https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-spelling-error + // https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-grammar-error + name: "CSSSpellingGrammarErrors", + status: "test", + }, // Make system color keywords compute to themselves. // https://github.com/w3c/csswg-drafts/issues/3847 { @@ -861,7 +872,7 @@ // Also enabled when blink::features::kFileHandlingAPI is overridden // on the command line (or via chrome://flags). name: "FileHandling", - depends_on: ["NativeFileSystem"], + depends_on: ["FileSystemAccess"], status: {"Android": "test", "default": "experimental"}, origin_trial_feature_name: "FileHandling", origin_trial_os: ["win", "mac", "linux", "chromeos"], @@ -871,6 +882,10 @@ status: "stable", }, { + name: "FileSystemAccess", + status: {"Android": "test", "default": "stable"}, + }, + { // In-development features for the File System Access API. name: "FileSystemAccessAPIExperimental", status: "experimental", @@ -1295,15 +1310,6 @@ status: "stable", }, { - // Also enabled when blink::features::kNativeFileSystemAPI is overridden - // on the command line (or via chrome://flags). - name: "NativeFileSystem", - status: {"Android": "test", "default": "stable"}, - // TODO(mek): Remove origin trial integration. - origin_trial_feature_name: "NativeFileSystem2", - origin_trial_os: ["win", "mac", "linux", "chromeos"], - }, - { name: "NativeIO", status: "experimental", }, @@ -1380,7 +1386,6 @@ }, { name: "OriginIsolationHeader", - origin_trial_feature_name: "OriginIsolationHeader", status: "experimental", }, { @@ -2172,7 +2177,8 @@ }, { name: "WebHID", - status: {"Android": "", "default": "stable"}, + origin_trial_feature_name: "WebHID", + status: {"Android": "", "default": "experimental"}, }, { name: "WebID",
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h b/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h index 2caf785..80502aa0 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread.h
@@ -15,6 +15,7 @@ #include "third_party/blink/public/platform/web_private_ptr.h" #include "third_party/blink/renderer/platform/heap/gc_task_runner.h" #include "third_party/blink/renderer/platform/scheduler/public/thread.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { class BlinkGCMemoryDumpProvider;
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin.h b/third_party/blink/renderer/platform/weborigin/security_origin.h index c97a41b1..9792167 100644 --- a/third_party/blink/renderer/platform/weborigin/security_origin.h +++ b/third_party/blink/renderer/platform/weborigin/security_origin.h
@@ -230,7 +230,6 @@ bool CanAccessCookies() const { return !IsOpaque(); } bool CanAccessPasswordManager() const { return !IsOpaque(); } bool CanAccessFileSystem() const { return !IsOpaque(); } - bool CanAccessNativeFileSystem() const { return !IsOpaque(); } bool CanAccessCacheStorage() const { return !IsOpaque(); } bool CanAccessLocks() const { return !IsOpaque(); } bool CanAccessSessionStorage() const { return !IsOpaque(); }
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc index b88f8e9..ccbc3f3 100644 --- a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc +++ b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
@@ -47,6 +47,7 @@ #include "third_party/blink/renderer/platform/wtf/text/string_operators.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "url/gurl.h" +#include "url/origin_abstract_tests.h" #include "url/url_util.h" namespace blink { @@ -909,24 +910,6 @@ EXPECT_TRUE(origin->IsOpaque()); } -TEST_F(SecurityOriginTest, NonStandardSchemeWithAndroidWebViewHack) { - url::ScopedSchemeRegistryForTests scoped_registry; - url::EnableNonStandardSchemesForAndroidWebView(); - - // Regression test for https://crbug.com/896059. - scoped_refptr<const SecurityOrigin> origin = - SecurityOrigin::CreateFromString("cow://"); - EXPECT_FALSE(origin->IsOpaque()); - EXPECT_EQ("cow", origin->Protocol()); - EXPECT_EQ("", origin->Host()); - EXPECT_EQ(0, origin->Port()); - - // about:blank translates into an opaque origin, even in presence of - // EnableNonStandardSchemesForAndroidWebView. - origin = SecurityOrigin::CreateFromString("about:blank"); - EXPECT_TRUE(origin->IsOpaque()); -} - TEST_F(SecurityOriginTest, OpaqueIsolatedCopy) { scoped_refptr<const SecurityOrigin> origin = SecurityOrigin::CreateUniqueOpaque(); @@ -1214,3 +1197,38 @@ } } // namespace blink + +// Apparently INSTANTIATE_TYPED_TEST_SUITE_P needs to be used in the same +// namespace as where the typed test suite was defined. +namespace url { + +class BlinkSecurityOriginTestTraits final + : public url::OriginTraitsBase<scoped_refptr<blink::SecurityOrigin>> { + public: + OriginType CreateOriginFromString(base::StringPiece s) const override { + return blink::SecurityOrigin::CreateFromString( + String(s.data(), s.length())); + } + + bool IsOpaque(const OriginType& origin) const override { + return origin->IsOpaque(); + } + + std::string GetScheme(const OriginType& origin) const override { + return origin->Protocol().Utf8(); + } + + std::string GetHost(const OriginType& origin) const override { + return origin->Host().Utf8(); + } + + uint16_t GetPort(const OriginType& origin) const override { + return origin->Port(); + } +}; + +INSTANTIATE_TYPED_TEST_SUITE_P(BlinkSecurityOrigin, + AbstractOriginTest, + BlinkSecurityOriginTestTraits); + +} // namespace url
diff --git a/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc b/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc index 5a0d7c0..e876d05 100644 --- a/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc +++ b/third_party/blink/renderer/platform/widget/input/input_handler_proxy.cc
@@ -1409,7 +1409,7 @@ while (!compositor_event_queue_->empty()) { std::unique_ptr<EventWithCallback> event_with_callback = scroll_predictor_->ResampleScrollEvents(compositor_event_queue_->Pop(), - args.frame_time); + args.frame_time, args.interval); DispatchSingleInputEvent(std::move(event_with_callback), args.frame_time); }
diff --git a/third_party/blink/renderer/platform/widget/input/scroll_predictor.cc b/third_party/blink/renderer/platform/widget/input/scroll_predictor.cc index 95e5f3f..9fa43f8 100644 --- a/third_party/blink/renderer/platform/widget/input/scroll_predictor.cc +++ b/third_party/blink/renderer/platform/widget/input/scroll_predictor.cc
@@ -58,7 +58,8 @@ std::unique_ptr<EventWithCallback> ScrollPredictor::ResampleScrollEvents( std::unique_ptr<EventWithCallback> event_with_callback, - base::TimeTicks frame_time) { + base::TimeTicks frame_time, + base::TimeDelta frame_interval) { if (!should_resample_scroll_events_) return event_with_callback; @@ -79,7 +80,8 @@ UpdatePrediction(coalesced_event.event_->Event(), frame_time); if (should_resample_scroll_events_) { - ResampleEvent(frame_time, event_with_callback->event_pointer(), + ResampleEvent(frame_time, frame_interval, + event_with_callback->event_pointer(), &event_with_callback->latency_info()); } @@ -128,6 +130,7 @@ } void ScrollPredictor::ResampleEvent(base::TimeTicks frame_time, + base::TimeDelta frame_interval, WebInputEvent* event, ui::LatencyInfo* latency_info) { DCHECK(event->GetType() == WebInputEvent::Type::kGestureScrollUpdate); @@ -151,7 +154,7 @@ base::TimeTicks prediction_time = gesture_event->TimeStamp() + prediction_delta; - auto result = predictor_->GeneratePrediction(prediction_time); + auto result = predictor_->GeneratePrediction(prediction_time, frame_interval); if (result) { predicted_accumulated_delta = result->pos; gesture_event->SetTimeStamp(result->time_stamp);
diff --git a/third_party/blink/renderer/platform/widget/input/scroll_predictor.h b/third_party/blink/renderer/platform/widget/input/scroll_predictor.h index aff434f..7957d77 100644 --- a/third_party/blink/renderer/platform/widget/input/scroll_predictor.h +++ b/third_party/blink/renderer/platform/widget/input/scroll_predictor.h
@@ -37,7 +37,8 @@ // event if enable_resampling is true. std::unique_ptr<EventWithCallback> ResampleScrollEvents( std::unique_ptr<EventWithCallback> event_with_callback, - base::TimeTicks frame_time); + base::TimeTicks frame_time, + base::TimeDelta frame_interval); private: friend class test::InputHandlerProxyEventQueueTest; @@ -52,6 +53,7 @@ // Apply resampled deltaX/deltaY to gesture events void ResampleEvent(base::TimeTicks frame_time, + base::TimeDelta frame_interval, WebInputEvent* event, ui::LatencyInfo* latency_info);
diff --git a/third_party/blink/renderer/platform/widget/input/scroll_predictor_unittest.cc b/third_party/blink/renderer/platform/widget/input/scroll_predictor_unittest.cc index 88725b7d..b34f9df 100644 --- a/third_party/blink/renderer/platform/widget/input/scroll_predictor_unittest.cc +++ b/third_party/blink/renderer/platform/widget/input/scroll_predictor_unittest.cc
@@ -77,26 +77,32 @@ } void HandleResampleScrollEvents(std::unique_ptr<WebInputEvent>& event, - double time_delta_in_milliseconds = 0) { + double time_delta_in_milliseconds = 0, + double display_refresh_rate = 30) { auto event_with_callback = std::make_unique<EventWithCallback>( std::make_unique<WebCoalescedInputEvent>(std::move(event), ui::LatencyInfo()), base::TimeTicks(), base::NullCallback(), nullptr); event_with_callback->original_events() = std::move(original_events_); + base::TimeDelta frame_interval = + base::TimeDelta::FromSecondsD(1.0f / display_refresh_rate); event_with_callback = scroll_predictor_->ResampleScrollEvents( std::move(event_with_callback), WebInputEvent::GetStaticTimeStampForTests() + - base::TimeDelta::FromMillisecondsD(time_delta_in_milliseconds)); + base::TimeDelta::FromMillisecondsD(time_delta_in_milliseconds), + frame_interval); event = event_with_callback->event().Clone(); } std::unique_ptr<ui::InputPredictor::InputData> PredictionAvailable( double time_delta_in_milliseconds = 0) { - return scroll_predictor_->predictor_->GeneratePrediction( + base::TimeTicks frame_time = WebInputEvent::GetStaticTimeStampForTests() + - base::TimeDelta::FromMillisecondsD(time_delta_in_milliseconds)); + base::TimeDelta::FromMillisecondsD(time_delta_in_milliseconds); + // Tests with 60Hz. + return scroll_predictor_->predictor_->GeneratePrediction(frame_time); } gfx::PointF GetLastAccumulatedDelta() { @@ -168,6 +174,30 @@ EXPECT_EQ(expected_type, scroll_predictor_->filter_->GetName()); } + void InitLinearResamplingTest(bool use_frames_based_experimental_prediction) { + base::FieldTrialParams params; + params["filter"] = ::features::kPredictorNameLinearResampling; + base::test::ScopedFeatureList::FeatureAndParams prediction_params = { + features::kResamplingScrollEvents, params}; + + base::FieldTrialParams prediction_type_params; + prediction_type_params["mode"] = + use_frames_based_experimental_prediction + ? ::features::kPredictionTypeFramesBased + : ::features::kPredictionTypeTimeBased; + base::test::ScopedFeatureList::FeatureAndParams + experimental_prediction_params = { + ::features::kResamplingScrollEventsExperimentalPrediction, + prediction_type_params}; + + scoped_feature_list_.Reset(); + scoped_feature_list_.InitWithFeaturesAndParameters( + {prediction_params, experimental_prediction_params}, {}); + scroll_predictor_ = std::make_unique<ScrollPredictor>(); + + VerifyPredictorType(::features::kPredictorNameLinearResampling); + } + protected: EventWithCallback::OriginalEventList original_events_; std::unique_ptr<ScrollPredictor> scroll_predictor_; @@ -372,6 +402,60 @@ EXPECT_EQ(-150, result->pos.y()); } +TEST_F(ScrollPredictorTest, LinearResamplingPredictorTest) { + // Test kResamplingScrollEventsExperimentalLatencyFixed + InitLinearResamplingTest(false); + SendGestureScrollBegin(); + + // Send 1st GSU, no prediction available. + std::unique_ptr<WebInputEvent> gesture_update = + CreateGestureScrollUpdate(0, 10, 10 /* ms */); + HandleResampleScrollEvents(gesture_update, 10 /* ms */, 30 /* Hz */); + EXPECT_EQ(10, static_cast<const WebGestureEvent*>(gesture_update.get()) + ->data.scroll_update.delta_y); + EXPECT_EQ( + WebInputEvent::GetStaticTimeStampForTests() + + base::TimeDelta::FromMillisecondsD(10 /* ms */), + static_cast<const WebGestureEvent*>(gesture_update.get())->TimeStamp()); + + // Prediction using fixed +3.3ms latency. + gesture_update = CreateGestureScrollUpdate(0, 10, 20 /* ms */); + HandleResampleScrollEvents(gesture_update, 20 /* ms */, 30 /* Hz */); + ASSERT_FLOAT_EQ(10 + 3.3, + static_cast<const WebGestureEvent*>(gesture_update.get()) + ->data.scroll_update.delta_y); + EXPECT_EQ( + WebInputEvent::GetStaticTimeStampForTests() + + base::TimeDelta::FromMillisecondsD(23.3 /* ms */), + static_cast<const WebGestureEvent*>(gesture_update.get())->TimeStamp()); + + // Test kResamplingScrollEventsExperimentalLatencyVariable + InitLinearResamplingTest(true); + SendGestureScrollBegin(); + + // Send 1st GSU, no prediction available. + gesture_update = CreateGestureScrollUpdate(0, 10, 10 /* ms */); + HandleResampleScrollEvents(gesture_update, 10 /* ms */, 60 /* Hz */); + EXPECT_EQ(10, static_cast<const WebGestureEvent*>(gesture_update.get()) + ->data.scroll_update.delta_y); + EXPECT_EQ( + WebInputEvent::GetStaticTimeStampForTests() + + base::TimeDelta::FromMillisecondsD(10 /* ms */), + static_cast<const WebGestureEvent*>(gesture_update.get())->TimeStamp()); + + // Prediction at 60Hz: uses experimental latency of 0.5 * 1/60 seconds. + // Remember linear resampling has its -5 built-in latency. + gesture_update = CreateGestureScrollUpdate(0, 10, 20 /* ms */); + HandleResampleScrollEvents(gesture_update, 20 /* ms */, 60 /* Hz */); + ASSERT_FLOAT_EQ(10 - 5 + 8.333, + static_cast<const WebGestureEvent*>(gesture_update.get()) + ->data.scroll_update.delta_y); + EXPECT_EQ( + WebInputEvent::GetStaticTimeStampForTests() + + base::TimeDelta::FromMillisecondsD(10 + 10 - 5 + 8.333 /* ms */), + static_cast<const WebGestureEvent*>(gesture_update.get())->TimeStamp()); +} + TEST_F(ScrollPredictorTest, ScrollPredictorNotChangeScrollDirection) { SetUpLSQPredictor(); SendGestureScrollBegin();
diff --git a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc index e8b3b486..e565020 100644 --- a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc +++ b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
@@ -34,7 +34,6 @@ #include "base/allocator/partition_allocator/memory_reclaimer.h" #include "base/allocator/partition_allocator/oom.h" #include "base/allocator/partition_allocator/page_allocator.h" -#include "base/allocator/partition_allocator/partition_alloc_constants.h" #include "base/allocator/partition_allocator/partition_alloc_features.h" #include "base/debug/alias.h" #include "base/no_destructor.h" @@ -49,7 +48,7 @@ const char* const Partitions::kAllocatedObjectPoolName = "partition_alloc/allocated_objects"; -#if defined(PA_HAS_64_BITS_POINTERS) && !ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR +#if ALLOW_PCSCAN // Runs PCScan on WTF partitions. const base::Feature kPCScanBlinkPartitions{"PCScanBlinkPartitions", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -106,8 +105,8 @@ buffer_root_ = buffer_allocator->root(); layout_root_ = layout_allocator->root(); -#if defined(PA_HAS_64_BITS_POINTERS) && !ENABLE_REF_COUNT_FOR_BACKUP_REF_PTR - if (base::features::IsPartitionAllocPCScanEnabled() || +#if ALLOW_PCSCAN + if (base::FeatureList::IsEnabled(base::features::kPartitionAllocPCScan) || base::FeatureList::IsEnabled(kPCScanBlinkPartitions)) { #if !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) fast_malloc_root_->EnablePCScan();
diff --git a/third_party/blink/renderer/platform/wtf/type_traits.h b/third_party/blink/renderer/platform/wtf/type_traits.h index 2425fa6..e3be874 100644 --- a/third_party/blink/renderer/platform/wtf/type_traits.h +++ b/third_party/blink/renderer/platform/wtf/type_traits.h
@@ -134,6 +134,9 @@ cppgc::IsMemberTypeV<T> || cppgc::IsWeakMemberTypeV<T>> {}; +template <typename T> +struct IsMemberType : std::integral_constant<bool, cppgc::IsMemberTypeV<T>> {}; + #else // !USE_V8_OILPAN namespace internal { @@ -226,6 +229,12 @@ WTF::IsSubclassOfTemplate<T, blink::Member>::value || WTF::IsSubclassOfTemplate<T, blink::WeakMember>::value> {}; +template <typename T> +struct IsMemberType : std::integral_constant< + bool, + WTF::IsSubclassOfTemplate<T, blink::Member>::value> { +}; + #endif // !USE_V8_OILPAN // Convenience template wrapping the IsTraceableInCollection template in
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 00d59cd4..31b83ef 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -389,7 +389,7 @@ 'layout_invalidation_reason::.+', 'media_constraints_impl::.+', 'media_element_parser_helpers::.+', - 'native_file_system_error::.+', + 'file_system_access_error::.+', 'network_utils::.+', 'origin_trials::.+', 'paint_filter_builder::.+',
diff --git a/third_party/blink/tools/blinkpy/third_party/wpt/checkout.sh b/third_party/blink/tools/blinkpy/third_party/wpt/checkout.sh index 4f6fba2..1be9072 100755 --- a/third_party/blink/tools/blinkpy/third_party/wpt/checkout.sh +++ b/third_party/blink/tools/blinkpy/third_party/wpt/checkout.sh
@@ -27,7 +27,7 @@ # xargs on some platforms, so we remove those directories first. rm -fr html css # Remove all except white-listed. - comm -23 <(find . -type f | sort) <(cat ../WPTIncludeList | sort) | xargs -d '\n' -n 1 rm + comm -23 <(find . -type f -o -type l | sort) <(cat ../WPTIncludeList | sort) | xargs -d '\n' -n 1 rm find . -empty -type d -delete }
diff --git a/third_party/blink/web_tests/FlagExpectations/composite-after-paint b/third_party/blink/web_tests/FlagExpectations/composite-after-paint index 5e395d7..8dfab63 100644 --- a/third_party/blink/web_tests/FlagExpectations/composite-after-paint +++ b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
@@ -64,6 +64,9 @@ crbug.com/1124979 compositing/video/video-controls-layer-creation.html [ Pass Failure ] crbug.com/1150468 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/animations/one-element-animation.html [ Crash ] +crbug.com/1150468 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation1.html [ Crash ] +crbug.com/1150468 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2.html [ Crash ] +crbug.com/1150468 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation3.html [ Crash ] crbug.com/1150468 virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/animations/one-element-transition.html [ Crash ] crbug.com/1157199 external/wpt/css/css-paint-api/column-count-crash.https.html [ Crash ]
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 6369bfd..5057588 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -70,6 +70,7 @@ crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html [ Failure ] crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-004.html [ Failure ] crbug.com/591099 external/wpt/css/css-flexbox/image-as-flexitem-size-004v.html [ Failure ] +crbug.com/1162704 external/wpt/css/css-flexbox/flex-aspect-ratio-img-row-015.html [ Failure ] ### external/wpt/css/css-fonts/ crbug.com/591099 external/wpt/css/css-fonts/font-features-across-space-1.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials index dc3921b..83b2ed6 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials +++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -27,4 +27,3 @@ # Opt-in origin isolation is intentionally disabled with --disable-site-isolation-trials. virtual/no-auto-wpt-origin-isolation/external/wpt/origin-isolation/* [ Skip ] -virtual/no-auto-wpt-origin-isolation/wpt_internal/origin-isolation/* [ Skip ]
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations index 0ef64b0..28cd6c2a 100644 --- a/third_party/blink/web_tests/LeakExpectations +++ b/third_party/blink/web_tests/LeakExpectations
@@ -178,12 +178,6 @@ # Sheriff 2020-10-08 crbug.com/1136690 [ Linux ] http/tests/inspector-protocol/service-worker/service-worker-fetch-async-stacks.js [ Pass Timeout ] -# Sheriff 2021-01-06 -crbug.com/1163172 [ Linux ] external/wpt/css/selectors/focus-visible-003.html [ Pass Failure ] -crbug.com/1163172 [ Linux ] external/wpt/css/selectors/focus-visible-004.html [ Pass Failure ] -crbug.com/1163172 [ Linux ] external/wpt/css/selectors/focus-visible-015.html [ Pass Failure ] -crbug.com/1163172 [ Linux ] external/wpt/css/selectors/focus-visible-016.html [ Pass Failure ] - ########################################################################### # WARNING: Memory leaks must be fixed asap. Sheriff is expected to revert # # culprit CLs instead of suppressing the leaks. If you have any question, #
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 15fa7904..7fc9eb7af 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1964,9 +1964,7 @@ # with site isolation enabled, we use a different virtual test suite than # not-site-per-process, named no-auto-wpt-origin-isolation. external/wpt/origin-isolation/* [ Skip ] -wpt_internal/origin-isolation/* [ Skip ] virtual/no-auto-wpt-origin-isolation/external/wpt/origin-isolation/* [ Pass ] -virtual/no-auto-wpt-origin-isolation/wpt_internal/origin-isolation/* [ Pass ] # ==== Tests incompatible with the default WPT Origin Isolation end here ==^^ # Tests using testRunner.useUnfortunateSynchronousResizeMode occasionally fail on Win7, @@ -2185,6 +2183,7 @@ # These tests require a physical device connected. external/wpt/webusb/usbDevice_claimInterface-manual.https.html [ Skip ] +external/wpt/webusb/usbDevice_transferIn-manual.https.html [ Skip ] wpt_internal/hid/hidDevice_collections-manual.https.html [ Skip ] external/wpt/serial/serialPort_loopback-manual.https.html [ Skip ] external/wpt/serial/serialPort_loopback_BreakError-manual.https.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 0865e97..31e6d605 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -51,11 +51,6 @@ # WPT Test harness doesn't deal with finding an about:blank ref test crbug.com/1066130 external/wpt/infrastructure/assumptions/blank.html [ Failure ] -# When running under Python 3 on Windows, this test fails to activate backpressure. -crbug.com/1155106 external/wpt/websockets/stream/tentative/backpressure-receive.any.html [ Failure ] -crbug.com/1155106 external/wpt/websockets/stream/tentative/backpressure-receive.any.worker.html [ Failure ] -crbug.com/1155106 external/wpt/websockets/stream/tentative/backpressure-receive.any.sharedworker.html [ Failure ] - # Favicon is not supported by run_web_tests. external/wpt/fetch/metadata/favicon.https.sub.html [ Skip ] @@ -74,6 +69,7 @@ crbug.com/1132260 http/tests/devtools/components/linkifier.js [ Pass Failure ] crbug.com/1132260 http/tests/devtools/console/console-bad-stacktrace.js [ Pass Failure ] crbug.com/1132260 http/tests/devtools/console/console-uncaught-promise.js [ Pass Failure ] +crbug.com/1132260 http/tests/devtools/tracing/timeline-network/timeline-network-resource-details.js [ Pass Failure ] # With --enable-display-compositor-pixel-dump enabled by default, these three # tests fail. See crbug.com/887140 for more info. @@ -1064,7 +1060,6 @@ crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-003.xht [ Crash Failure Timeout ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-width-004.html [ Failure ] crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/abspos-new-width-rebalance.html [ Crash Failure ] -crbug.com/1066616 virtual/layout_ng_block_frag/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ] crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/client-rect-nested.html [ Failure ] crbug.com/1058792 virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated.html [ Failure Crash ] crbug.com/1058792 virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments.html [ Failure Crash ] @@ -1435,6 +1430,8 @@ crbug.com/860211 [ Mac ] external/wpt/editing/run/delete.html [ Failure ] +crbug.com/1002937 external/wpt/editing/run/caret-navigation-around-line-break.html [ Failure ] + crbug.com/821455 editing/pasteboard/drag-files-to-editable-element.html [ Failure ] crbug.com/688613 external/wpt/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html [ Skip ] @@ -2044,9 +2041,6 @@ # Need to support 'direction: rtl' for scroll snap crbug.com/1012173 external/wpt/css/css-scroll-snap/snap-after-initial-layout/direction-rtl.html [ Failure ] -# Hit a DCHECK -crbug.com/918664 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-table-1a.html [ Failure Pass ] - # WebVTT is off because additional padding crbug.com/1012242 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html [ Failure ] crbug.com/1012242 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Failure ] @@ -2473,6 +2467,9 @@ crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Mac10.13 ] external/wpt/x-frame-options/multiple.html [ Timeout ] +crbug.com/626703 [ Mac10.13 ] external/wpt/FileAPI/idlharness.worker.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/table-element-001.html [ Failure ] crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-025.html [ Failure ] crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-026.html [ Failure ] crbug.com/626703 external/wpt/html/interaction/focus/document-level-focus-apis/document-has-system-focus.html [ Timeout ] @@ -2824,6 +2821,7 @@ # See also crbug.com/920100 (sheriff 2019-01-09). crbug.com/626703 external/wpt/referrer-policy/css-integration/svg/external-stylesheet.html [ Timeout Failure ] crbug.com/626703 external/wpt/referrer-policy/css-integration/svg/inline-style.html [ Timeout Failure ] +crbug.com/626703 external/wpt/referrer-policy/css-integration/svg/inline-style-with-differentorigin-base-tag.tentative.html [ Timeout Failure ] crbug.com/626703 external/wpt/referrer-policy/css-integration/svg/internal-stylesheet.html [ Timeout Failure ] crbug.com/626703 external/wpt/referrer-policy/css-integration/svg/presentation-attribute.html [ Timeout Failure ] crbug.com/626703 external/wpt/referrer-policy/css-integration/svg/processing-instruction.html [ Timeout Failure ] @@ -5935,3 +5933,12 @@ crbug.com/1161301 [ Mac10.15 ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Pass Timeout ] crbug.com/1161352 [ Mac10.14 ] virtual/controls-refresh-hc/fast/forms/color-scheme/search/search-appearance-basic.html [ Pass Timeout ] crbug.com/1161352 [ Mac10.14 ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Pass Failure Timeout ] + +# Failing on Webkit Linux Leak only: +crbug.com/1046784 http/tests/devtools/tracing/timeline-receive-response-event.js [ Pass Failure ] + + +# Sheriff 2021-01-08 +crbug.com/1164459 [ Mac ] virtual/synchronous_html_parser/external/wpt/preload/download-resources.html [ Pass Timeout ] +crbug.com/1164568 [ Mac ] external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-popup-same-origin-allow-popups-report-to.https.html [ Pass Failure ] +
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 3899930..36cadaf 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -124,7 +124,6 @@ "inspector-protocol/dom-snapshot", "media/stable", "webexposed", - "wpt_internal/origin-isolation", "compositing/filters" ], "args": ["--stable-release-mode", @@ -518,8 +517,7 @@ }, { "prefix": "no-auto-wpt-origin-isolation", - "bases": ["external/wpt/origin-isolation", - "wpt_internal/origin-isolation"], + "bases": ["external/wpt/origin-isolation"], "args": ["--disable-auto-wpt-origin-isolation"] }, { @@ -812,5 +810,10 @@ "scrollingcoordinator/plugin-with-wheel-handler.html", "scrollingcoordinator/non-fast-scrollable-region-nested.html"], "args": ["--enable-features=WheelEventRegions"] + }, + { + "prefix": "web-app-window-controls-overlay", + "bases": ["external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay.html"], + "args": [ "--enable-features=WebAppWindowControlsOverlay"] } ]
diff --git a/third_party/blink/web_tests/editing/execCommand/indent/indent_blockquote_with_inline_nested_paragraphs.html b/third_party/blink/web_tests/editing/execCommand/indent/indent_blockquote_with_inline_nested_paragraphs.html index 9fed943..f2e1ad1 100644 --- a/third_party/blink/web_tests/editing/execCommand/indent/indent_blockquote_with_inline_nested_paragraphs.html +++ b/third_party/blink/web_tests/editing/execCommand/indent/indent_blockquote_with_inline_nested_paragraphs.html
@@ -151,9 +151,7 @@ '<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">^hello', '<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">', '<foreignobject height="80" width="80" x="20" y="20">Test|</foreignobject>', - '</svg>', - '<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">', - '<foreignobject height="80" width="80" x="20" y="20">Test</foreignobject></svg></blockquote>', + '</svg></blockquote>', '</pre>', ], 'Indent content spanning across different selection contexts');
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 0dd813e2..fc1dcaa2 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -10254,6 +10254,13 @@ null, {} ] + ], + "usbDevice_transferIn-manual.https.html": [ + "bd3df7d54ea63b45920d31d5719782ca1f066911", + [ + null, + {} + ] ] }, "xhr": { @@ -45912,6 +45919,45 @@ {} ] ], + "one-element-three-keyframes-animation1.html": [ + "380c5d32feb0844cbc4edbf91a93db7f4d88051f", + [ + null, + [ + [ + "/css/css-backgrounds/animations/one-element-animation-ref.html", + "==" + ] + ], + {} + ] + ], + "one-element-three-keyframes-animation2.html": [ + "e71b858b6ac11a735672231c85edf7cb511945dd", + [ + null, + [ + [ + "/css/css-backgrounds/animations/one-element-three-keyframes-animation2-ref.html", + "==" + ] + ], + {} + ] + ], + "one-element-three-keyframes-animation3.html": [ + "080ed01b835717fd5cdb052ab592979ac8c707fb", + [ + null, + [ + [ + "/css/css-backgrounds/animations/one-element-animation-ref.html", + "==" + ] + ], + {} + ] + ], "one-element-transition.html": [ "51d3a968c735f78c3ba2b3f0213ec0d2a989ae15", [ @@ -52865,6 +52911,19 @@ {} ] ], + "out-of-flow-in-multicolumn-014.html": [ + "b6cede0400fc8c9fdc4ef136a7d3326056bda482", + [ + null, + [ + [ + "/css/css-break/out-of-flow-in-multicolumn-014-ref.html", + "==" + ] + ], + {} + ] + ], "overflowed-block-with-no-room-after-000.html": [ "084e16fb38de072fb83f92ba01302a2e404cdd97", [ @@ -58835,7 +58894,7 @@ ] ], "content-visibility-003.html": [ - "08eb3a1288b5610cdbefad23f8c02e9e50e4e0b8", + "5109c720b4bb8c91b0dd71e4356cb3d586419cd9", [ null, [ @@ -62509,6 +62568,19 @@ {} ] ], + "flex-aspect-ratio-img-column-018.html": [ + "04b12875c05b6ba2e3871271ec365bfe1d7d345f", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "flex-aspect-ratio-img-row-001.html": [ "14fabf760ca4293abf5af9e618b2e2ed627be2b2", [ @@ -62665,6 +62737,19 @@ {} ] ], + "flex-aspect-ratio-img-row-015.html": [ + "e28829036052006620ae2d00478d12322ce3cdbc", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "flex-base.html": [ "93401d3fe32716ca14a3f7f3be4f0fa64a7fabf2", [ @@ -84486,7 +84571,7 @@ ] ], "clip-path-descendant-text-mutated-001.html": [ - "e41dacc0b54f3f1936d23b3fb6204f394395db37", + "8753a25f1e4e56cb72d3389533ac96c633dda115", [ null, [ @@ -90922,6 +91007,45 @@ {} ] ], + "overflow-clip-margin-004.html": [ + "aab356f487ec4cd6095d011203eedbe494a1b03a", + [ + null, + [ + [ + "/css/css-overflow/overflow-clip-margin-004-ref.html", + "==" + ] + ], + {} + ] + ], + "overflow-clip-margin-005.html": [ + "2d03a969719cd1334e6e6912b553ba05c263d713", + [ + null, + [ + [ + "/css/css-overflow/overflow-clip-margin-005-ref.html", + "==" + ] + ], + {} + ] + ], + "overflow-clip-margin-006.html": [ + "493bcee29f65c6890cec5472ac277adaa662a546", + [ + null, + [ + [ + "/css/css-overflow/overflow-clip-margin-006-ref.html", + "==" + ] + ], + {} + ] + ], "overflow-clip-margin-invalidation.html": [ "d9c87a34a53f17451b0d3ae8c2071971d1df3a94", [ @@ -102639,6 +102763,19 @@ {} ] ], + "table-element-001.html": [ + "fd2dcd81dd90c6d82a3652750cea2370979aff7a", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "zero-or-infinity-001.html": [ "760635c40e8fde8f3514761c77e83385592861b0", [ @@ -147474,7 +147611,7 @@ ] ], "remove-filter-repaint.html": [ - "a9af9db34eeaf10235521514f8c17ceca858924e", + "2e85f9f542a9feb19ab3512d3670cfe89914676b", [ null, [ @@ -147591,7 +147728,7 @@ ] ], "svg-mutation-drop-shadow-color.html": [ - "fe8bf7ec5fe284608a4ba329681a12c17c82437d", + "6db3beb35c593de4f92f9b9f50afa1d3a9c3d5c5", [ null, [ @@ -147604,7 +147741,7 @@ ] ], "svg-mutation-drop-shadow-offset.html": [ - "2d5a12906d89a8fcd09ffb19e310e32da42441a1", + "d67b29820cd111366e751cf2061b36470406b354", [ null, [ @@ -147617,7 +147754,7 @@ ] ], "svg-mutation-function-to-url.html": [ - "61d657bfb2b3f80884a81d7b9dac5597d02dbff3", + "cd2f61f3488d40c3456bbcd72d1bc6d8867a10e6", [ null, [ @@ -147630,7 +147767,7 @@ ] ], "svg-mutation-group-position-changed.html": [ - "5a73f6eefc04343fbe73cfc5ccfdff5b86050f87", + "c83c636d9b1b01907fc8f82a8f660b10fe610be5", [ null, [ @@ -147643,7 +147780,7 @@ ] ], "svg-mutation-group-size-changed.html": [ - "0486ec0806ba697da4ad3d7a62e6f0dcd7d1c2ff", + "755343c2ba78bc671fb7b1dba37278f1b2aa0ca9", [ null, [ @@ -147656,7 +147793,7 @@ ] ], "svg-mutation-group-transform-changed.html": [ - "f0ff16e7c8932f68c5c53955cab4fd500d445401", + "212ecf7b653fbd4e99ecf5790f8ac41225e5bdb4", [ null, [ @@ -147669,7 +147806,7 @@ ] ], "svg-mutation-object-position-changed.html": [ - "76b75fc329868cb1597dd375052653e135c8c3eb", + "2f0225439d7565394d41988637078f94fa6c2a24", [ null, [ @@ -147682,7 +147819,7 @@ ] ], "svg-mutation-object-size-changed.html": [ - "2d55387b73f91b347f5a48e12f256208e2a215b0", + "1604ba9d13b6a41c92482c850d4b692b0d73040f", [ null, [ @@ -147695,7 +147832,7 @@ ] ], "svg-mutation-object-transform-changed.html": [ - "75a82b1d964cc3131322c1e26b193b905cd1f4ef", + "21f5683a2ba12d28c2fc511ce3b55386afc9d616", [ null, [ @@ -147708,7 +147845,7 @@ ] ], "svg-mutation-single-to-multiple-001.html": [ - "13da58c03ac26078fa0ad8be0ccfc690a4717dc3", + "58129dff8f6e2de4d3485680509276f5f6d293b2", [ null, [ @@ -147721,7 +147858,7 @@ ] ], "svg-mutation-single-to-multiple-002.html": [ - "d7769a7cfd6a0986c15a40c0df8ca96a16069c7d", + "918cf7e0e95d8366224075c8c3dcd658febb982a", [ null, [ @@ -147734,7 +147871,7 @@ ] ], "svg-mutation-url-to-function.html": [ - "fb08d8409ed382324c8752f9587c8d3244632a56", + "65b3b817d503562de24a5150453dcca02a984e28", [ null, [ @@ -172382,7 +172519,7 @@ [] ], "META.yml": [ - "8f27e484996c51eb9ebbbd96902fa1f885af7be0", + "7cae5c0f90396f6e3a0bcd5f34935550f08c4b84", [] ], "OWNERS": [ @@ -176808,270 +176945,6 @@ "b6c297cc77ddef6c4b0eae5c94a07d0827de89c7", [] ], - "name0001-expected": [ - "96527926e107477e66ab0386dea671d8973de695", - [] - ], - "name0001-test": [ - "3ce5f5f9824b95711aa93a82c45e39250aa225ed", - [] - ], - "name0002-expected": [ - "d4d3cda811bd744d741d883675d789e124c32449", - [] - ], - "name0002-test": [ - "d6eac8a757af54e177a04bf7d3b15e14080cdc5a", - [] - ], - "name0003-expected": [ - "0c00f45c4a479545f1272b6c7d3312f7b48d658a", - [] - ], - "name0003-test": [ - "7ea96155bd7752a8abffb7a85093fdd3fa19fc93", - [] - ], - "name0004-expected": [ - "b079529aa249748cdf1ada8ce4b99d12952745a7", - [] - ], - "name0004-test": [ - "99f0e61801a92ddc2034fec94fc61b02f1b2baf1", - [] - ], - "name0005-expected": [ - "a0f031bb34ed2284c99cab25c4864f7e55af6522", - [] - ], - "name0005-test": [ - "9e33e0c8e476c24b698b7c8061ea42a585b9ed73", - [] - ], - "name0006-expected": [ - "ee0e7d7c335d08c78793167fd581458b15e6a3ec", - [] - ], - "name0006-test": [ - "fbd03632c61b3df902d75dd8f11dcde5a7cf8634", - [] - ], - "name0007-expected": [ - "6d6e56ebe59b54fc030d7c88c72a142d1e5f7486", - [] - ], - "name0007-test": [ - "d41e64b87ec3d1e45cf0a9020c2a093063f8844f", - [] - ], - "name0008-expected": [ - "a4b8c2428258033c534e7ff05ac967dbe24ed9e9", - [] - ], - "name0008-test": [ - "7afcf700376b02f3a38c12752b0067cc66f3e190", - [] - ], - "name0009-expected": [ - "49506acc24893411e24dd9c63ed25f2b5945052d", - [] - ], - "name0009-test": [ - "f40d2c4d6b9e06be56505acb73594718724e5254", - [] - ], - "name0010-expected": [ - "1e72557892b01144f0cd3051a9a079fcc2253e46", - [] - ], - "name0010-test": [ - "fb4fd921be31471edd70aa0399c011aea48ee36d", - [] - ], - "name0011-expected": [ - "260d7028a0195e1c93da4cb10cac211016856e60", - [] - ], - "name0011-test": [ - "b36b72388f2b3dc6480dd798f57d8ed5624b5ae4", - [] - ], - "name0012-expected": [ - "0a2686a15257f03f02af93c39d410cc070e408fd", - [] - ], - "name0012-test": [ - "6927aac6fa061ad0e0be4f13f4d7c686602aef25", - [] - ], - "name0013-expected": [ - "87dec78b62265dd3dfd115e68ce526aef5213353", - [] - ], - "name0013-test": [ - "59ada98321c69945673b94c2504f81408224325b", - [] - ], - "name0014-expected": [ - "82bfe0e60acd0c9194bbbb5c33a0a4e95686d5fa", - [] - ], - "name0014-test": [ - "a113e99be5e27dd6186d247d5f1fe0f197f1349f", - [] - ], - "name0015-expected": [ - "390b77b30c40d33180bbe2026b052dadd44af527", - [] - ], - "name0015-test": [ - "60fc0746ba258f0b2ea7d20e32625d70f1ea481b", - [] - ], - "name0016-expected": [ - "7d4d9e330792bf536a304785940f865d9cd20aa3", - [] - ], - "name0016-test": [ - "371dbcde6cab2545f54b15d3f797936d39fae3d3", - [] - ], - "name0017-expected": [ - "96527926e107477e66ab0386dea671d8973de695", - [] - ], - "name0017-test": [ - "056143166bd1c31df501c74d13425656a744884c", - [] - ], - "name0018-expected": [ - "96527926e107477e66ab0386dea671d8973de695", - [] - ], - "name0018-test": [ - "e86a48360cf5735c3b0389d0f2d2507ec6c44b43", - [] - ], - "name0019-expected": [ - "8d0bc2d07d699558f0dc68690af76bd9b7f4e430", - [] - ], - "name0019-test": [ - "d48e3f6954a690c35628e3665fa329a67fb76452", - [] - ], - "name0020-expected": [ - "aa9cd6d435cfdb9bd2180bd163e1f1503e6deca0", - [] - ], - "name0020-test": [ - "b84f64d17981f59c5b1e557ba33362e38594e8b8", - [] - ], - "name0021-expected": [ - "206ff76e3e324b0c652024962dce34dd7e4dcf93", - [] - ], - "name0021-test": [ - "56b319e9d491dc99a1434b157803249fe7b4acbb", - [] - ], - "name0022-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "name0022-test": [ - "cc59ff17edabb8466b416dda9b4ed3c2f42a0b80", - [] - ], - "name0023-expected": [ - "5ab27668fdbdd021d29abbda3acd08e94aa92b0b", - [] - ], - "name0023-test": [ - "b7f9cc257d20fbc98b5c12125ee9dde8e4ae9436", - [] - ], - "name0024-expected": [ - "5ac4f2535c81810f380414f3e72ac8d35bfa76b7", - [] - ], - "name0024-test": [ - "da7b696da9129d5762468c0ba2b98d30974664ee", - [] - ], - "name0025-expected": [ - "68c38595db832182a19bf62086972fe2fd1a9295", - [] - ], - "name0025-test": [ - "708f006b9c0777592199ec0e8b333f44894e90fb", - [] - ], - "name0026-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "name0026-test": [ - "bbeb77a029c18442c90d81cd96a3b1eb1aa72170", - [] - ], - "name0027-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "name0027-test": [ - "d222227e6de7ded31c0be0e212f4611035c7ba79", - [] - ], - "name0028-expected": [ - "f14f9930f6b6b11391196c12ceeb6d98723ed2fb", - [] - ], - "name0028-test": [ - "1c197e3324c87aa5364224ecaf029dbf5ae0a7a4", - [] - ], - "name0029-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "name0029-test": [ - "44212468d449cf18fac8987c1f0ba4127e1483ee", - [] - ], - "name0030-expected": [ - "a391380fb666180af1950103f50f584207c75138", - [] - ], - "name0030-test": [ - "cf3ff160f451ac4f53a847942df1b7a3f29861eb", - [] - ], - "name0031-expected": [ - "0cd5a50dd1b4eeda99b236c2716f656c7d1e83a7", - [] - ], - "name0031-test": [ - "9394184904027da428e718414c5ce19d0c17a6c1", - [] - ], - "name0032-expected": [ - "f4f7f3ff4cd4cf9e5c2528f0c082f4486b84c3b6", - [] - ], - "name0032-test": [ - "93fc9752333920c9b70236d7e53dd82199404811", - [] - ], - "name0033-expected": [ - "6e7762e35e375552eecb099f8b05ffa508825dc4", - [] - ], - "name0033-test": [ - "7bbdd89566a0a01d97df5d16b34a9822abeed6e9", - [] - ], "optional-domain0030-expected": [ "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", [] @@ -177111,54 +176984,6 @@ "ordering0001-test": [ "ba6e85c44cdea2aa269ef170fe2d3a4c3a14e1ce", [] - ], - "value0001-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "value0001-test": [ - "38b7dd296e613e2d659a7516f56ea6e00e80a507", - [] - ], - "value0002-expected": [ - "9e96a81e3b4f787a158cd20a10e9defee7446948", - [] - ], - "value0002-test": [ - "bed691f1809cf37eb44c8a1083e9544bf333c03a", - [] - ], - "value0003-expected": [ - "5cc2d467ef724279da03a2af49535aa58382ee40", - [] - ], - "value0003-test": [ - "ce1d455201dbef9b08ff18315d2cceef569d0346", - [] - ], - "value0004-expected": [ - "400030f6f1d38f1833f1d8c960941f842b12a9e8", - [] - ], - "value0004-test": [ - "c569216520ca270f46741ec3ad0acd20bdd77887", - [] - ], - "value0005-expected": [ - "cad285f70867f41fdb4e4439d389b1f8171ee6ce", - [] - ], - "value0005-test": [ - "514c0f125f1f4d9d116d5ccfef3a44998b340869", - [] - ], - "value0006-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "value0006-test": [ - "a939a8229149c1d2311379d1632b47dd184affd8", - [] ] } } @@ -182716,6 +182541,10 @@ "one-element-animation-ref.html": [ "8e0e70ba20e56678753b78c91ba8d02fb195b6cf", [] + ], + "one-element-three-keyframes-animation2-ref.html": [ + "823d8ac3821638dd92cdccbc39497d1cc1dc797a", + [] ] }, "background-332-expected.txt": [ @@ -184258,6 +184087,10 @@ "bc6669e466ba0e4e29bf56b889f59e513f9270c4", [] ], + "out-of-flow-in-multicolumn-014-ref.html": [ + "6388a1864443571ea24e6174459c5205440ab030", + [] + ], "parsing": { "box-decoration-break-computed-expected.txt": [ "2bf7d5cfd390f7f989cffa3197643b87699fdefe", @@ -196987,7 +196820,7 @@ [] ], "list-style-image-zoom-dynamic-ref.html": [ - "9c4d876c4ad8a189f83abc26059744315c66dc3c", + "09baac4663a16dbc43b6147848a2b16b39b71815", [] ], "list-style-type-string-001-ref.html": [ @@ -198676,6 +198509,18 @@ "cf6b55a2f91d52a669ab64ce7f2ee66ae3abb139", [] ], + "overflow-clip-margin-004-ref.html": [ + "3cc79ed480e68fa19286b694d9d96514992a61ff", + [] + ], + "overflow-clip-margin-005-ref.html": [ + "84110e57792086613515a824483fa0b9a8d75ff0", + [] + ], + "overflow-clip-margin-006-ref.html": [ + "cf6b55a2f91d52a669ab64ce7f2ee66ae3abb139", + [] + ], "overflow-clip-margin-invalidation-ref.html": [ "1ec2a5ce0a21c8dd578b3fcfde702307e4e2a9a8", [] @@ -200359,7 +200204,7 @@ [] ], "nested-overflow-subtree-layout-ref.html": [ - "77b0de7f0ba16a35398c3a8d583c5bda32bf16af", + "003cb9b68a15dae2c4888e2d988834fdd92793e6", [] ], "support": { @@ -213464,7 +213309,7 @@ ] }, "requirements.txt": [ - "725ddd9e85ee202cf7fc9d3072a770a6351cdb71", + "28b20408eb011fbd2fad6665ed36b4bb8a4f5685", [] ], "selectors": { @@ -234971,6 +234816,10 @@ ] }, "unhandled-promise-rejections": { + "promise-rejection-event-during-parse-expected.txt": [ + "89c041abb5d763c4a2c2468a412619eb5fac0a4f", + [] + ], "support": { "promise-access-control.py": [ "cf8ed5e49244a614dbe44acf2dc9146629e79290", @@ -236414,7 +236263,7 @@ [] ], "html.idl": [ - "dfe4e1e586b5a2b5c5ba070f3c73bc55061e999d", + "5b30344ab7db4d3374c07a02a7b9453d18cccdf9", [] ], "idle-detection.tentative.idl": [ @@ -236798,7 +236647,7 @@ [] ], "webhid.idl": [ - "ad2f0b78653be7c583216c782f1a4125275b964c", + "ffc960938c9221c9bb8cca295997271e2ec394fe", [] ], "webmidi.idl": [ @@ -237107,7 +236956,7 @@ ] }, "lint.ignore": [ - "049d4f81235cbe0538f41e7066c9cd98405b6a68", + "27ba5497065c7858248f99a063ffe57b932c0df0", [] ], "loading": { @@ -241148,30 +240997,6 @@ [] ], "pointerlock": { - "pointerevent_coordinates_when_locked.html.ini": [ - "04c0f72c7d99bc37a364e7192e7e65a1e6827f60", - [] - ], - "pointerevent_getCoalescedEvents_when_pointerlocked.html.ini": [ - "9e125839696524cc24cb3f91655765624854e1f8", - [] - ], - "pointerevent_movementxy_with_pointerlock.html.ini": [ - "d22487b5371f040fd3edb99ac345b2a38cc58705", - [] - ], - "pointerevent_pointerlock_after_pointercapture.html.ini": [ - "dc1a38a96f354e88d08d45bfa692583cb4dcc4ac", - [] - ], - "pointerevent_pointermove_in_pointerlock.html.ini": [ - "7c4043d0fa0abe2ae9d15c437aac8b617a3c5512", - [] - ], - "pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini": [ - "9d0b178aa192acc5ac1428b67482728b9ee676ee", - [] - ], "resources": { "pointerevent_movementxy-iframe.html": [ "627af3b61cad74bb112558169b1e66f6a24b1129", @@ -241309,11 +241134,11 @@ [] ], "focus-page-with-button.html": [ - "2bf0ddb93933a492b209b28d8767e3885350496f", + "067221965100181411b1e876c125d59822605a38", [] ], "focus-page-with-x-origin-iframe.sub.html": [ - "7c9df9dba643a8202529d9f0b154a504535d7bcb", + "9807898a3543eca03ed03432442fc9caad2b9553", [] ], "invalid.asis": [ @@ -243809,7 +243634,7 @@ [] ], "webusb-test.js": [ - "8bccfd1f724cc622619e024b95c7068b2899ff07", + "f6a793dc956a0ba9f8d23fc0023eaf98680b1fd5", [] ], "webusb-test.js.headers": [ @@ -247804,6 +247629,10 @@ [] ], "animations": { + "animate-marker-orient-from-auto-to-auto-start-reverse-expected.txt": [ + "7b490dde326183f19676284bc3207c3d00598b5f", + [] + ], "animateMotion-base-expected.txt": [ "729d384cc2270a4d343b0a4af5c07551af9f6c92", [] @@ -248761,6 +248590,10 @@ "48365c539fffe9049f04e809ddb52a32a629703a", [] ], + "SVGAnimatedEnumeration-SVGMarkerElement-expected.txt": [ + "ae149d8d347a083b30f4eb831ec4990021cc3a43", + [] + ], "SVGAnimatedRect-expected.txt": [ "cdc41ca795298f0cac130afa8ea317a1403ab290", [] @@ -249121,11 +248954,11 @@ [] ], "lint.py": [ - "38225ec958862ec793656013226cc03d469b853d", + "1872e62725993bd16ee7c57236b40dd000731e74", [] ], "rules.py": [ - "f6e23aef58ad3a97a0ba8bf5514cb802f2e0f31b", + "b389e3d8f0854cc34c84e7cc98c7096fefd2f2ee", [] ] }, @@ -249173,7 +249006,7 @@ [] ], "sourcefile.py": [ - "6e90ac05475fc656de22befc5addc3fd5f51e913", + "ce81c625bb805a329d9c1a9b764b15d98a57a26c", [] ], "testpaths.py": [ @@ -249307,7 +249140,7 @@ [] ], "runner.js": [ - "27946e139b9aa3b806a1ad245153988cf78f7442", + "1577228b2fbca0038d3cc74b93087fabf6059457", [] ], "update_manifest.py": [ @@ -259394,7 +259227,7 @@ [] ], "authentication.py": [ - "25a8eb95d11402e2aa97bc3d70e0464330cbb129", + "e61eef0696ca2145cffdfa87a02b7aa0e8817867", [] ], "defaults.py": [ @@ -259816,7 +259649,7 @@ [] ], "RTCRtpTransceiver-stop-expected.txt": [ - "596e3c4a758c5b8e097b2636d39d59c64927781a", + "542849df0ce8e7af3fa1e76c279bb926f14f7b1b", [] ], "RTCRtpTransceiver.https-expected.txt": [ @@ -260411,7 +260244,7 @@ [] ], "send-backpressure_wsh.py": [ - "40905c31cff4c9930320205149a47ef416b7951c", + "e59070c3002e06f2566a53f091709eaa5f498e58", [] ], "set-cookie-secure_wsh.py": [ @@ -261311,7 +261144,7 @@ [] ], "usb-helpers.js": [ - "bb6745124788ba3626b2bda563693d5e1c51c936", + "8525da74b559cb776b2a91529c5e47a8c47984d3", [] ] }, @@ -288711,28 +288544,12 @@ {} ] ], - "name-tests.html": [ - "e962539b0fbdcde83859496cc2b815194c7596a0", - [ - null, - { - "timeout": "long" - } - ] - ], "ordering-tests.html": [ "4dce985ac71a0d48538dc7376dff7102a0fcd78f", [ null, {} ] - ], - "value-tests.html": [ - "0d8daae165cbd2c33a4051048047ea459ad97b3c", - [ - null, - {} - ] ] }, "meta-blocked.html": [ @@ -288744,7 +288561,7 @@ ], "name": { "name.html": [ - "18fd87659442f95157d233a2e99b2704c8ea8f03", + "39fdc75d5992ad04c35f1f19c4613e2f35762fa2", [ null, { @@ -289159,7 +288976,7 @@ }, "value": { "value.html": [ - "c473a6bf7bd256586d74f2a6515cd096b93974e1", + "c1910839aa570d1de0a6eb2ee5b0d889d75224ff", [ null, { @@ -301781,6 +301598,13 @@ {} ] ], + "highlight-pseudos-computed.html": [ + "ec3532db6a9f47965fb4819b5cfcbd3e55157f5a", + [ + null, + {} + ] + ], "idlharness.html": [ "514d31f6b39ef066df52c113e68232119cb6927d", [ @@ -301849,6 +301673,13 @@ ] ], "parsing": { + "highlight-pseudos.html": [ + "aa3c4e20aa2d15b267cddfb76163d8edf9ff03c8", + [ + null, + {} + ] + ], "marker-supported-properties-in-animation.html": [ "df0e9bc6d34b3e8828d886bbe7ad3359f4178756", [ @@ -301863,13 +301694,6 @@ {} ] ], - "target-text.html": [ - "37cbdd4c15aedaa09d62af71545b7d9760a207ff", - [ - null, - {} - ] - ], "tree-abiding-pseudo-elements.html": [ "05c23a3bc143ce2a005b3686af2eae2cb60cb7ba", [ @@ -301878,13 +301702,6 @@ ] ] }, - "target-text-computed.html": [ - "429903052ed196d272464b6a5838c2d3a18cd46e", - [ - null, - {} - ] - ], "text-selection.html": [ "42acd0aa52a25b3f92c0cfc47089fcd79c71c75c", [ @@ -315408,7 +315225,14 @@ ] ], "focus-in-focus-event-001.html": [ - "0639b7785eb3c3eacb4e4478557caf80a3f7511e", + "2f9a3dde5783f09c102b6fd74aaa7f2950cfdcd3", + [ + null, + {} + ] + ], + "focus-in-focusin-event-001.html": [ + "e18401fcf37747f96334bba996dd307f5b71d44e", [ null, {} @@ -315434,7 +315258,7 @@ ] ], "focus-visible-003.html": [ - "aa73b4da44f0e831dbbd5516bd71daef245e7e65", + "3076823f703c5fe4a5822e9d2271034f94ebc829", [ null, { @@ -315443,7 +315267,7 @@ ] ], "focus-visible-004.html": [ - "b30b9e2938ab4ed4e3972340953649c21e0085d9", + "f1274b61ee9cec65a517a877b3fbcf967632ce04", [ null, { @@ -315527,7 +315351,7 @@ ] ], "focus-visible-015.html": [ - "685baeb7bad07ad45a8efda163dba5db94b9ffe8", + "98e44005c7604a764769472acac203e00c16023c", [ null, { @@ -315536,7 +315360,7 @@ ] ], "focus-visible-016.html": [ - "a65e5a5b3dd6aa2be7aa733d01725242e8b01cc4", + "080787fb1ee9f4ad96d8dacba051601421435932", [ null, { @@ -316119,7 +315943,7 @@ ] ], "parse-not.html": [ - "e96db5a83ce021dde4a3b20de6a80374e7fd4914", + "f455059251ae99264ce928338846980357ba9ca7", [ null, {} @@ -338962,7 +338786,7 @@ ] }, "request-bad-port.any.js": [ - "afb02aea8b2ee978296607c2b2429bac6dc40bc3", + "31a08eaa929bea49b75cee971e0f9342045dcd8f", [ "fetch/api/request/request-bad-port.any.html", { @@ -381799,10 +381623,14 @@ ] }, "atob": { - "base64.html": [ - "61c3667dceeb136e03abcec1d4835ea852e0018b", + "base64.any.js": [ + "7f433f4d8a9ee2e317def3327c5882938cbd6732", [ - null, + "html/webappapis/atob/base64.any.html", + {} + ], + [ + "html/webappapis/atob/base64.any.worker.html", {} ] ] @@ -383520,6 +383348,13 @@ {} ] ], + "promise-rejection-event-during-parse.html": [ + "160dad9b36bd38de015c9dc82fd2410c5276cc8d", + [ + null, + {} + ] + ], "promise-rejection-events-attached-in-event.html": [ "b151bd812f9b92a5398923624d6e4601552de095", [ @@ -383752,31 +383587,47 @@ {} ] ], - "negative-setinterval.html": [ - "663872cd1f3850ffccbc199f6e92267bfcf65652", + "negative-setinterval.any.js": [ + "5646140c2a45f30e2002c8285777d672e378c119", [ - null, + "html/webappapis/timers/negative-setinterval.any.html", + {} + ], + [ + "html/webappapis/timers/negative-setinterval.any.worker.html", {} ] ], - "negative-settimeout.html": [ - "b59fc8f22984c8329119763ea68214d2e46fa8a1", + "negative-settimeout.any.js": [ + "da191f1bf00d92663fb70cedb459eb429bf9aa68", [ - null, + "html/webappapis/timers/negative-settimeout.any.html", + {} + ], + [ + "html/webappapis/timers/negative-settimeout.any.worker.html", {} ] ], - "type-long-setinterval.html": [ - "7fb81ff29ac3a99e2408b51e4cfe7c7b5bd49e17", + "type-long-setinterval.any.js": [ + "164527f18b1e6f6b41affc46ee171b08137f509c", [ - null, + "html/webappapis/timers/type-long-setinterval.any.html", + {} + ], + [ + "html/webappapis/timers/type-long-setinterval.any.worker.html", {} ] ], - "type-long-settimeout.html": [ - "4dc7d17ea5f13f9bb379d4acae89263da138c0c9", + "type-long-settimeout.any.js": [ + "9092f13f3b1000067fea2b31b61423f06cfc945a", [ - null, + "html/webappapis/timers/type-long-settimeout.any.html", + {} + ], + [ + "html/webappapis/timers/type-long-settimeout.any.worker.html", {} ] ] @@ -399149,7 +399000,7 @@ ] ], "avoid-prefetching-on-text-plain.html": [ - "487cbbcaba75285ae6dd381fefe39b061ae6464f", + "45564e1bfaca07f2ea21bf460132c7f18ed6a24a", [ null, {} @@ -402822,6 +402673,13 @@ {} ] ], + "inline-style-with-differentorigin-base-tag.tentative.html": [ + "091afd832ab35a76136b4242df1c1ec73aee109d", + [ + null, + {} + ] + ], "inline-style.html": [ "1e94b3df2cd9093dc489c46a079cd14adaffb90e", [ @@ -402866,6 +402724,13 @@ {} ] ], + "inline-style-with-differentorigin-base-tag.tentative.html": [ + "9a8bc6da418bc7302138daba8cf06cb449bd2dfe", + [ + null, + {} + ] + ], "inline-style.html": [ "2d4725e0bb1454035e560ad8218ccbbc0eb98107", [ @@ -423961,7 +423826,7 @@ ] ], "animate-marker-orient-from-auto-to-auto-start-reverse.html": [ - "fedfe4a8c2818a335fe26ff5a7e6cce52abef02a", + "b7a4e68562da576fc2ea0221c51f19afaa879ad7", [ null, {} @@ -426472,7 +426337,7 @@ ] ], "SVGAnimatedEnumeration-SVGMarkerElement.html": [ - "7ac884ae3e5052d40a60521a5c6b91eb854b4e4c", + "dfc9dd248007c9e87ca8177167f4b4f1cf9f2e75", [ null, {} @@ -429832,17 +429697,25 @@ {} ] ], - "url-constructor.html": [ - "7ddcdc88170c202347b072d88f6a47477a776045", + "url-constructor.any.js": [ + "153d985ff6796183fd01b66437549544c497d02b", [ - null, + "url/url-constructor.any.html", + {} + ], + [ + "url/url-constructor.any.worker.html", {} ] ], - "url-origin.html": [ - "fccb643ed6c8069cc61fee276fbf5c69b3828850", + "url-origin.any.js": [ + "d9ef64c73b8bcc7fe37d94e6b77a5b8d967a0f0f", [ - null, + "url/url-origin.any.html", + {} + ], + [ + "url/url-origin.any.worker.html", {} ] ], @@ -437597,7 +437470,7 @@ ] ], "video-decoder.any.js": [ - "2dd85ad955b7321167b9809007d1badea5780555", + "33ea2dbe375d5446e68e90405f9867ce8f7fb272", [ "webcodecs/video-decoder.any.html", { @@ -439457,7 +439330,7 @@ ] ], "RTCRtpTransceiver-stop.html": [ - "4f3a9ce85fa244bc673447fa389f44bdc381b230", + "766b34d7b120f0e214ac028cd1f5b82c9c78062c", [ null, {} @@ -440392,7 +440265,7 @@ ] ], "Create-blocked-port.any.js": [ - "84728c0e5675900bb6a0457196d5aee3629a8699", + "0e8938a3d56828fd0263e6a98e2a2e9eddd31512", [ "websockets/Create-blocked-port.any.html", { @@ -443611,7 +443484,7 @@ ] ], "backpressure-receive.any.js": [ - "17c75bd51cd204f3910b757cfda1e0a9fd0f5394", + "662a6a2871b8f0c390c5ba1dfb85f742a6549186", [ "websockets/stream/tentative/backpressure-receive.any.html", {
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml index 8f27e48..7cae5c0f 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/META.yml
@@ -1,3 +1 @@ spec: https://w3c.github.io/webcrypto/ -suggested_reviewers: - - jimsch
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation1.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation1.html new file mode 100644 index 0000000..380c5d3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation1.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color"> +<link rel="match" href="one-element-animation-ref.html"> +<style> +.container { + width: 100px; + height: 100px; + background-color: green; + /* Use a long animation that start at 5% progress where the slope of the + selected timing function is zero. By setting up the animation in this way, + we accommodate lengthy delays in running the test without a potential drift + in the animated property value. This is important for avoiding flakes, + especially on debug builds. The screenshots are taken as soon as the + animation is ready, thus the long animation duration has no bearing on + the actual duration of the test. */ + animation: bgcolor 1000000s cubic-bezier(0,1,1,0) -50000s; +} +@keyframes bgcolor { + 0% { background-color: rgb(0, 200, 0); } + 10% { + background-color: rgb(200, 0, 0); + animation-timing-function: cubic-bezier(0,1,1,0); + } + 100% { + background-color: rgb(0, 0, 200); + animation-timing-function: cubic-bezier(0,1,1,0); + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<body> +<div class="container"></div> + +<script> +// This test and the "one-element-three-keyframes-animation2.html" ensure that +// we select the correct start and end keyframes for interpolation. In this +// test, the start delay of the animation makes it jump to 5% right away, and in +// the "one-element-three-keyframes-animation2.html" the start delay makes it +// jump to 50%. So for this test, we would choose the keyframes at 0% and 10% +// for interpolation, where for the other test it would be 10% and 100%. +document.getAnimations()[0].ready.then(() => { + takeScreenshot(); +}); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2-ref.html new file mode 100644 index 0000000..823d8ac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<body> + <canvas id="canvas" width="100" height="100"></canvas> +</body> +<script> + var canvas = document.getElementById('canvas'); + var ctx = canvas.getContext('2d'); + ctx.fillStyle = 'rgb(100, 0, 100)'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2.html new file mode 100644 index 0000000..e71b858 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation2.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color"> +<link rel="match" href="one-element-three-keyframes-animation2-ref.html"> +<style> +.container { + width: 100px; + height: 100px; + background-color: green; + /* Use a long animation that start at 50% progress where the slope of the + selected timing function is zero. By setting up the animation in this way, + we accommodate lengthy delays in running the test without a potential drift + in the animated property value. This is important for avoiding flakes, + especially on debug builds. The screenshots are taken as soon as the + animation is ready, thus the long animation duration has no bearing on + the actual duration of the test. */ + animation: bgcolor 1000000s cubic-bezier(0,1,1,0) -500000s; +} +@keyframes bgcolor { + 0% { background-color: rgb(0, 200, 0); } + 10% { + background-color: rgb(200, 0, 0); + animation-timing-function: cubic-bezier(0,1,1,0); + } + 100% { + background-color: rgb(0, 0, 200); + animation-timing-function: cubic-bezier(0,1,1,0); + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<body> +<div class="container"></div> + +<script> +// The start delay of the animation makes it jump 50% of the animation, which +// means we would select the keyframes at 10% and 100% for animation. The +// progress would be (0.5-0.1) / (1-0.1) = 0.44. So a timing function input of +// 0.44 results in an output of 0.5. +document.getAnimations()[0].ready.then(() => { + takeScreenshot(); +}); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation3.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation3.html new file mode 100644 index 0000000..080ed01 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/animations/one-element-three-keyframes-animation3.html
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://drafts.csswg.org/css-backgrounds-3/#background-color"> +<link rel="match" href="one-element-animation-ref.html"> +<style> +.container { + width: 100px; + height: 100px; + background-color: green; + /* Use a long animation that start at 5% progress where the slope of the + selected timing function is zero. By setting up the animation in this way, + we accommodate lengthy delays in running the test without a potential drift + in the animated property value. This is important for avoiding flakes, + especially on debug builds. The screenshots are taken as soon as the + animation is ready, thus the long animation duration has no bearing on + the actual duration of the test. */ + animation: bgcolor 1000000s cubic-bezier(0,1,1,0) -50000s; +} +@keyframes bgcolor { + 10% { + background-color: rgb(200, 0, 0); + animation-timing-function: cubic-bezier(0,1,1,0); + } + 0% { background-color: rgb(0, 200, 0); } + 100% { + background-color: rgb(0, 0, 200); + animation-timing-function: cubic-bezier(0,1,1,0); + } +} +</style> +<script src="/common/reftest-wait.js"></script> +<body> +<div class="container"></div> + +<script> +document.getAnimations()[0].ready.then(() => { + takeScreenshot(); +}); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-014-ref.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-014-ref.html new file mode 100644 index 0000000..6388a186 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-014-ref.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<style> +div { + height: 300px; + width: 300px; + background-color: green; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-014.html b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-014.html new file mode 100644 index 0000000..b6cede0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-014.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link rel="help" href="https://www.w3.org/TR/css-position-3/#abspos-breaking"> +<!-- This test requires a 300px tall multicolumn to reproduce the issue. --> +<link rel="match" href="out-of-flow-in-multicolumn-014-ref.html"> +<!-- Fragmented OOF element with block-size percentage resolution and overflow. --> +<style> + #multicol { + columns: 2; + width: 300px; + height: 300px; + column-fill: auto; + column-gap: 0px; + background-color: red; + } + .rel { + position: relative; + } + .abs { + position: absolute; + top: 0px; + width: 150px; + height: 150px; + background: green; + } +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div id="multicol"> + <div style="width: 150px; height: 450px; background-color: green;"></div> + <div class="rel"> + <div class="abs"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-003.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-003.html index 08eb3a1..5109c72 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-003.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-003.html
@@ -6,8 +6,6 @@ <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> <link rel="match" href="content-visibility-003-ref.html"> <meta name="assert" content="content-visibility container is not breakable"> -<script src="/common/reftest-wait.js"></script> -<script src="resources/utils.js"></script> <style> #container {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-018.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-018.html new file mode 100644 index 0000000..04b12875 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-018.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title>SVG as flex item</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-main-item" title="Part E"> +<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#min-max-widths"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="Flex base size of svg item with aspect ratio + no intrinsic width or height honors transferred max-width." /> + +<p>Test passes if there is a filled green square.</p> + +<div style="display: flex; flex-direction: column; align-items: flex-start; width: 200px;"> + <svg viewBox="0 0 1 1" style="max-width: 100px; background: green;"></svg> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-row-015.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-row-015.html new file mode 100644 index 0000000..e288290 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-row-015.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title>SVG as flex item</title> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#algo-main-item" title="Part E"> +<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#min-max-widths"> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<meta name="assert" content="Flex base size of svg item with aspect ratio + no intrinsic width or height honors transferred max-height." /> + +<p>Test passes if there is a filled green square.</p> + +<div style="display: flex; align-items: flex-start; height: 200px;"> + <svg viewBox="0 0 1 1" style="max-height: 100px; background: green;"></svg> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-lists/list-style-image-zoom-dynamic-ref.html b/third_party/blink/web_tests/external/wpt/css/css-lists/list-style-image-zoom-dynamic-ref.html index 9c4d876..09baac4 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-lists/list-style-image-zoom-dynamic-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-lists/list-style-image-zoom-dynamic-ref.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<html class="reftest-waitt"> +<html class="reftest-wait"> <meta charset="utf-8"> <title>CSS Reference: Image list markers with dynamic zoom</title> <link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-descendant-text-mutated-001.html b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-descendant-text-mutated-001.html index e41dacc..8753a25 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-descendant-text-mutated-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/clip-path/clip-path-descendant-text-mutated-001.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<html class="reftest-wait"> <title>CSS Masking: Test ancestors update as text descendants change</title> <link rel="author" title="Fredrik Söderquist" href="mailto:fs@opera.com"> <link rel="help" href="https://drafts.fxtf.org/css-masking-1/#the-clip-path">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-004-ref.html new file mode 100644 index 0000000..3cc79ed --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-004-ref.html
@@ -0,0 +1,32 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Verifies overflow-clip-margin extends outside bounds with contain: paint</title> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow-clip-margin"> +<link rel="author" title="Scott Violet" href="mailto:sky@chromium.org"> +<style> + .container { + display: flex; + } + .parent { + position: relative; + top: -10px; + left: -10px; + width: 120px; + height: 120px; + flex: none; + background-color: green; + } + .spacer { + flex: none; + height: 100px; + width: 100px; + } + +</style> +<p>You should see two green squares touching each other. The one on the + right should be slightly larger.</p> +<div class="spacer"></div> +<div class="container"> + <div class="spacer" style="background-color: green"></div> + <div class="parent"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-004.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-004.html new file mode 100644 index 0000000..aab356f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-004.html
@@ -0,0 +1,42 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Verifies overflow-clip-margin extends outside bounds with contain: paint</title> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow-clip-margin"> +<link rel="author" title="Scott Violet" href="mailto:sky@chromium.org"> +<link rel="match" href="overflow-clip-margin-004-ref.html"> +<style> + .container { + display: flex; + } + .parent { + width: 100px; + height: 100px; + flex: none; + contain: paint; + overflow-clip-margin: 10px; + } + .child { + width: 200px; + height: 200px; + position: relative; + top: -50px; + left: -50px; + background-color: green; + } + .spacer { + flex: none; + height: 100px; + width: 100px; + } + +</style> +<p>You should see two green squares touching each other. The one on the + right should be slightly larger.</p> +<div class="spacer"></div> +<div class="container"> + <div class="spacer" style="width: 90px; background-color: green"></div> + <div class="spacer" style="width: 10px"></div> + <div class="parent"> + <div class="child"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-005-ref.html new file mode 100644 index 0000000..84110e57 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-005-ref.html
@@ -0,0 +1,31 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Verifies overflow-clip-margin impacts layout</title> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow-clip-margin"> +<link rel="author" title="Scott Violet" href="mailto:sky@chromium.org"> +<style> + .scroller { + overflow: auto; + width: 100px; + height: 100px; + } + .child { + position: relative; + width: 110px; + height: 110px; + background-color: green; + } +</style> +<p>You should see a green box with scrollbars.</p> +<div class="scroller"> + <div class="child"></div> +</div> + +<p>You should see a green box with scrollbars.</p> +<div class="scroller"> + <div class="child" style="width: 150px; height: 150px"></div> +</div> + +<p>You should see a green box with no scrollbars.</p> +<div class="scroller" style="background-color: green"> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-005.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-005.html new file mode 100644 index 0000000..2d03a96 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-005.html
@@ -0,0 +1,46 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Verifies overflow-clip-margin impacts layout</title> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow-clip-margin"> +<link rel="author" title="Scott Violet" href="mailto:sky@chromium.org"> +<link rel="match" href="overflow-clip-margin-005-ref.html"> +<style> + .scroller { + overflow: auto; + width: 100px; + height: 100px; + } + .parent { + width: 100px; + height: 100px; + contain: paint; + overflow-clip-margin: 10px; + } + .child { + width: 200px; + height: 200px; + position: relative; + top: -50px; + left: -50px; + background-color: green; + } +</style> +<p>You should see a green box with scrollbars.</p> +<div class="scroller"> + <div class="parent"> + <div class="child"></div> + </div> +</div> + +<p>You should see a green box with scrollbars.</p> +<div class="scroller"> + <div class="parent" style="overflow-clip-margin: 100px"> + <div class="child"></div> + </div> +</div> + +<p>You should see a green box with no scrollbars.</p> +<div class="scroller"> + <div class="parent" style="background-color: green"> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-006-ref.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-006-ref.html new file mode 100644 index 0000000..cf6b55a2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-006-ref.html
@@ -0,0 +1,15 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Verifies overflow-clip-margin doesn't impact paint effects</title> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow-clip-margin"> +<link rel="author" title="Scott Violet" href="mailto:sky@chromium.org"> +<style> + .parent { + width: 100px; + height: 100px; + background-color: green; + box-shadow: 20px 20px 5px red; + } +</style> +<p>You should see a green box with a red box shadow. +<div class="parent"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-006.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-006.html new file mode 100644 index 0000000..493bcee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/overflow-clip-margin-006.html
@@ -0,0 +1,18 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Verifies overflow-clip-margin doesn't impact paint effects</title> +<link rel="help" href="https://www.w3.org/TR/css-overflow-3/#propdef-overflow-clip-margin"> +<link rel="author" title="Scott Violet" href="mailto:sky@chromium.org"> +<link rel="match" href="overflow-clip-margin-006-ref.html"> +<style> + .parent { + width: 100px; + height: 100px; + background-color: green; + contain: paint; + overflow-clip-margin: 1px; + box-shadow: 20px 20px 5px red; + } +</style> +<p>You should see a green box with a red box shadow. +<div class="parent"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-pseudos-computed.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-pseudos-computed.html new file mode 100644 index 0000000..ec3532db --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/highlight-pseudos-computed.html
@@ -0,0 +1,25 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Pseudo-Elements Test: highlight selectors getComputedStyle</title> +<link rel="help" href="https://drafts.csswg.org/css-pseudo/#highlight-selectors"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #target::selection, + #target::target-text, + #target::spelling-error, + #target::grammar-error { + background-color: green; + color: lime; + } +</style> +<div id="target"></div> +<script> + for (const pseudo of ["::selection", "::target-text", "::spelling-error", "::grammar-error"]) { + test(() => { + let style = getComputedStyle(target, pseudo); + assert_equals(style.backgroundColor, "rgb(0, 128, 0)", "Background color is green."); + assert_equals(style.color, "rgb(0, 255, 0)", "Color is lime."); + }, `getComputedStyle() for ${pseudo}`); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/parsing/highlight-pseudos.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/parsing/highlight-pseudos.html new file mode 100644 index 0000000..aa3c4e20 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/parsing/highlight-pseudos.html
@@ -0,0 +1,22 @@ +<!doctype html> +<meta charset="utf-8"> +<title>CSS Pseudo-Elements Test: highlight selectors parsing</title> +<link rel="help" href="https://drafts.csswg.org/css-pseudo/#highlight-selectors"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +<script> + for (const pseudo of ["::selection", "::target-text", "::spelling-error", "::grammar-error"]) { + test_valid_selector(`${pseudo}`); + test_valid_selector(`.a${pseudo}`); + test_valid_selector(`div ${pseudo}`); + test_valid_selector(`::part(my-part)${pseudo}`); + + test_invalid_selector(`::before${pseudo}`); + test_invalid_selector(`${pseudo}.a`); + test_invalid_selector(`${pseudo} div`); + test_invalid_selector(`${pseudo}::after`); + test_invalid_selector(`${pseudo}:hover`); + test_invalid_selector(`:not(${pseudo})`); + } +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/parsing/target-text.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/parsing/target-text.html deleted file mode 100644 index 37cbdd4..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/parsing/target-text.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!doctype html> -<meta charset="utf-8"> -<title>CSS Pseudo-Elements Test: ::target-text parsing</title> -<link rel="help" href="https://drafts.csswg.org/css-pseudo/#selectordef-target-text"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/css/support/parsing-testcommon.js"></script> -<script> - test_valid_selector("::target-text"); - test_valid_selector(".a::target-text"); - test_valid_selector("div ::target-text"); - test_valid_selector("::part(my-part)::target-text"); - - test_invalid_selector("::before::target-text"); - test_invalid_selector("::target-text.a"); - test_invalid_selector("::target-text div"); - test_invalid_selector("::target-text::after"); - test_invalid_selector("::target-text:hover"); - test_invalid_selector(":not(::target-text)"); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/target-text-computed.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/target-text-computed.html deleted file mode 100644 index 42990305..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/target-text-computed.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!doctype html> -<meta charset="utf-8"> -<title>CSS Pseudo-Elements Test: ::target-text getComputedStyle</title> -<link rel="help" href="https://drafts.csswg.org/css-pseudo/#selectordef-target-text"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<style> - #target::target-text { - background-color: green; - } - #target::target-text { - color: lime; - } -</style> -<div id="target"></div> -<script> - test(() => { - let style = getComputedStyle(target, "::target-text"); - assert_equals(style.backgroundColor, "rgb(0, 128, 0)", "Background color is green."); - assert_equals(style.color, "rgb(0, 255, 0)", "Color is lime."); - }, "getComputedStyle() for ::target-text"); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-ref.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-ref.html index 77b0de7f..003cb9b6 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-anchoring/nested-overflow-subtree-layout-ref.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<html class="reftest-wait"> <head> <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org"> <link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/"> @@ -36,7 +37,7 @@ requestAnimationFrame(() => { requestAnimationFrame(() => { outer.scrollTo(0, 70); - document.documentElement.removeAttribute("class"); + takeScreenshot(); }); }); };
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/table-element-001.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/table-element-001.html new file mode 100644 index 0000000..fd2dcd8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/table-element-001.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<title>CSS aspect-ratio: aspect-ratio shouldn't apply to internal table boxes</title> +<link rel="author" title="mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht" /> +<style> +table { + border-collapse: collapse; +} +th, td { + padding: 0px; +} +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<!-- aspect-ratio shouldn't apply to internal table boxes --> +<table> + <tr> + <th style='background: green; width: 100px; aspect-ratio: 1/1;'></th> + <td style='background: red; height: 50px; aspect-ratio: 4/1;'></td> + </tr> +</table> +<!-- aspect-ratio should apply to the table element --> +<table style='background: green; width: 100px; aspect-ratio: 2/1;'></table>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/remove-filter-repaint.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/remove-filter-repaint.html index a9af9db3..2e85f9f5 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/remove-filter-repaint.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/remove-filter-repaint.html
@@ -1,4 +1,5 @@ <!DOCTYPE html> +<html class="reftest-wait"> <html> <head> <title>CSS Filters: Repaint a compositing layer</title>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-color.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-color.html index fe8bf7ec..6db3beb 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-color.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-color.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing color of drop-shadow() function on an SVG element</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-offset.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-offset.html index 2d5a1290..d67b2982 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-offset.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-drop-shadow-offset.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing offset of drop-shadow() function on an SVG element</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-function-to-url.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-function-to-url.html index 61d657bf..cd2f61f 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-function-to-url.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-function-to-url.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: switching from hue-rotate() to url() on an SVG element</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#filter-functions">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-position-changed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-position-changed.html index 5a73f6e..c83c636 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-position-changed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-position-changed.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing the position of an SVG group with filter</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-size-changed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-size-changed.html index 0486ec0..755343c 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-size-changed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-size-changed.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing the size of an SVG group with filter</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-transform-changed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-transform-changed.html index f0ff16e7..212ecf7 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-transform-changed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-group-transform-changed.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing the transform of an SVG group with filter</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-position-changed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-position-changed.html index 76b75fc..2f02254 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-position-changed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-position-changed.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing the position of an SVG element with filter</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-size-changed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-size-changed.html index 2d55387b..1604ba9 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-size-changed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-size-changed.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing the size of an SVG element with filter</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-transform-changed.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-transform-changed.html index 75a82b1..21f5683 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-transform-changed.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-object-transform-changed.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: changing the transform of an SVG element with filter</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-001.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-001.html index 13da58c..58129df 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-001.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-001.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: extending the filter chain with an additional function on SVG element</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-002.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-002.html index d7769a7..918cf7e0 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-002.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-single-to-multiple-002.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: extending the filter chain with an additional function on SVG element</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#funcdef-filter-drop-shadow">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-url-to-function.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-url-to-function.html index fb08d840..65b3b81 100644 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-url-to-function.html +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-mutation-url-to-function.html
@@ -1,4 +1,5 @@ <!doctype html> +<html class="reftest-wait"> <title>Filter Effects: switching from url() to hue-rotate() on an SVG element</title> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#FilterProperty"> <link rel="help" href="https://drafts.fxtf.org/filter-effects-1/#filter-functions">
diff --git a/third_party/blink/web_tests/external/wpt/css/requirements.txt b/third_party/blink/web_tests/external/wpt/css/requirements.txt index 725ddd9..28b2040 100644 --- a/third_party/blink/web_tests/external/wpt/css/requirements.txt +++ b/third_party/blink/web_tests/external/wpt/css/requirements.txt
@@ -1,6 +1,6 @@ Template-Python==0.1.post1 html5lib==1.1 -lxml==4.5.2 +lxml==4.6.2 mercurial==4.5 six==1.15.0 webencodings==0.5.1
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focus-event-001.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focus-event-001.html index 0639b77..2f9a3dd 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focus-event-001.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focus-event-001.html
@@ -1,20 +1,31 @@ <!DOCTYPE html> <meta charset="utf-8"> -<title>Selectors Level 4: :focus in focus event</title> +<title>Selectors Level 4: :focus, :focus-visible and :focus-within in focus event</title> <link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-pseudo"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-visible-pseudo"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-within-pseudo"> <link rel="help" href="https://w3c.github.io/uievents/#event-type-focus"> <link rel="help" href="https://crbug.com/523126"> <meta name='author' title='Takayoshi Kochi' href='mailto:kochi@chromium.org'> +<meta name='author' title='Manuel Rego Casasnovas' href='mailto:rego@igalia.com'> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <input type="text"> <script> var input = document.querySelector('input'); input.addEventListener('focus', function(e) { - var focused = document.querySelector(':focus'); + var focusPseudo = document.querySelector(':focus'); + var focusVisiblePseudo = document.querySelector(':focus-visible'); + var focusWithinPseudo = document.querySelector(':focus-within'); test(() => { - assert_equals(e.target, focused, "':focus' matches event.target"); + assert_equals(e.target, focusPseudo, "':focus' matches event.target"); }, "Checks that ':focus' pseudo-class matches inside 'focus' event handler"); + test(() => { + assert_equals(e.target, focusVisiblePseudo, "':focus-visible' matches event.target"); + }, "Checks that ':focus-visible' pseudo-class matches inside 'focus' event handler"); + test(() => { + assert_equals(document.documentElement, focusWithinPseudo, "':focus-within' matches document.documentElement"); + }, "Checks that ':focus-within' pseudo-class matches inside 'focus' event handler"); }, false); input.focus(); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focusin-event-001.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focusin-event-001.html new file mode 100644 index 0000000..e18401f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-in-focusin-event-001.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Selectors Level 4: :focus, :focus-visible and :focus-within in focusin event</title> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-pseudo"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-visible-pseudo"> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#focus-within-pseudo"> +<link rel="help" href="https://w3c.github.io/uievents/#event-type-focusin"> +<meta name='author' title='Manuel Rego Casasnovas' href='mailto:rego@igalia.com'> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<input type="text"> +<script> +var input = document.querySelector('input'); +input.addEventListener('focusin', function(e) { + var focusPseudo = document.querySelector(':focus'); + var focusVisiblePseudo = document.querySelector(':focus-visible'); + var focusWithinPseudo = document.querySelector(':focus-within'); + test(() => { + assert_equals(e.target, focusPseudo, "':focus' matches event.target"); + }, "Checks that ':focus' pseudo-class matches inside 'focusin' event handler"); + test(() => { + assert_equals(e.target, focusVisiblePseudo, "':focus-visible' matches event.target"); + }, "Checks that ':focus-visible' pseudo-class matches inside 'focusin' event handler"); + test(() => { + assert_equals(document.documentElement, focusWithinPseudo, "':focus-within' matches document.documentElement"); + }, "Checks that ':focus-within' pseudo-class matches inside 'focusin' event handler"); +}, false); +input.focus(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-003.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-003.html index aa73b4d..3076823 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-003.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-003.html
@@ -78,16 +78,18 @@ <label><input class="check" id="el-13" type="color"></input> Focus me.</label> </div> <script> - function mouseClickInTarget(selector) { - let target = document.querySelector(selector); - return test_driver.click(target); - } + setup({ explicit_done: true }); - for (const target of document.querySelectorAll(".check")) { + const elements = document.querySelectorAll(".check"); + for (let i = 0; i < elements.length; i++) { + const target = elements[i]; promise_test(() => { return new Promise(resolve => { target.addEventListener("focus", resolve); - test_driver.click(target); + test_driver.click(target).then(() => { + if (i == (elements.length - 1)) + done(); + }); }).then(() => { assert_equals(getComputedStyle(target).backgroundColor, "rgb(0, 255, 0)", `backgroundColor for ${target.tagName}#${target.id} should be lime`); assert_not_equals(getComputedStyle(target).outlineColor, "rgb(255, 0, 0)", `outlineColor for ${target.tagName}#${target.id} should NOT be red`);
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-004.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-004.html index b30b9e2..f1274b61 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-004.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-004.html
@@ -77,16 +77,18 @@ <label><input class="check" id="el-11" type="color"></input> Focus me.</label> </div> <script> - function mouseClickInTarget(selector) { - let target = document.querySelector(selector); - return test_driver.click(target); - } + setup({ explicit_done: true }); - for (const target of document.querySelectorAll(".check")) { + const elements = document.querySelectorAll(".check"); + for (let i = 0; i < elements.length; i++) { + const target = elements[i]; promise_test(() => { return new Promise(resolve => { target.addEventListener("focus", resolve); - test_driver.click(target); + test_driver.click(target).then(() => { + if (i == (elements.length - 1)) + done(); + }); }).then(() => { assert_equals(getComputedStyle(target).backgroundColor, "rgb(0, 255, 0)", `backgroundColor for ${target.tagName}#${target.id} should be lime`); assert_not_equals(getComputedStyle(target).outlineColor, "rgb(255, 0, 0)", `outlineColor for ${target.tagName}#${target.id} should NOT be red`);
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-015.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-015.html index 685baeb..98e4400 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-015.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-015.html
@@ -29,6 +29,8 @@ <div id="target" tabindex="0">Target</div> <script> + setup({ explicit_done: true }); + async_test(function(t) { initial.addEventListener("focus", t.step_func(function() { assert_equals(getComputedStyle(initial).backgroundColor, "rgb(0, 255, 0)", `backgroundColor for ${initial.tagName}#${initial.id} should be lime`); @@ -40,6 +42,6 @@ t.done(); })); - test_driver.click(initial); + test_driver.click(initial).then(() => done()); }, ":focus-visible does not match after script focus move"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-016.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-016.html index a65e5a5..080787f 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-016.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-016.html
@@ -37,6 +37,8 @@ <input id="target" /> <script> + setup({ explicit_done: true }); + async_test(function(t) { initial.addEventListener("focus", t.step_func(function() { assert_equals(getComputedStyle(initial).backgroundColor, "rgb(0, 255, 0)", `backgroundColor for ${initial.tagName}#${initial.id} should be lime`); @@ -48,7 +50,7 @@ t.done(); })); - test_driver.click(initial); + test_driver.click(initial).then(() => done()); }, ":focus-visible always match on text inputs"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-not.html b/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-not.html index e96db5a..f455059 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-not.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-not.html
@@ -24,6 +24,8 @@ test_valid_selector(':not(:host(.a))'); test_valid_selector(':host(:not(.a))'); test_valid_selector(':not(:host(:not(.a)))'); + test_valid_selector(':not([disabled][selected])', ':not([disabled][selected])'); + test_valid_selector(':not([disabled],[selected])', ':not([disabled], [selected])'); test_invalid_selector(':not()'); test_invalid_selector(':not(:not())');
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js b/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js index afb02ae..31a08eaa 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js +++ b/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js
@@ -53,7 +53,6 @@ 532, // netnews 540, // uucp 548, // afp - 554, // rtsp 556, // remotefs 563, // nntp+ssl 587, // smtp (outgoing)
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/atob/base64.html b/third_party/blink/web_tests/external/wpt/html/webappapis/atob/base64.any.js similarity index 91% rename from third_party/blink/web_tests/external/wpt/html/webappapis/atob/base64.html rename to third_party/blink/web_tests/external/wpt/html/webappapis/atob/base64.any.js index 61c3667d..7f433f4 100644 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/atob/base64.html +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/atob/base64.any.js
@@ -1,12 +1,3 @@ -<!doctype html> -<!-- Originally developed by Aryeh Gregor, funded by Google. Copyright belongs -to Google. --> -<title>atob()/btoa() tests</title> -<meta charset=utf-8> -<div id=log></div> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script> /** * btoa() as defined by the HTML5 spec, which mostly just references RFC4648. */ @@ -160,9 +151,9 @@ output = allTests[i][1]; test(() => { if(output === null) { - assert_throws_dom("InvalidCharacterError", () => window.atob(input)); + assert_throws_dom("InvalidCharacterError", () => globalThis.atob(input)); } else { - const result = window.atob(input); + const result = globalThis.atob(input); for(let ii = 0; ii < output.length; ii++) { assert_equals(result.charCodeAt(ii), output[ii]); } @@ -170,4 +161,3 @@ }, "atob(" + format_value(input) + ")"); } } -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-during-parse-expected.txt b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-during-parse-expected.txt new file mode 100644 index 0000000..89c041a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-during-parse-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Promise rejection during initial parsing of document assert_array_equals: lengths differ, expected array ["readystatechange:interactive", "unhandledrejection", "readystatechange:complete"] length 3, got ["readystatechange:interactive", "readystatechange:complete"] length 2 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-during-parse.html b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-during-parse.html new file mode 100644 index 0000000..160dad9b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/scripting/processing-model-2/unhandled-promise-rejections/promise-rejection-event-during-parse.html
@@ -0,0 +1,44 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Promise rejection during initial parsing of document</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://html.spec.whatwg.org/#unhandled-promise-rejections"> +<body> +<p>The script in this test is executed immediately while parsing is ongoing, and +<a +href="https://html.spec.whatwg.org/multipage/webappapis.html#clean-up-after-running-script">cleaning +up after running script</a> involves queueing a task on the DOM manipulation +task source to fire the <code>unhandledrejection</code> event. Parsing then +completes, immediately transitioning the document's readiness state to +"interactive," and queuing another task on the DOM manipulation task source to +transition the state to "complete." +</p> +<script> +'use strict'; +setup({ allow_uncaught_exception: true }); + +async_test(function(t) { + const events = []; + document.addEventListener('readystatechange', t.step_func(function() { + events.push('readystatechange:' + document.readyState); + })); + addEventListener('unhandledrejection', t.step_func(function() { + events.push('unhandledrejection'); + })); + + Promise.reject(new Error('this error is intentional')); + + addEventListener('load', t.step_func(function() { + assert_array_equals( + events, + [ + 'readystatechange:interactive', + 'unhandledrejection', + 'readystatechange:complete' + ] + ); + t.done(); + })); +}); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-setinterval.any.js b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-setinterval.any.js new file mode 100644 index 0000000..5646140 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-setinterval.any.js
@@ -0,0 +1,12 @@ +setup({ single_test: true }); +var i = 0; +var interval; +function next() { + i++; + if (i === 20) { + clearInterval(interval); + done(); + } +} +setTimeout(assert_unreached, 1000); +interval = setInterval(next, -100);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-setinterval.html b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-setinterval.html deleted file mode 100644 index 663872cd..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-setinterval.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!doctype html> -<title>Negative timeout in setInterval</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -setup({ single_test: true }); -var i = 0; -var interval; -function next() { - i++; - if (i === 20) { - clearInterval(interval); - done(); - } -} -setTimeout(assert_unreached, 1000); -interval = setInterval(next, -100); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js new file mode 100644 index 0000000..da191f1b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.any.js
@@ -0,0 +1,3 @@ +setup({ single_test: true }); +setTimeout(done, -100); +setTimeout(assert_unreached, 10);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.html b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.html deleted file mode 100644 index b59fc8f..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/negative-settimeout.html +++ /dev/null
@@ -1,9 +0,0 @@ -<!doctype html> -<title>Negative timeout in setTimeout</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - setup({ single_test: true }); - setTimeout(done, -100); - setTimeout(assert_unreached, 10); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-setinterval.any.js b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-setinterval.any.js new file mode 100644 index 0000000..164527f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-setinterval.any.js
@@ -0,0 +1,8 @@ +setup({ single_test: true }); +var interval; +function next() { + clearInterval(interval); + done(); +} +interval = setInterval(next, Math.pow(2, 32)); +setTimeout(assert_unreached, 100);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-setinterval.html b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-setinterval.html deleted file mode 100644 index 7fb81ff..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-setinterval.html +++ /dev/null
@@ -1,14 +0,0 @@ -<!doctype html> -<title>Type long timeout for setInterval</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -setup({ single_test: true }); -var interval; -function next() { - clearInterval(interval); - done(); -} -interval = setInterval(next, Math.pow(2, 32)); -setTimeout(assert_unreached, 100); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-settimeout.any.js b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-settimeout.any.js new file mode 100644 index 0000000..9092f13f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-settimeout.any.js
@@ -0,0 +1,3 @@ +setup({ single_test: true }); +setTimeout(done, Math.pow(2, 32)); +setTimeout(assert_unreached, 100);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-settimeout.html b/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-settimeout.html deleted file mode 100644 index 4dc7d17..0000000 --- a/third_party/blink/web_tests/external/wpt/html/webappapis/timers/type-long-settimeout.html +++ /dev/null
@@ -1,9 +0,0 @@ -<!doctype html> -<title>Type long timeout for setTimeout</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -setup({ single_test: true }); -setTimeout(done, Math.pow(2, 32)); -setTimeout(assert_unreached, 100); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/html.idl b/third_party/blink/web_tests/external/wpt/interfaces/html.idl index dfe4e1e..5b30344a 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/html.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
@@ -1397,11 +1397,11 @@ interface mixin CanvasImageData { // pixel manipulation - ImageData createImageData(long sw, long sh); + ImageData createImageData([EnforceRange] long sw, [EnforceRange] long sh); ImageData createImageData(ImageData imagedata); - ImageData getImageData(long sx, long sy, long sw, long sh); - undefined putImageData(ImageData imagedata, long dx, long dy); - undefined putImageData(ImageData imagedata, long dx, long dy, long dirtyX, long dirtyY, long dirtyWidth, long dirtyHeight); + ImageData getImageData([EnforceRange] long sx, [EnforceRange] long sy, [EnforceRange] long sw, [EnforceRange] long sh); + undefined putImageData(ImageData imagedata, [EnforceRange] long dx, [EnforceRange] long dy); + undefined putImageData(ImageData imagedata, [EnforceRange] long dx, [EnforceRange] long dy, [EnforceRange] long dirtyX, [EnforceRange] long dirtyY, [EnforceRange] long dirtyWidth, [EnforceRange] long dirtyHeight); }; enum CanvasLineCap { "butt", "round", "square" };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webhid.idl b/third_party/blink/web_tests/external/wpt/interfaces/webhid.idl index ad2f0b7..ffc9609 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/webhid.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/webhid.idl
@@ -66,8 +66,14 @@ dictionary HIDReportItem { boolean isAbsolute; boolean isArray; + boolean isBufferedBytes; + boolean isConstant; + boolean isLinear; boolean isRange; + boolean isVolatile; boolean hasNull; + boolean hasPreferredState; + boolean wrap; sequence<unsigned long> usages; unsigned long usageMinimum; unsigned long usageMaximum; @@ -96,6 +102,7 @@ dictionary HIDCollectionInfo { unsigned short usagePage; unsigned short usage; + octet type; sequence<HIDCollectionInfo> children; sequence<HIDReportInfo> inputReports; sequence<HIDReportInfo> outputReports;
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index 049d4f81..27ba549 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -274,7 +274,7 @@ GENERATE_TESTS: html/syntax/parsing/template/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context.html GENERATE_TESTS: html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html GENERATE_TESTS: html/syntax/serializing-html-fragments/serializing.html -GENERATE_TESTS: html/webappapis/atob/base64.html +GENERATE_TESTS: html/webappapis/atob/base64.any.js GENERATE_TESTS: mediacapture-fromelement/capture.html GENERATE_TESTS: mediacapture-fromelement/creation.html GENERATE_TESTS: mediacapture-fromelement/ended.html @@ -723,12 +723,12 @@ MISSING DEPENDENCY: idle-detection/resources/idle-detection-helper.js MISSING DEPENDENCY: mediacapture-image/resources/imagecapture-helpers.js MISSING DEPENDENCY: orientation-event/resources/orientation-event-helpers.js +MISSING DEPENDENCY: resources/chromium/webusb-test.js MISSING DEPENDENCY: resources/test-only-api.js MISSING DEPENDENCY: screen_enumeration/resources/screenenumeration-helpers.js MISSING DEPENDENCY: serial/resources/automation.js MISSING DEPENDENCY: shape-detection/resources/shapedetection-helpers.js MISSING DEPENDENCY: web-nfc/resources/nfc-helpers.js -MISSING DEPENDENCY: webusb/resources/usb-helpers.js MISSING DEPENDENCY: webxr/resources/webxr_util.js # Tests that are false positives for using Ahem as a system font
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html.ini deleted file mode 100644 index 04c0f72..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_coordinates_when_locked.html.ini +++ /dev/null
@@ -1,5 +0,0 @@ -[pointerevent_coordinates_when_locked.html] - expected: TIMEOUT - - [mouse Test pointerevent coordinates when pointer is locked] - expected: NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_getCoalescedEvents_when_pointerlocked.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_getCoalescedEvents_when_pointerlocked.html.ini deleted file mode 100644 index 9e12583..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_getCoalescedEvents_when_pointerlocked.html.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[pointerevent_getCoalescedEvents_when_pointerlocked.html] - [mouse pointermove getCoalescedEvents when lock test] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini deleted file mode 100644 index d22487b..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini +++ /dev/null
@@ -1,6 +0,0 @@ -[pointerevent_movementxy_with_pointerlock.html] - expected: TIMEOUT - - [mouse pointerevent movementX/Y with pointerlock test] - expected: TIMEOUT - message: Test timed out
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_after_pointercapture.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_after_pointercapture.html.ini deleted file mode 100644 index dc1a38a9..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_after_pointercapture.html.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[pointerevent_pointerlock_after_pointercapture.html] - [mouse no pointercapture while pointerlock] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointermove_in_pointerlock.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointermove_in_pointerlock.html.ini deleted file mode 100644 index 7c4043d..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointermove_in_pointerlock.html.ini +++ /dev/null
@@ -1,8 +0,0 @@ -[pointerevent_pointermove_in_pointerlock.html] - expected: TIMEOUT - - [pointermove event received] - expected: NOTRUN - - [pointermove event received inner frame] - expected: NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini deleted file mode 100644 index 9d0b178..0000000 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html.ini +++ /dev/null
@@ -1,5 +0,0 @@ -[pointerevent_pointermove_on_chorded_mouse_button_when_locked.html] - expected: TIMEOUT - - [pointer locked pointermove events received for button state changes] - expected: NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-button.html b/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-button.html index 2bf0ddb..0672219 100644 --- a/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-button.html +++ b/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-button.html
@@ -4,7 +4,7 @@ function handleMessage(e) { if (e.data == "focus") { let button = document.querySelector("button"); - button.onfocus = () => e.source.postMessage({focused: true}, "*"); + button.onfocus = () => e.source.postMessage({focused: true}, {targetOrigin: "*"}); button.focus(); } } @@ -22,7 +22,7 @@ window.onfocus = () => { if (window.portalHost) - window.portalHost.postMessage("window focused", "*"); + window.portalHost.postMessage("window focused"); }; </script> <button>A</button>
diff --git a/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-x-origin-iframe.sub.html b/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-x-origin-iframe.sub.html index 7c9df9d..9807898 100644 --- a/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-x-origin-iframe.sub.html +++ b/third_party/blink/web_tests/external/wpt/portals/resources/focus-page-with-x-origin-iframe.sub.html
@@ -19,9 +19,9 @@ window.onmessage = e => { if (window.portalHost) - window.portalHost.postMessage(e.data, "*"); + window.portalHost.postMessage(e.data); else - document.querySelector("portal").postMessage(e.data, "*"); + document.querySelector("portal").postMessage(e.data); } </script> <iframe src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/portals/resources/focus-page-with-button.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/preload/avoid-prefetching-on-text-plain.html b/third_party/blink/web_tests/external/wpt/preload/avoid-prefetching-on-text-plain.html index 487cbbc..45564e1 100644 --- a/third_party/blink/web_tests/external/wpt/preload/avoid-prefetching-on-text-plain.html +++ b/third_party/blink/web_tests/external/wpt/preload/avoid-prefetching-on-text-plain.html
@@ -23,8 +23,16 @@ urls.push(entry.name); } // If preloading is working correctly, should only see the text document - // represented in the performance information. - assert_array_equals(resource_types, ['navigation']); + // represented in the performance information. A 'resource' type indicates + // that we've prefetched something. + let resource_found = false; + for (const t of resource_types) { + if (t == "resource") { + resource_found = true; + break; + } + } + assert_false(resource_found, "no resources should be present"); assert_equals(urls.length, 1); assert_equals(urls[0].endsWith("avoid-prefetching-on-text-plain-inner.html"), true); done();
diff --git a/third_party/blink/web_tests/external/wpt/referrer-policy/css-integration/image/inline-style-with-differentorigin-base-tag.tentative.html b/third_party/blink/web_tests/external/wpt/referrer-policy/css-integration/image/inline-style-with-differentorigin-base-tag.tentative.html new file mode 100644 index 0000000..091afd83 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/referrer-policy/css-integration/image/inline-style-with-differentorigin-base-tag.tentative.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<title>CSS integration - image from inline style from document with base tag</title> +<link rel="help" href="https://crbug.com/1158645" /> + +<head> + <meta name="referrer" content="origin"> +</head> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<!-- Common global functions for referrer-policy tests. --> +<script src="/common/security-features/resources/common.sub.js"></script> + +<!-- This has to follow the <script> tags, or it will make the js files fail to load. --> +<base href="http://other-site.example" /> + +<p>Check that resources from inline styles are loaded with + the referrer and referrer policy from the document and, in + particular, not with the different base URL set in the base tag.</p> + +<div class="styled"></div> + +<script> + 'use strict'; + promise_test(function(css_test) { + var id = token(); + var css_url = location.protocol + "//www1." + location.hostname + ":" + location.port + "/common/security-features/subresource/image.py" + "?id=" + id; + var img_url = css_url + "&report-headers"; + + var div = document.querySelector("div.styled"); + div.style = "content:url(" + css_url + ")"; + return timeoutPromise(css_test, 1000) + .then(() => requestViaXhr(img_url)) + .then(function(message) { + assert_own_property(message, "headers"); + assert_own_property(message, "referrer"); + assert_equals(message.referrer, location.origin + "/"); + }); + }, "Image from inline styles."); +</script> + +<div id="log"></div> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/referrer-policy/css-integration/svg/inline-style-with-differentorigin-base-tag.tentative.html b/third_party/blink/web_tests/external/wpt/referrer-policy/css-integration/svg/inline-style-with-differentorigin-base-tag.tentative.html new file mode 100644 index 0000000..9a8bc6d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/referrer-policy/css-integration/svg/inline-style-with-differentorigin-base-tag.tentative.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<html> + +<head> + <title>CSS integration - styling SVG from inline style on page with different-origin base tag</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/common/utils.js"></script> + <!-- Common global functions for referrer-policy tests. --> + <script src="/common/security-features/resources/common.sub.js"></script> + <!-- Helper functions for referrer-policy css tests. --> + <script src="/referrer-policy/css-integration/css-test-helper.js"></script> + <meta name="referrer" content="origin"> +</head> + +<base href="http://other-page.example/" /> + +<body> + <p>Check that resources from inline styles are loaded with + the referrer and referrer policy from the document and, in + particular, not from the document's overridden base URL.</p> + <script> + function setInlineStyle(test) { + test.expected = location.origin + "/"; + let svg = createSvg(); + document.body.appendChild(svg); + let element = svg.getElementsByTagName('path')[0]; + element.style = test.property + ": url(" + url_prefix + "svg.py?id=" + + test.id + "#invalidFragment);"; + } + + runSvgTests(svg_test_properties, + "Styling SVG from inline styles", + setInlineStyle); + </script> + + <div id="log"></div> +</body> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js index 8bccfd1f..f6a793d 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js
@@ -16,6 +16,19 @@ messagePort: null, }; +let mojom = {}; + +async function loadMojomDefinitions() { + const deviceMojom = + await import('/gen/services/device/public/mojom/usb_device.mojom.m.js'); + const serviceMojom = await import( + '/gen/third_party/blink/public/mojom/usb/web_usb_service.mojom.m.js'); + return { + ...deviceMojom, + ...serviceMojom, + }; +} + function getMessagePort(target) { return new Promise(resolve => { target.addEventListener('message', messageEvent => { @@ -93,29 +106,29 @@ var endpointInfo = { endpointNumber: endpoint.endpointNumber, packetSize: endpoint.packetSize, - synchronizationType: device.mojom.UsbSynchronizationType.NONE, - usageType: device.mojom.UsbUsageType.DATA, + synchronizationType: mojom.UsbSynchronizationType.NONE, + usageType: mojom.UsbUsageType.DATA, pollingInterval: 0, extraData: new Uint8Array() }; switch (endpoint.direction) { - case "in": - endpointInfo.direction = device.mojom.UsbTransferDirection.INBOUND; - break; - case "out": - endpointInfo.direction = device.mojom.UsbTransferDirection.OUTBOUND; - break; + case "in": + endpointInfo.direction = mojom.UsbTransferDirection.INBOUND; + break; + case "out": + endpointInfo.direction = mojom.UsbTransferDirection.OUTBOUND; + break; } switch (endpoint.type) { - case "bulk": - endpointInfo.type = device.mojom.UsbTransferType.BULK; - break; - case "interrupt": - endpointInfo.type = device.mojom.UsbTransferType.INTERRUPT; - break; - case "isochronous": - endpointInfo.type = device.mojom.UsbTransferType.ISOCHRONOUS; - break; + case "bulk": + endpointInfo.type = mojom.UsbTransferType.BULK; + break; + case "interrupt": + endpointInfo.type = mojom.UsbTransferType.INTERRUPT; + break; + case "isochronous": + endpointInfo.type = mojom.UsbTransferType.ISOCHRONOUS; + break; } alternateInfo.endpoints.push(endpointInfo); }); @@ -173,7 +186,7 @@ open() { assert_false(this.opened_); this.opened_ = true; - return Promise.resolve({ error: device.mojom.UsbOpenDeviceError.OK }); + return Promise.resolve({error: mojom.UsbOpenDeviceError.OK}); } close() { @@ -244,36 +257,35 @@ async controlTransferIn(params, length, timeout) { assert_true(this.opened_); - if ((params.recipient == device.mojom.UsbControlTransferRecipient.INTERFACE || - params.recipient == device.mojom.UsbControlTransferRecipient.ENDPOINT) && + if ((params.recipient == mojom.UsbControlTransferRecipient.INTERFACE || + params.recipient == mojom.UsbControlTransferRecipient.ENDPOINT) && this.currentConfiguration_ == null) { return { - status: device.mojom.UsbTransferStatus.PERMISSION_DENIED, + status: mojom.UsbTransferStatus.PERMISSION_DENIED, }; } return { - status: device.mojom.UsbTransferStatus.OK, - data: [length >> 8, length & 0xff, params.request, params.value >> 8, - params.value & 0xff, params.index >> 8, params.index & 0xff] + status: mojom.UsbTransferStatus.OK, + data: [ + length >> 8, length & 0xff, params.request, params.value >> 8, + params.value & 0xff, params.index >> 8, params.index & 0xff + ] }; } async controlTransferOut(params, data, timeout) { assert_true(this.opened_); - if ((params.recipient == device.mojom.UsbControlTransferRecipient.INTERFACE || - params.recipient == device.mojom.UsbControlTransferRecipient.ENDPOINT) && + if ((params.recipient == mojom.UsbControlTransferRecipient.INTERFACE || + params.recipient == mojom.UsbControlTransferRecipient.ENDPOINT) && this.currentConfiguration_ == null) { return { - status: device.mojom.UsbTransferStatus.PERMISSION_DENIED, + status: mojom.UsbTransferStatus.PERMISSION_DENIED, }; } - return { - status: device.mojom.UsbTransferStatus.OK, - bytesWritten: data.byteLength - }; + return {status: mojom.UsbTransferStatus.OK, bytesWritten: data.byteLength}; } genericTransferIn(endpointNumber, length, timeout) { @@ -283,20 +295,15 @@ let data = new Array(length); for (let i = 0; i < length; ++i) data[i] = i & 0xff; - return Promise.resolve({ - status: device.mojom.UsbTransferStatus.OK, - data: data - }); + return Promise.resolve({status: mojom.UsbTransferStatus.OK, data: data}); } genericTransferOut(endpointNumber, data, timeout) { assert_true(this.opened_); assert_false(this.currentConfiguration_ == null, 'device configured'); // TODO(reillyg): Assert that endpoint is valid. - return Promise.resolve({ - status: device.mojom.UsbTransferStatus.OK, - bytesWritten: data.byteLength - }); + return Promise.resolve( + {status: mojom.UsbTransferStatus.OK, bytesWritten: data.byteLength}); } isochronousTransferIn(endpointNumber, packetLengths, timeout) { @@ -312,7 +319,7 @@ packets[i] = { length: packetLengths[i], transferredLength: packetLengths[i], - status: device.mojom.UsbTransferStatus.OK + status: mojom.UsbTransferStatus.OK }; } return Promise.resolve({ data: data, packets: packets }); @@ -327,7 +334,7 @@ packets[i] = { length: packetLengths[i], transferredLength: packetLengths[i], - status: device.mojom.UsbTransferStatus.OK + status: mojom.UsbTransferStatus.OK }; } return Promise.resolve({ packets: packets }); @@ -336,7 +343,7 @@ class FakeWebUsbService { constructor() { - this.bindingSet_ = new mojo.BindingSet(blink.mojom.WebUsbService); + this.receiver_ = new mojom.WebUsbServiceReceiver(this); this.devices_ = new Map(); this.devicesByGuid_ = new Map(); this.client_ = null; @@ -344,7 +351,7 @@ } addBinding(handle) { - this.bindingSet_.addBinding(this, handle); + this.receiver_.$.bindHandle(handle); } addDevice(fakeDevice, info) { @@ -352,7 +359,7 @@ fakeDevice: fakeDevice, guid: (this.nextGuid_++).toString(), info: info, - bindingArray: [] + receivers: [], }; this.devices_.set(fakeDevice, device); this.devicesByGuid_.set(device.guid, device); @@ -365,8 +372,8 @@ if (!device) throw new Error('Cannot remove unknown device.'); - for (var binding of device.bindingArray) - binding.close(); + for (const receiver of device.receivers) + receiver.$.close(); this.devices_.delete(device.fakeDevice); this.devicesByGuid_.delete(device.guid); if (this.client_) { @@ -377,8 +384,8 @@ removeAllDevices() { this.devices_.forEach(device => { - for (var binding of device.bindingArray) - binding.close(); + for (const receiver of device.receivers) + receiver.$.close(); this.client_.onDeviceRemoved( fakeDeviceInitToDeviceInfo(device.guid, device.info)); }); @@ -397,17 +404,16 @@ getDevice(guid, request) { let retrievedDevice = this.devicesByGuid_.get(guid); if (retrievedDevice) { - let binding = new mojo.Binding( - device.mojom.UsbDevice, - new FakeDevice(retrievedDevice.info), - request); - binding.setConnectionErrorHandler(() => { + const receiver = + new mojom.UsbDeviceReceiver(new FakeDevice(retrievedDevice.info)); + receiver.$.bindHandle(request.handle); + receiver.onConnectionError.addListener(() => { if (retrievedDevice.fakeDevice.onclose) retrievedDevice.fakeDevice.onclose(); }); - retrievedDevice.bindingArray.push(binding); + retrievedDevice.receivers.push(receiver); } else { - request.close(); + request.handle.close(); } } @@ -422,8 +428,8 @@ }); } - setClient(clientInfo) { - this.client_ = new device.mojom.UsbDeviceManagerClientAssociatedPtr(clientInfo); + setClient(client) { + this.client_ = client; } } @@ -474,9 +480,10 @@ getMessagePort(window); } + mojom = await loadMojomDefinitions(); internal.webUsbService = new FakeWebUsbService(); internal.webUsbServiceInterceptor = - new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name); + new MojoInterfaceInterceptor(mojom.WebUsbService.$interfaceName); internal.webUsbServiceInterceptor.oninterfacerequest = e => internal.webUsbService.addBinding(e.handle); internal.webUsbServiceInterceptor.start(); @@ -498,7 +505,7 @@ return new Promise(resolve => { internal.messagePort.onmessage = channelEvent => { switch (channelEvent.data.type) { - case blink.mojom.WebUsbService.name: + case mojom.WebUsbService.$interfaceName: internal.webUsbService.addBinding(channelEvent.data.handle); break; case 'Complete': @@ -507,10 +514,11 @@ } }; internal.messagePort.postMessage({ - type: 'Attach' , + type: 'Attach', interfaces: [ - blink.mojom.WebUsbService.name, - ]}); + mojom.WebUsbService.$interfaceName, + ] + }); }); }); }
diff --git a/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse-expected.txt b/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse-expected.txt new file mode 100644 index 0000000..7b490dd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Animate SVGMarkerElement orientAttr from auto to auto-start-reverse assert_equals: expected (undefined) undefined but got (number) 0 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html b/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html index fedfe4a..b7a4e68 100644 --- a/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html +++ b/third_party/blink/web_tests/external/wpt/svg/animations/animate-marker-orient-from-auto-to-auto-start-reverse.html
@@ -76,7 +76,7 @@ assert_approx_equals(marker.orientAngle.animVal.value, 0, epsilon); assert_equals(marker.orientAngle.baseVal.value, 0); - assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_UNKNOWN); + assert_equals(marker.orientType.animVal, SVGMarkerElement.SVG_MARKER_ORIENT_AUTO_START_REVERSE); assert_equals(marker.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE); } @@ -94,4 +94,4 @@ runAnimationTest(t, expectedValues); }); -</script> \ No newline at end of file +</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt new file mode 100644 index 0000000..ae149d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Use of SVGAnimatedEnumeration within SVGMarkerElement Failed to set the 'baseVal' property on 'SVGAnimatedEnumeration': The enumeration value provided is 0, which is not settable. +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement.html b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement.html index 7ac884a..dfc9dd2 100644 --- a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement.html +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-SVGMarkerElement.html
@@ -90,8 +90,17 @@ markerElement.setAttribute('orient', '10deg'); + // Switch to 'auto-start-reverse' value - by modifying orientType. + markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_AUTO_START_REVERSE; + assert_equals(markerElement.orientAngle.baseVal.value, 0); + assert_equals(markerElement.orientAngle.baseVal.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED); + assert_equals(markerElement.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_AUTO_START_REVERSE); + assert_equals(markerElement.getAttribute('orient'), "auto-start-reverse"); + + markerElement.setAttribute('orient', '10deg'); + // Try setting invalid values. - assert_throws_js(TypeError, function() { markerElement.orientType.baseVal = 3; }); + assert_throws_js(TypeError, function() { markerElement.orientType.baseVal = 4; }); assert_equals(markerElement.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE); assert_equals(markerElement.getAttribute('orient'), "10deg"); @@ -110,4 +119,4 @@ assert_equals(markerElement.orientType.baseVal, SVGMarkerElement.SVG_MARKER_ORIENT_AUTO); assert_equals(markerElement.getAttribute('orient'), "auto"); }); -</script> \ No newline at end of file +</script>
diff --git a/third_party/blink/web_tests/external/wpt/tools/lint/lint.py b/third_party/blink/web_tests/external/wpt/tools/lint/lint.py index 38225ec..1872e62 100644 --- a/third_party/blink/web_tests/external/wpt/tools/lint/lint.py +++ b/third_party/blink/web_tests/external/wpt/tools/lint/lint.py
@@ -655,6 +655,16 @@ if incorrect_path("testdriver-vendor.js", src): errors.append(rules.TestdriverVendorPath.error(path)) + script_path = None + try: + script_path = urlsplit(urljoin(source_file.url, src)).path + except ValueError: + # This happens if the contents of src isn't something that looks like a URL to Python + pass + if (script_path == "/common/reftest-wait.js" and + "reftest-wait" not in source_file.root.attrib.get("class", "").split()): + errors.append(rules.MissingReftestWait.error(path)) + return errors class ASTCheck(with_metaclass(abc.ABCMeta)):
diff --git a/third_party/blink/web_tests/external/wpt/tools/lint/rules.py b/third_party/blink/web_tests/external/wpt/tools/lint/rules.py index f6e23ae..b389e3d 100644 --- a/third_party/blink/web_tests/external/wpt/tools/lint/rules.py +++ b/third_party/blink/web_tests/external/wpt/tools/lint/rules.py
@@ -197,6 +197,14 @@ """ +class MissingReftestWait(Rule): + name = "MISSING-REFTESTWAIT" + description = "Missing `class=reftest-wait`" + to_fix = """ + ensure tests that include reftest-wait.js also use class=reftest-wait on the root element. + """ + + class MissingTestharnessReport(Rule): name = "MISSING-TESTHARNESSREPORT" description = "Missing `<script src='/resources/testharnessreport.js'>`"
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py b/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py index 6e90ac0..ce81c625 100644 --- a/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py +++ b/third_party/blink/web_tests/external/wpt/tools/manifest/sourcefile.py
@@ -167,27 +167,27 @@ def _parse_html(f): - # type: (BinaryIO) -> ElementTree.ElementTree + # type: (BinaryIO) -> ElementTree.Element doc = html5lib.parse(f, treebuilder="etree", useChardet=False) if MYPY: - return cast(ElementTree.ElementTree, doc) + return cast(ElementTree.Element, doc) return doc def _parse_xml(f): - # type: (BinaryIO) -> ElementTree.ElementTree + # type: (BinaryIO) -> ElementTree.Element try: # raises ValueError with an unsupported encoding, # ParseError when there's an undefined entity - return ElementTree.parse(f) + return ElementTree.parse(f).getroot() except (ValueError, ElementTree.ParseError): f.seek(0) - return ElementTree.parse(f, XMLParser.XMLParser()) # type: ignore + return ElementTree.parse(f, XMLParser.XMLParser()).getroot() # type: ignore class SourceFile(object): parsers = {u"html":_parse_html, u"xhtml":_parse_xml, - u"svg":_parse_xml} # type: Dict[Text, Callable[[BinaryIO], ElementTree.ElementTree]] + u"svg":_parse_xml} # type: Dict[Text, Callable[[BinaryIO], ElementTree.Element]] root_dir_non_test = {u"common"} @@ -447,7 +447,7 @@ @cached_property def root(self): - # type: () -> Optional[Union[ElementTree.Element, ElementTree.ElementTree]] + # type: () -> Optional[ElementTree.Element] """Return an ElementTree Element for the root node of the file if it contains markup, or None if it does not""" if not self.markup_type: @@ -461,12 +461,7 @@ except Exception: return None - if hasattr(tree, "getroot"): - root = tree.getroot() # type: Union[ElementTree.Element, ElementTree.ElementTree] - else: - root = tree - - return root + return tree @cached_property def timeout_nodes(self):
diff --git a/third_party/blink/web_tests/external/wpt/tools/runner/runner.js b/third_party/blink/web_tests/external/wpt/tools/runner/runner.js index 27946e1..1577228 100644 --- a/third_party/blink/web_tests/external/wpt/tools/runner/runner.js +++ b/third_party/blink/web_tests/external/wpt/tools/runner/runner.js
@@ -893,18 +893,17 @@ new ManualUI(document.getElementById("manualUI"), runner); new VisualOutput(document.getElementById("output"), runner); + window.addEventListener("message", function(e) { + if (e.data.type === "complete") + runner.on_complete(e.data.tests, e.data.status); + }); + if (options.autorun === "1") { runner.start(test_control.get_path(), test_control.get_test_types(), test_control.get_testharness_settings(), test_control.get_use_regex()); - return; } - - window.addEventListener("message", function(e) { - if (e.data.type === "complete") - runner.on_complete(e.data.tests, e.data.status); - }); } window.addEventListener("DOMContentLoaded", setup, false);
diff --git a/third_party/blink/web_tests/external/wpt/url/url-constructor.html b/third_party/blink/web_tests/external/wpt/url/url-constructor.any.js similarity index 88% rename from third_party/blink/web_tests/external/wpt/url/url-constructor.html rename to third_party/blink/web_tests/external/wpt/url/url-constructor.any.js index 7ddcdc88..153d985f 100644 --- a/third_party/blink/web_tests/external/wpt/url/url-constructor.html +++ b/third_party/blink/web_tests/external/wpt/url/url-constructor.any.js
@@ -1,9 +1,3 @@ -<!doctype html> -<meta charset=utf-8> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<div id=log></div> -<script> function bURL(url, base) { return new URL(url, base || "about:blank") } @@ -41,4 +35,3 @@ } promise_test(() => fetch("resources/urltestdata.json").then(res => res.json()).then(runURLTests), "Loading data…"); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/url/url-origin.html b/third_party/blink/web_tests/external/wpt/url/url-origin.any.js similarity index 77% rename from third_party/blink/web_tests/external/wpt/url/url-origin.html rename to third_party/blink/web_tests/external/wpt/url/url-origin.any.js index fccb643..d9ef64c7 100644 --- a/third_party/blink/web_tests/external/wpt/url/url-origin.html +++ b/third_party/blink/web_tests/external/wpt/url/url-origin.any.js
@@ -1,9 +1,3 @@ -<!doctype html> -<meta charset=utf-8> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<div id=log></div> -<script> promise_test(() => fetch("resources/urltestdata.json").then(res => res.json()).then(runURLTests), "Loading data…"); function bURL(url, base) { @@ -21,4 +15,3 @@ }, "Origin parsing: <" + expected.input + "> against <" + expected.base + ">") } } -</script>
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/authentication.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/authentication.py index 25a8eb95..e61eef06 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/authentication.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/authentication.py
@@ -1,15 +1,12 @@ from six.moves.urllib.parse import urlencode -def basic_authentication(username=None, password=None, protocol="http"): - from .fixtures import server_config, url - build_url = url(server_config()) - +def basic_authentication(url, username=None, password=None, protocol="http"): query = {} - return build_url("/webdriver/tests/support/authentication.py", - query=urlencode(query), - protocol=protocol) + return url("/webdriver/tests/support/authentication.py", + query=urlencode(query), + protocol=protocol) def main(request, response):
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt index 596e3c4..542849df 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt
@@ -1,11 +1,12 @@ This is a testharness.js-based test. PASS A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation +PASS A transceiver added and stopped should not crash when getting receiver's transport PASS During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation PASS A stopped sendonly transceiver should generate an inactive m-section in the offer PASS A stopped inactive transceiver should generate an inactive m-section in the offer PASS If a transceiver is stopped locally, setting a locally generated answer should still work PASS If a transceiver is stopped remotely, setting a locally generated answer should still work PASS If a transceiver is stopped, transceivers, senders and receivers should disappear after offer/answer -FAIL If a transceiver is stopped, transceivers should end up in state stopped assert_equals: expected "recvonly" but got "stopped" +FAIL If a transceiver is stopped, transceivers should end up in state stopped assert_equals: expected "stopped" but got "recvonly" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop.html index 4f3a9ce..766b34d7 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver-stop.html
@@ -23,6 +23,18 @@ promise_test(async (t)=> { const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + + pc1.addTransceiver("audio", { direction: "sendonly" }); + pc1.addTransceiver("video"); + assert_equals(null, pc1.getTransceivers()[1].receiver.transport); + + pc1.getTransceivers()[1].stop(); + assert_equals(pc1.getTransceivers()[1].receiver.transport, null); +}, "A transceiver added and stopped should not crash when getting receiver's transport"); + +promise_test(async (t)=> { + const pc1 = new RTCPeerConnection(); const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc1.close()); t.add_cleanup(() => pc2.close()); @@ -136,8 +148,8 @@ pc2Transceiver = pc2.getTransceivers()[0]; pc1.getTransceivers()[0].stop(); await exchangeOfferAnswer(pc1, pc2); - assert_equals('stopped', pc1Transceiver.direction); - assert_equals('stopped', pc2Transceiver.direction); + assert_equals(pc1Transceiver.direction, 'stopped'); + assert_equals(pc2Transceiver.direction, 'stopped'); }, 'If a transceiver is stopped, transceivers should end up in state stopped'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js b/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js index 84728c0e..0e8938a 100644 --- a/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js +++ b/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js
@@ -58,7 +58,6 @@ 532, // netnews 540, // uucp 548, // afp - 554, // rtsp 556, // remotefs 563, // nntp+ssl 587, // smtp (outgoing)
diff --git a/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py b/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py index 40905c3..e59070c 100755 --- a/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py +++ b/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py
@@ -9,7 +9,12 @@ # this number too large will result in false positives, when it takes more than # 2 seconds to transmit the message anyway. This number was arrived at by # trial-and-error. -MESSAGE_SIZE = 16 * 1024 * 1024 +MESSAGE_SIZE = 1024 * 1024 + +# With Windows 10 and Python 3, the OS will buffer an entire message in memory +# and return from send() immediately, even if it is very large. To work around +# this problem, send multiple messages. +MESSAGE_COUNT = 16 def web_socket_do_extra_handshake(request): @@ -26,8 +31,10 @@ # 3 is complete. time.time() can go backwards. start_time = time.time() - # The large message that will be blocked by backpressure. - request.ws_stream.send_message(b' ' * MESSAGE_SIZE, binary=True) + # The large messages that will be blocked by backpressure. + for i in range(MESSAGE_COUNT): + request.ws_stream.send_message(b' ' * MESSAGE_SIZE, binary=True) # Report the time taken to send the large message. - request.ws_stream.send_message(six.text_type(time.time() - start_time), binary=False) + request.ws_stream.send_message(six.text_type(time.time() - start_time), + binary=False)
diff --git a/third_party/blink/web_tests/external/wpt/websockets/stream/tentative/backpressure-receive.any.js b/third_party/blink/web_tests/external/wpt/websockets/stream/tentative/backpressure-receive.any.js index 17c75bd5..662a6a28 100644 --- a/third_party/blink/web_tests/external/wpt/websockets/stream/tentative/backpressure-receive.any.js +++ b/third_party/blink/web_tests/external/wpt/websockets/stream/tentative/backpressure-receive.any.js
@@ -5,6 +5,7 @@ // Allow for this much timer jitter. const JITTER_ALLOWANCE_MS = 200; +const LARGE_MESSAGE_COUNT = 16; // This test works by using a server WebSocket handler which sends a large // message, and then sends a second message with the time it measured the first @@ -22,8 +23,10 @@ // Skip the empty message used to fill the readable queue. await reader.read(); - // Skip the large message. - await reader.read(); + // Skip the large messages. + for (let i = 0; i < LARGE_MESSAGE_COUNT; ++i) { + await reader.read(); + } // Read the time it took. const { value, done } = await reader.read();
diff --git a/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js b/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js index bb67451..8525da7 100644 --- a/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js +++ b/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js
@@ -16,28 +16,12 @@ } })(); -// This function is shared between blink/web_tests/usb and external/wpt/webusb. -// Only include "/gen/" paths here, which are available in both places. -async function loadChromiumResources() { - const chromiumResources = [ - '/gen/mojo/public/mojom/base/big_buffer.mojom.js', - '/gen/mojo/public/mojom/base/string16.mojom.js', - '/gen/url/mojom/url.mojom.js', - '/gen/services/device/public/mojom/usb_device.mojom.js', - '/gen/services/device/public/mojom/usb_enumeration_options.mojom.js', - '/gen/services/device/public/mojom/usb_manager_client.mojom.js', - '/gen/third_party/blink/public/mojom/usb/web_usb_service.mojom.js', - ]; - await loadMojoResources(chromiumResources); -} - function usb_test(func, name, properties) { promise_test(async () => { assert_implements(navigator.usb, 'missing navigator.usb'); if (navigator.usb.test === undefined) { // Try loading a polyfill for the WebUSB Testing API. if (isChromiumBased) { - await loadChromiumResources(); await loadScript('/resources/chromium/webusb-test.js'); } }
diff --git a/third_party/blink/web_tests/external/wpt/webusb/usbDevice_transferIn-manual.https.html b/third_party/blink/web_tests/external/wpt/webusb/usbDevice_transferIn-manual.https.html new file mode 100644 index 0000000..bd3df7d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webusb/usbDevice_transferIn-manual.https.html
@@ -0,0 +1,142 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title></title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/manual.js"></script> + </head> + <body> + <p> + This test requires a USB device implementing the USB CDC-ACM protocol + configured to loop back TX to RX. For example, this Arduino sketch could + be used: + + <pre> +void setup() { + Serial.begin(115200); + while (!Serial) { + ; + } +} + +void loop() { + if (Serial.available()) { + Serial.write(Serial.read()); + } +} + </pre> + </p> + <script> + manual_usb_test(async (t, device) => { + await device.open(); + t.add_cleanup(async () => { + if (device.opened) { + await device.close(); + } + }); + + await device.selectConfiguration(1); + + let controlInterface = undefined; + for (const iface of device.configuration.interfaces) { + const alternate = iface.alternates[0]; + if (alternate.interfaceClass == 2 && + alternate.interfaceSubclass == 2 && + alternate.interfaceProtocol == 0) { + controlInterface = iface; + break; + } + } + assert_not_equals(controlInterface, undefined, + 'No control interface found.'); + + let dataInterface = undefined; + for (const iface of device.configuration.interfaces) { + const alternate = iface.alternates[0]; + if (alternate.interfaceClass == 10 && + alternate.interfaceSubclass == 0 && + alternate.interfaceProtocol == 0) { + dataInterface = iface; + break; + } + } + assert_not_equals(dataInterface, undefined, 'No data interface found.'); + + await device.claimInterface(controlInterface.interfaceNumber); + await device.claimInterface(dataInterface.interfaceNumber); + + let inEndpoint = undefined; + for (const endpoint of dataInterface.alternate.endpoints) { + if (endpoint.type == 'bulk' && endpoint.direction == 'in') { + inEndpoint = endpoint; + break; + } + } + assert_not_equals(inEndpoint, undefined, 'No IN endpoint found.'); + + let outEndpoint = undefined; + for (const endpoint of dataInterface.alternate.endpoints) { + if (endpoint.type == 'bulk' && endpoint.direction == 'out') { + outEndpoint = endpoint; + break; + } + } + assert_not_equals(outEndpoint, undefined, 'No OUT endpoint found.'); + + // Execute a SET_CONTROL_LINE_STATE command to let the device know the + // host is ready to transmit and receive data. + await device.controlTransferOut({ + requestType: 'class', + recipient: 'interface', + request: 0x22, + value: 0x01, + index: controlInterface.interfaceNumber, + }); + + // Set up two IN transfers which should complete in order. + const transfer1 = + device.transferIn(inEndpoint.endpointNumber, inEndpoint.packetSize); + const transfer2 = + device.transferIn(inEndpoint.endpointNumber, inEndpoint.packetSize); + + // Write a single byte to the port which should be echoed to complete + // transfer1. + let result = await device.transferOut( + outEndpoint.endpointNumber, new Uint8Array(['a'.charCodeAt(0)])); + assert_equals(result.status, 'ok'); + assert_equals(result.bytesWritten, 1); + + result = await transfer1; + assert_equals(result.status, 'ok'); + assert_not_equals(result.data, null); + assert_equals(result.data.byteLength, 1); + assert_equals(result.data.getUint8(0), 'a'.charCodeAt(0)); + + // Set up a third IN transfer which will be canceled when the device is + // closed at the end of the test. + const transfer3 = promise_rejects_dom( + t, 'NetworkError', + device.transferIn(inEndpoint.endpointNumber, + inEndpoint.packetSize)); + + // Write a single byte to the port which should be echoed to complete + // transfer2. + result = await device.transferOut( + outEndpoint.endpointNumber, new Uint8Array(['b'.charCodeAt(0)])); + assert_equals(result.status, 'ok'); + assert_equals(result.bytesWritten, 1); + + result = await transfer2; + assert_equals(result.status, 'ok'); + assert_not_equals(result.data, null); + assert_equals(result.data.byteLength, 1); + assert_equals(result.data.getUint8(0), 'b'.charCodeAt(0)); + + await device.close(); + await transfer3; + }, 'Multiple IN transfers on an endpoint complete in order'); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table-expected.txt b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table-expected.txt index fc3eea8..ac65301b 100644 --- a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table-expected.txt +++ b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table-expected.txt
@@ -12,25 +12,25 @@ PASS All correct nodes found for rect PASS All correct nodes found for rect Check area hits crossing neighbouring table cells -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect +FAIL Unexpected node #0 for rect [170,165], [41,21] - TD#td22 +FAIL Unexpected node #0 for rect [240,265], [41,21] - TD#td43 +FAIL Unexpected node #0 for rect [165,170], [21,41] - TD#td22 +FAIL Unexpected node #0 for rect [265,240], [21,41] - TD#td34 +FAIL Unexpected node #0 for rect [170,170], [41,41] - TD#td22 Check area hits crossing entire table cells -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect -PASS All correct nodes found for rect +FAIL Unexpected node #0 for rect [110,165], [181,21] - TD#td21 +FAIL Unexpected node #0 for rect [165,110], [21,181] - TD#td12 +FAIL Unexpected node #0 for rect [90,90], [121,121] - TD#td11 +FAIL Unexpected node #0 for rect [115,230], [21,131] - TD#td31 +FAIL Unexpected node #0 for rect [230,140], [131,21] - TD#td13 Check area hits on right-to-left table PASS All correct nodes found for rect PASS All correct nodes found for rect -PASS All correct nodes found for rect +FAIL Unexpected node #0 for rect [165,170], [21,41] - TD#td23 Check area hits on flipped (tb-lr) table PASS All correct nodes found for rect PASS All correct nodes found for rect -PASS All correct nodes found for rect +FAIL Unexpected node #0 for rect [110,165], [181,21] - TD#td12 PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table.html b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table.html index e33d8c97..92db01d 100644 --- a/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table.html +++ b/third_party/blink/web_tests/fast/dom/nodesFromRect/nodesFromRect-table.html
@@ -21,6 +21,12 @@ .tblr { -webkit-writing-mode: vertical-lr; } + table td { + background: gray; + } + table:hover td { + background: rgba(0,0,0,0.1); + } </style> <script src="../../../resources/js-test.js"></script> <script src="resources/nodesFromRect.js"></script> @@ -51,7 +57,6 @@ <td id=td44> </table> </div> - <script> function runTest() { @@ -80,41 +85,37 @@ check(290, 290, 41, 41, [e.td44, e.testtable, e.sandbox]); debug('Check area hits crossing neighbouring table cells'); - check(170, 165, 41, 21, [e.td22, e.td23, e.testtable]); - check(240, 265, 41, 21, [e.td43, e.td44, e.testtable]); - check(165, 170, 21, 41, [e.td22, e.td32, e.testtable]); - check(265, 240, 21, 41, [e.td34, e.td44, e.testtable]); - check(170, 170, 41, 41, [e.td22, e.td23, e.td32, e.td33, e.testtable]); + check(170, 165, 41, 21, [e.td23, e.td22, e.testtable]); + check(240, 265, 41, 21, [e.td44, e.td43, e.testtable]); + check(165, 170, 21, 41, [e.td32, e.td22, e.testtable]); + check(265, 240, 21, 41, [e.td44, e.td34, e.testtable]); + check(170, 170, 41, 41, [e.td33, e.td32, e.td23, e.td22, e.testtable]); debug('Check area hits crossing entire table cells'); - check(110, 165, 181, 21, [e.td21, e.td22, e.td23, e.td24, e.testtable]); - check(165, 110, 21, 181, [e.td12, e.td22, e.td32, e.td42, e.testtable]); - check(90, 90, 121, 121, [e.td11, e.td12, e.td13, - e.td21, e.td22, e.td23, - e.td31, e.td32, e.td33, - e.testtable, e.sandbox]); - check(115, 230, 21, 131, [e.td31, e.td41, e.testtable, e.sandbox]); - check(230, 140, 131, 21, [e.td13, e.td14, e.td23, e.td24, e.testtable, e.sandbox]); + check(110, 165, 181, 21, [e.td24, e.td23, e.td22, e.td21, e.testtable]); + check(165, 110, 21, 181, [e.td42, e.td32, e.td22, e.td12, e.testtable]); + check(90, 90, 121, 121, [e.td33, e.td32, e.td31, + e.td23, e.td22, e.td21, + e.td13, e.td12, e.td11, + e.testtable, e.sandbox]); + check(115, 230, 21, 131, [e.td41, e.td31, e.testtable, e.sandbox]); + check(230, 140, 131, 21, [e.td24, e.td23, e.td14, e.td13, e.testtable, e.sandbox]); debug('Check area hits on right-to-left table'); e['testtable'].setAttribute('class', 'rtl'); check(265, 115, 21, 21, [e.td11]); check(165, 165, 21, 21, [e.td23]); - check(165, 170, 21, 41, [e.td23, e.td33, e.testtable]); + check(165, 170, 21, 41, [e.td33, e.td23, e.testtable]); debug('Check area hits on flipped (tb-lr) table'); e['testtable'].setAttribute('class', 'tblr'); check(265, 115, 21, 21, [e.td41]); check(115, 265, 21, 21, [e.td14]); - check(110, 165, 181, 21, [e.td12, e.td22, e.td32, e.td42, e.testtable]); - + check(110, 165, 181, 21, [e.td42, e.td32, e.td22, e.td12, e.testtable]); } runTest(); </script> - - <p id='description'></p> - <span id="console"></span> </body> </html>
diff --git a/third_party/blink/web_tests/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected.html b/third_party/blink/web_tests/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected.html new file mode 100644 index 0000000..18d06f0f --- /dev/null +++ b/third_party/blink/web_tests/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected.html
@@ -0,0 +1,19 @@ + +<!DOCTYPE html> +<meta name="color-scheme" content="light dark"> +<script src="../../resources/common.js"></script> +<script src="../../../../resources/run-after-layout-and-paint.js"></script> +<body> +<select multiple disabled autofocus> + <optgroup label="unstyled"> + <option selected>selected</option> + <option id="hoverTarget">unselected (hovered)</option + </optgroup> +</select> +<script> + runAfterLayoutAndPaint(function () { + let hoverTarget = document.getElementById('hoverTarget'); + hoverOverElement(hoverTarget); + }, true); +</script> +</body>
diff --git a/third_party/blink/web_tests/http/tests/css/resources/referrer-check.php b/third_party/blink/web_tests/http/tests/css/resources/referrer-check.php index 69483e0..7a517de69 100644 --- a/third_party/blink/web_tests/http/tests/css/resources/referrer-check.php +++ b/third_party/blink/web_tests/http/tests/css/resources/referrer-check.php
@@ -31,7 +31,7 @@ "document" => "/css/css-resources-referrer.html", "sheet" => "/css/resources/css-resources-referrer.css", "importedSheet" => "/css/resources/css-resources-referrer-import.css", - "iframe" => "/from/iframe.html" + "iframe" => "/css/css-resources-referrer-srcdoc.html" ); $from = $_GET["from"];
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements-expected.txt index 7d8fad9..c8b42e8 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements-expected.txt
@@ -39,6 +39,11 @@ [$#inspected:after$] { (<style>) content: "AFTER"; +======== Pseudo ::grammar-error element ======== +[expanded] +#inspected::grammar-error { (<style>) + color: teal; + ======== Pseudo ::marker element ======== [expanded] [$#inspected::marker$] { (<style>) @@ -53,6 +58,11 @@ text-align: start !important; text-align-last: start !important; +======== Pseudo ::spelling-error element ======== +[expanded] +#inspected::spelling-error { (<style>) + color: orange; + ======== Pseudo ::target-text element ======== [expanded] #inspected::target-text { (<style>)
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements.js b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements.js index d1f44e8c..ddf302f 100644 --- a/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements.js +++ b/third_party/blink/web_tests/http/tests/devtools/elements/styles-2/pseudo-elements.js
@@ -12,6 +12,14 @@ color: green; } + #inspected::spelling-error { + color: orange; + } + + #inspected::grammar-error { + color: teal; + } + #inspected { display: list-item; }
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/native-file-system-origin-trial-interfaces.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/native-file-system-origin-trial-interfaces.html deleted file mode 100644 index 05cc05c2..0000000 --- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/native-file-system-origin-trial-interfaces.html +++ /dev/null
@@ -1,21 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<!-- Generate token with the command: -generate_token.py http://127.0.0.1:8000 NativeFileSystem2 --expire-timestamp=2000000000 --- --> -<meta http-equiv="origin-trial" content="AmmBxJTKsdbb26LLpdAVmIKBvVxU6fKf6UZDoMXiD+b9bULkOHzUTtZ4dNwHMhI7tZzO+tNgmWCzNK2MLoZsvAEAAABZeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiTmF0aXZlRmlsZVN5c3RlbTIiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0="> -<title>Native File System API - interfaces exposed by origin trial</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/origin-trials-helper.js"></script> -<script> -test(t => { - OriginTrialsHelper.check_properties_exist(this, { - 'FileSystemHandle': ['kind', 'name', 'queryPermission', 'requestPermission'], - 'FileSystemFileHandle': ['getFile', 'createWritable'], - 'FileSystemDirectoryHandle': ['getFileHandle', 'getDirectoryHandle', 'entries', 'removeEntry'], - 'FileSystemWritableFileStream': ['write', 'truncate', 'close', 'seek'], - 'global': ['showOpenFilePicker', 'showSaveFilePicker', 'showDirectoryPicker'], - }); -}, 'Native File System API interfaces and properties in Origin-Trial enabled document.'); -</script>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor.any-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor.any-expected.txt new file mode 100644 index 0000000..e1cae2c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor.any-expected.txt
@@ -0,0 +1,644 @@ +This is a testharness.js-based test. +Found 576 tests; 426 PASS, 150 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Parsing: <https://test:@test> against <about:blank> +PASS Parsing: <https://:@test> against <about:blank> +FAIL Parsing: <non-special://test:@test/x> against <about:blank> assert_equals: href expected "non-special://test@test/x" but got "non-special://test:@test/x" +FAIL Parsing: <non-special://:@test/x> against <about:blank> assert_equals: href expected "non-special://test/x" but got "non-special://:@test/x" +PASS Parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Parsing: < foo.com > against <http://example.org/foo/bar> +PASS Parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +FAIL Parsing: <lolscheme:x x#x x> against <about:blank> assert_equals: href expected "lolscheme:x x#x%20x" but got "lolscheme:x x#x x" +PASS Parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:b/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: /c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:fifty-two/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:999999/c> against <http://example.org/foo/bar> +FAIL Parsing: <non-special://f:999999/c> against <http://example.org/foo/bar> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://f: 21 / b ? d # e > against <http://example.org/foo/bar> +PASS Parsing: <> against <http://example.org/foo/bar> +PASS Parsing: < > against <http://example.org/foo/bar> +PASS Parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <:> against <http://example.org/foo/bar> +PASS Parsing: <:a> against <http://example.org/foo/bar> +PASS Parsing: <:/> against <http://example.org/foo/bar> +PASS Parsing: <:\> against <http://example.org/foo/bar> +PASS Parsing: <:#> against <http://example.org/foo/bar> +PASS Parsing: <#> against <http://example.org/foo/bar> +PASS Parsing: <#/> against <http://example.org/foo/bar> +PASS Parsing: <#\> against <http://example.org/foo/bar> +PASS Parsing: <#;?> against <http://example.org/foo/bar> +PASS Parsing: <?> against <http://example.org/foo/bar> +PASS Parsing: </> against <http://example.org/foo/bar> +PASS Parsing: <:23> against <http://example.org/foo/bar> +PASS Parsing: </:23> against <http://example.org/foo/bar> +PASS Parsing: <::> against <http://example.org/foo/bar> +PASS Parsing: <::23> against <http://example.org/foo/bar> +FAIL Parsing: <foo://> against <http://example.org/foo/bar> assert_equals: pathname expected "" but got "//" +PASS Parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <foo:/> against <http://example.org/foo/bar> +PASS Parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +FAIL Parsing: <foo://///////> against <http://example.org/foo/bar> assert_equals: pathname expected "///////" but got "/////////" +FAIL Parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> assert_equals: pathname expected "///////bar.com/" but got "/////////bar.com/" +FAIL Parsing: <foo:////://///> against <http://example.org/foo/bar> assert_equals: pathname expected "//://///" but got "////://///" +PASS Parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Parsing: <http://[1::2]:3:4> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file://example:1/> against <about:blank> +PASS Parsing: <file://example:test/> against <about:blank> +PASS Parsing: <file://example%/> against <about:blank> +PASS Parsing: <file://[example]/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Parsing: <#β> against <http://example.org/foo/bar> +PASS Parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Parsing: <tel:1234567890> against <http://example.org/foo/bar> +FAIL Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> assert_equals: host expected "example.com" but got "" +FAIL Parsing: <file:c:\foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:/foo/bar.html" but got "file:///tmp/mock/c:/foo/bar.html" +FAIL Parsing: < File:c|////foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:////foo/bar.html" but got "file:///tmp/mock/c%7C////foo/bar.html" +FAIL Parsing: <C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///tmp/mock/C%7C/foo/bar" +FAIL Parsing: </C|\foo\bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///C%7C/foo/bar" +FAIL Parsing: <//C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file://c%7C/foo/bar" +PASS Parsing: <//server/file> against <file:///tmp/mock/path> +PASS Parsing: <\\server\file> against <file:///tmp/mock/path> +PASS Parsing: </\server/file> against <file:///tmp/mock/path> +PASS Parsing: <file:///foo/bar.txt> against <file:///tmp/mock/path> +PASS Parsing: <file:///home/me> against <file:///tmp/mock/path> +PASS Parsing: <//> against <file:///tmp/mock/path> +PASS Parsing: <///> against <file:///tmp/mock/path> +PASS Parsing: <///test> against <file:///tmp/mock/path> +PASS Parsing: <file://test> against <file:///tmp/mock/path> +FAIL Parsing: <file://localhost> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/test> against <file:///tmp/mock/path> assert_equals: href expected "file:///test" but got "file://localhost/test" +PASS Parsing: <test> against <file:///tmp/mock/path> +PASS Parsing: <file:test> against <file:///tmp/mock/path> +PASS Parsing: <http://example.com/././foo> against <about:blank> +PASS Parsing: <http://example.com/./.foo> against <about:blank> +PASS Parsing: <http://example.com/foo/.> against <about:blank> +PASS Parsing: <http://example.com/foo/./> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/%2e> against <about:blank> +FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/%2e%2" but got "http://example.com/foo/.%2" +FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/%2e.bar" but got "http://example.com/..bar" +PASS Parsing: <http://example.com////../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Parsing: <http://example.com/foo> against <about:blank> +PASS Parsing: <http://example.com/%20foo> against <about:blank> +PASS Parsing: <http://example.com/foo%> against <about:blank> +PASS Parsing: <http://example.com/foo%2> against <about:blank> +PASS Parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Parsing: <http://example.com/foo%2©zbar> against <about:blank> +FAIL Parsing: <http://example.com/foo%41%7a> against <about:blank> assert_equals: href expected "http://example.com/foo%41%7a" but got "http://example.com/fooAz" +PASS Parsing: <http://example.com/foo %91> against <about:blank> +FAIL Parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Parsing: <http://example.com/foo bar> against <about:blank> +PASS Parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Parsing: <http://example.com/你好你好> against <about:blank> +PASS Parsing: <http://example.com/‥/foo> against <about:blank> +PASS Parsing: <http://example.com//foo> against <about:blank> +PASS Parsing: <http://example.com//foo//bar> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected "data:test#%20%C2%BB" but got "data:test# %C2%BB" +PASS Parsing: <http://www.google.com> against <about:blank> +PASS Parsing: <http://192.0x00A80001> against <about:blank> +FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo%2Ehtml" but got "http://www/foo.html" +PASS Parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Parsing: <http://user:pass@/> against <about:blank> +PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Parsing: <http://foo:80/> against <about:blank> +PASS Parsing: <http://foo:81/> against <about:blank> +FAIL Parsing: <httpa://foo:80/> against <about:blank> assert_equals: host expected "foo:80" but got "" +PASS Parsing: <http://foo:-80/> against <about:blank> +PASS Parsing: <https://foo:443/> against <about:blank> +PASS Parsing: <https://foo:80/> against <about:blank> +PASS Parsing: <ftp://foo:21/> against <about:blank> +PASS Parsing: <ftp://foo:80/> against <about:blank> +FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got "" +FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got "" +PASS Parsing: <ws://foo:80/> against <about:blank> +PASS Parsing: <ws://foo:81/> against <about:blank> +PASS Parsing: <ws://foo:443/> against <about:blank> +PASS Parsing: <ws://foo:815/> against <about:blank> +PASS Parsing: <wss://foo:80/> against <about:blank> +PASS Parsing: <wss://foo:81/> against <about:blank> +PASS Parsing: <wss://foo:443/> against <about:blank> +PASS Parsing: <wss://foo:815/> against <about:blank> +PASS Parsing: <http:/example.com/> against <about:blank> +PASS Parsing: <ftp:/example.com/> against <about:blank> +PASS Parsing: <https:/example.com/> against <about:blank> +PASS Parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Parsing: <file:/example.com/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <about:blank> +PASS Parsing: <gopher:/example.com/> against <about:blank> +PASS Parsing: <ws:/example.com/> against <about:blank> +PASS Parsing: <wss:/example.com/> against <about:blank> +PASS Parsing: <data:/example.com/> against <about:blank> +PASS Parsing: <javascript:/example.com/> against <about:blank> +PASS Parsing: <mailto:/example.com/> against <about:blank> +PASS Parsing: <http:example.com/> against <about:blank> +PASS Parsing: <ftp:example.com/> against <about:blank> +PASS Parsing: <https:example.com/> against <about:blank> +PASS Parsing: <madeupscheme:example.com/> against <about:blank> +PASS Parsing: <ftps:example.com/> against <about:blank> +PASS Parsing: <gopher:example.com/> against <about:blank> +PASS Parsing: <ws:example.com/> against <about:blank> +PASS Parsing: <wss:example.com/> against <about:blank> +PASS Parsing: <data:example.com/> against <about:blank> +PASS Parsing: <javascript:example.com/> against <about:blank> +PASS Parsing: <mailto:example.com/> against <about:blank> +PASS Parsing: <http:@www.example.com> against <about:blank> +PASS Parsing: <http:/@www.example.com> against <about:blank> +PASS Parsing: <http://@www.example.com> against <about:blank> +PASS Parsing: <http:a:b@www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Parsing: <http://a:b@www.example.com> against <about:blank> +PASS Parsing: <http://@pple.com> against <about:blank> +PASS Parsing: <http::b@www.example.com> against <about:blank> +PASS Parsing: <http:/:b@www.example.com> against <about:blank> +PASS Parsing: <http://:b@www.example.com> against <about:blank> +PASS Parsing: <http:/:@/www.example.com> against <about:blank> +PASS Parsing: <http://user@/www.example.com> against <about:blank> +PASS Parsing: <http:@/www.example.com> against <about:blank> +PASS Parsing: <http:/@/www.example.com> against <about:blank> +PASS Parsing: <http://@/www.example.com> against <about:blank> +PASS Parsing: <https:@/www.example.com> against <about:blank> +PASS Parsing: <http:a:b@/www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@/www.example.com> against <about:blank> +PASS Parsing: <http://a:b@/www.example.com> against <about:blank> +PASS Parsing: <http::@/www.example.com> against <about:blank> +PASS Parsing: <http:a:@www.example.com> against <about:blank> +PASS Parsing: <http:/a:@www.example.com> against <about:blank> +PASS Parsing: <http://a:@www.example.com> against <about:blank> +PASS Parsing: <http://www.@pple.com> against <about:blank> +PASS Parsing: <http:@:www.example.com> against <about:blank> +PASS Parsing: <http:/@:www.example.com> against <about:blank> +PASS Parsing: <http://@:www.example.com> against <about:blank> +PASS Parsing: <http://:@www.example.com> against <about:blank> +PASS Parsing: </> against <http://www.example.com/test> +PASS Parsing: </test.txt> against <http://www.example.com/test> +PASS Parsing: <.> against <http://www.example.com/test> +PASS Parsing: <..> against <http://www.example.com/test> +PASS Parsing: <test.txt> against <http://www.example.com/test> +PASS Parsing: <./test.txt> against <http://www.example.com/test> +PASS Parsing: <../test.txt> against <http://www.example.com/test> +PASS Parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Parsing: <../../test.txt> against <http://www.example.com/test> +PASS Parsing: <中/test.txt> against <http://www.example.com/test> +PASS Parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Parsing: <file:...> against <http://www.example.com/test> +PASS Parsing: <file:..> against <http://www.example.com/test> +PASS Parsing: <file:a> against <http://www.example.com/test> +PASS Parsing: <http://ExAmPlE.CoM> against <http://other.com/> +FAIL Parsing: <http://example example.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://Goo%20 goo%7C|.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://[]> against <http://other.com/> +PASS Parsing: <http://[:]> against <http://other.com/> +FAIL Parsing: <http://GOO goo.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Parsing: <http://zyx.com> against <http://other.com/> +PASS Parsing: <http://%ef%b7%90zyx.com> against <http://other.com/> +PASS Parsing: <https://�> against <about:blank> +PASS Parsing: <https://%EF%BF%BD> against <about:blank> +PASS Parsing: <https://x/�?�#�> against <about:blank> +PASS Parsing: <http://Go.com> against <http://other.com/> +FAIL Parsing: <http://%41.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://%ef%bc%85%ef%bc%94%ef%bc%91.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://%00.com> against <http://other.com/> +PASS Parsing: <http://%ef%bc%85%ef%bc%90%ef%bc%90.com> against <http://other.com/> +PASS Parsing: <http://你好你好> against <http://other.com/> +FAIL Parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: href expected "https://xn--fa-hia.example/" but got "https://fass.example/" +FAIL Parsing: <sc://faß.ExAmPlE/> against <about:blank> assert_equals: host expected "fa%C3%9F.ExAmPlE" but got "" +PASS Parsing: <http://%zz%66%a.com> against <http://other.com/> +PASS Parsing: <http://%25> against <http://other.com/> +PASS Parsing: <http://hello%00> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Parsing: <http://192.168.0.257> against <http://other.com/> +PASS Parsing: <http://%3g%78%63%30%2e%30%32%35%30%2E.01> against <http://other.com/> +FAIL Parsing: <http://192.168.0.1 hello> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <https://x x:12> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Parsing: <http://./> against <about:blank> +PASS Parsing: <http://../> against <about:blank> +PASS Parsing: <http://0..0x300/> against <about:blank> +PASS Parsing: <http://[www.google.com]/> against <about:blank> +PASS Parsing: <http://[google.com]> against <http://other.com/> +PASS Parsing: <http://[::1.2.3.4x]> against <http://other.com/> +FAIL Parsing: <http://[::1.2.3.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.2.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Parsing: <#> against <test:test> +PASS Parsing: <#x> against <mailto:x@x.com> +PASS Parsing: <#x> against <data:,> +PASS Parsing: <#x> against <about:blank> +PASS Parsing: <#> against <test:test?test> +PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Parsing: <http://host/?'> against <about:blank> +FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got "" +PASS Parsing: </some/path> against <http://user@example.org/smth> +PASS Parsing: <> against <http://user:pass@example.org:21/smth> +PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Parsing: <i> against <sc:sd> +PASS Parsing: <i> against <sc:sd/sd> +PASS Parsing: <i> against <sc:/pa/pa> +FAIL Parsing: <i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/i" but got "///pa/i" +PASS Parsing: <../i> against <sc:sd> +PASS Parsing: <../i> against <sc:sd/sd> +PASS Parsing: <../i> against <sc:/pa/pa> +FAIL Parsing: <../i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <../i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: </i> against <sc:sd> +PASS Parsing: </i> against <sc:sd/sd> +PASS Parsing: </i> against <sc:/pa/pa> +FAIL Parsing: </i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: </i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: <?i> against <sc:sd> +PASS Parsing: <?i> against <sc:sd/sd> +PASS Parsing: <?i> against <sc:/pa/pa> +FAIL Parsing: <?i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <?i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +PASS Parsing: <#i> against <sc:sd> +PASS Parsing: <#i> against <sc:sd/sd> +PASS Parsing: <#i> against <sc:/pa/pa> +FAIL Parsing: <#i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <#i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +FAIL Parsing: <about:/../> against <about:blank> assert_equals: href expected "about:/" but got "about:/../" +FAIL Parsing: <data:/../> against <about:blank> assert_equals: href expected "data:/" but got "data:/../" +FAIL Parsing: <javascript:/../> against <about:blank> assert_equals: href expected "javascript:/" but got "javascript:/../" +FAIL Parsing: <mailto:/../> against <about:blank> assert_equals: href expected "mailto:/" but got "mailto:/../" +FAIL Parsing: <sc://ñ.test/> against <about:blank> assert_equals: host expected "%C3%B1.test" but got "" +FAIL Parsing: <sc://\0/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc:// /> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://%/> against <about:blank> assert_equals: host expected "%" but got "" +FAIL Parsing: <sc://@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://te@s:t@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:12/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://[/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://\/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://]/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Parsing: <sc:\../> against <about:blank> +PASS Parsing: <sc::a@example.net> against <about:blank> +PASS Parsing: <wow:%NBD> against <about:blank> +PASS Parsing: <wow:%1G> against <about:blank> +FAIL Parsing: <wow:> against <about:blank> assert_equals: href expected "wow:%EF%BF%BF" but got "wow:%EF%BF%BD" +FAIL Parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://a^b> against <about:blank> +FAIL Parsing: <non-special://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a^b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> assert_equals: host expected "%1F!\"$&'()*+,-.;=_`{|}~" but got "" +PASS Parsing: <ftp://example.com%80/> against <about:blank> +PASS Parsing: <ftp://example.com%A0/> against <about:blank> +PASS Parsing: <https://example.com%80/> against <about:blank> +PASS Parsing: <https://example.com%A0/> against <about:blank> +PASS Parsing: <ftp://%e2%98%83> against <about:blank> +PASS Parsing: <https://%e2%98%83> against <about:blank> +PASS Parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <https://example.org/foo/bar> +PASS Parsing: <sc:> against <https://example.org/foo/bar> +PASS Parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Parsing: <http://192.168.257> against <http://other.com/> +PASS Parsing: <http://192.168.257.com> against <http://other.com/> +PASS Parsing: <http://256> against <http://other.com/> +PASS Parsing: <http://256.com> against <http://other.com/> +PASS Parsing: <http://999999999> against <http://other.com/> +PASS Parsing: <http://999999999.com> against <http://other.com/> +PASS Parsing: <http://10000000000> against <http://other.com/> +PASS Parsing: <http://10000000000.com> against <http://other.com/> +PASS Parsing: <http://4294967295> against <http://other.com/> +PASS Parsing: <http://4294967296> against <http://other.com/> +PASS Parsing: <http://0xffffffff> against <http://other.com/> +PASS Parsing: <http://0xffffffff1> against <http://other.com/> +PASS Parsing: <http://256.256.256.256> against <http://other.com/> +PASS Parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Parsing: <https://0x.0x.0> against <about:blank> +PASS Parsing: <https://0x100000000/test> against <about:blank> +PASS Parsing: <https://256.0.0.1/test> against <about:blank> +PASS Parsing: <file:///C%3A/> against <about:blank> +PASS Parsing: <file:///C%7C/> against <about:blank> +PASS Parsing: <pix/submit.gif> against <file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html> +FAIL Parsing: <..> against <file:///C:/> assert_equals: href expected "file:///C:/" but got "file:///" +PASS Parsing: <..> against <file:///> +FAIL Parsing: </> against <file:///C:/a/b> assert_equals: href expected "file:///C:/" but got "file:///" +FAIL Parsing: </> against <file://h/C:/a/b> assert_equals: href expected "file://h/C:/" but got "file:///" +FAIL Parsing: </> against <file://h/a/b> assert_equals: href expected "file://h/" but got "file:///" +FAIL Parsing: <//d:> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <//d:/..> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +PASS Parsing: <..> against <file:///ab:/> +PASS Parsing: <..> against <file:///1:/> +PASS Parsing: <> against <file:///test?test#test> +PASS Parsing: <file:> against <file:///test?test#test> +PASS Parsing: <?x> against <file:///test?test#test> +PASS Parsing: <file:?x> against <file:///test?test#test> +PASS Parsing: <#x> against <file:///test?test#test> +PASS Parsing: <file:#x> against <file:///test?test#test> +FAIL Parsing: <file:\\//> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\?fox> against <about:blank> assert_equals: href expected "file:////?fox" but got "file:///?fox" +FAIL Parsing: <file:\\\\#guppy> against <about:blank> assert_equals: href expected "file:////#guppy" but got "file:///#guppy" +PASS Parsing: <file://spider///> against <about:blank> +FAIL Parsing: <file:\\localhost//> against <about:blank> assert_equals: href expected "file:////" but got "file://localhost//" +PASS Parsing: <file:///localhost//cat> against <about:blank> +FAIL Parsing: <file://\/localhost//cat> against <about:blank> assert_equals: href expected "file:////localhost//cat" but got "file:///localhost//cat" +FAIL Parsing: <file://localhost//a//../..//> against <about:blank> assert_equals: href expected "file://///" but got "file://localhost///" +FAIL Parsing: </////mouse> against <file:///elephant> assert_equals: href expected "file://///mouse" but got "file:///mouse" +PASS Parsing: <\//pig> against <file://lion/> +FAIL Parsing: <\/localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +FAIL Parsing: <//localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +PASS Parsing: </..//localhost//pig> against <file://lion/> +PASS Parsing: <file://> against <file://ape/> +PASS Parsing: </rooibos> against <file://tea/> +PASS Parsing: </?chai> against <file://tea/> +FAIL Parsing: <C|> against <file://host/dir/file> assert_equals: href expected "file://host/C:" but got "file://host/dir/C%7C" +FAIL Parsing: <C|> against <file://host/D:/dir1/dir2/file> assert_equals: href expected "file://host/C:" but got "file://host/D:/dir1/dir2/C%7C" +FAIL Parsing: <C|#> against <file://host/dir/file> assert_equals: href expected "file://host/C:#" but got "file://host/dir/C%7C#" +FAIL Parsing: <C|?> against <file://host/dir/file> assert_equals: href expected "file://host/C:?" but got "file://host/dir/C%7C?" +FAIL Parsing: <C|/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C| +/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C|\> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +PASS Parsing: <C> against <file://host/dir/file> +FAIL Parsing: <C|a> against <file://host/dir/file> assert_equals: href expected "file://host/dir/C|a" but got "file://host/dir/C%7Ca" +PASS Parsing: </c:/foo/bar> against <file:///c:/baz/qux> +FAIL Parsing: </c|/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///c%7C/foo/bar" +PASS Parsing: <file:\c:\foo\bar> against <file:///c:/baz/qux> +PASS Parsing: </c:/foo/bar> against <file://host/path> +PASS Parsing: <file://example.net/C:/> against <about:blank> +PASS Parsing: <file://1.2.3.4/C:/> against <about:blank> +PASS Parsing: <file://[1::8]/C:/> against <about:blank> +FAIL Parsing: <file:/C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file:///C%7C/" +FAIL Parsing: <file://C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file://c%7C/" +PASS Parsing: <file:> against <about:blank> +PASS Parsing: <file:?q=v> against <about:blank> +PASS Parsing: <file:#frag> against <about:blank> +PASS Parsing: <file:///Y:> against <about:blank> +PASS Parsing: <file:///Y:/> against <about:blank> +PASS Parsing: <file:///./Y> against <about:blank> +PASS Parsing: <file:///./Y:> against <about:blank> +PASS Parsing: <\\\.\Y:> against <about:blank> +PASS Parsing: <file:///y:> against <about:blank> +PASS Parsing: <file:///y:/> against <about:blank> +PASS Parsing: <file:///./y> against <about:blank> +PASS Parsing: <file:///./y:> against <about:blank> +PASS Parsing: <\\\.\y:> against <about:blank> +FAIL Parsing: <file://localhost//a//../..//foo> against <about:blank> assert_equals: href expected "file://///foo" but got "file://localhost///foo" +FAIL Parsing: <file://localhost////foo> against <about:blank> assert_equals: href expected "file://////foo" but got "file://localhost////foo" +FAIL Parsing: <file:////foo> against <about:blank> assert_equals: href expected "file:////foo" but got "file:///foo" +PASS Parsing: <file:///one/two> against <file:///> +FAIL Parsing: <file:////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <//one/two> against <file:///> +PASS Parsing: <///one/two> against <file:///> +FAIL Parsing: <////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <file:///.//> against <file:////> +PASS Parsing: <file:.//p> against <about:blank> +PASS Parsing: <file:/.//p> against <about:blank> +PASS Parsing: <http://[1:0::]> against <http://example.net/> +PASS Parsing: <http://[0:1:2:3:4:5:6:7:8]> against <http://example.net/> +PASS Parsing: <https://[0::0::0]> against <about:blank> +PASS Parsing: <https://[0:.0]> against <about:blank> +PASS Parsing: <https://[0:0:]> against <about:blank> +PASS Parsing: <https://[0:1:2:3:4:5:6:7.0.0.0.1]> against <about:blank> +PASS Parsing: <https://[0:1.00.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.290.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.23.23]> against <about:blank> +PASS Parsing: <http://?> against <about:blank> +PASS Parsing: <http://#> against <about:blank> +PASS Parsing: <http://f:4294967377/c> against <http://example.org/> +PASS Parsing: <http://f:18446744073709551697/c> against <http://example.org/> +PASS Parsing: <http://f:340282366920938463463374607431768211537/c> against <http://example.org/> +FAIL Parsing: <sc://ñ> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ?x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ#x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://?> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <sc://#> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <///> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////x/> against <sc://x/> assert_equals: href expected "sc:////x/" but got "sc://x/" +FAIL Parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> assert_equals: host expected "foobar.com" but got "" +FAIL Parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> assert_equals: username expected "user" but got "" +FAIL Parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> assert_equals: host expected "10.10.10.10:7777" but got "" +FAIL Parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <rsync://foo@host:911/sup> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <git://github.com/foo/bar.git> against <about:blank> assert_equals: host expected "github.com" but got "" +FAIL Parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> assert_equals: host expected "myserver.com:6999" but got "" +FAIL Parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> assert_equals: host expected "fw.example.org:9999" but got "" +FAIL Parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> assert_equals: host expected "localhost:389" but got "" +FAIL Parsing: <git+https://github.com/foo/bar> against <about:blank> assert_equals: host expected "github.com" but got "" +PASS Parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +FAIL Parsing: <non-spec:/.//> against <about:blank> assert_equals: pathname expected "//" but got "/.//" +FAIL Parsing: <non-spec:/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/..//" +FAIL Parsing: <non-spec:/a/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/a/..//" +FAIL Parsing: <non-spec:/.//path> against <about:blank> assert_equals: pathname expected "//path" but got "/.//path" +FAIL Parsing: <non-spec:/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <non-spec:/a/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/a/..//path" +FAIL Parsing: </.//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: </..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <a/..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//p" but got "non-spec:/..//p" +FAIL Parsing: <path> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <../path> against <non-spec:/.//p> assert_equals: href expected "non-spec:/path" but got "non-spec:/./path" +FAIL Parsing: <non-special://%E2%80%A0/> against <about:blank> assert_equals: host expected "%E2%80%A0" but got "" +FAIL Parsing: <non-special://H%4fSt/path> against <about:blank> assert_equals: host expected "H%4fSt" but got "" +FAIL Parsing: <non-special://[1:2:0:0:5:0:0:0]/> against <about:blank> assert_equals: href expected "non-special://[1:2:0:0:5::]/" but got "non-special://[1:2:0:0:5:0:0:0]/" +FAIL Parsing: <non-special://[1:2:0:0:0:0:0:3]/> against <about:blank> assert_equals: href expected "non-special://[1:2::3]/" but got "non-special://[1:2:0:0:0:0:0:3]/" +FAIL Parsing: <non-special://[1:2::3]:80/> against <about:blank> assert_equals: host expected "[1:2::3]:80" but got "" +FAIL Parsing: <non-special://[:80/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <blob:https://example.com:443/> against <about:blank> +PASS Parsing: <blob:d3958f5c-0777-0845-9dcf-2cb28783acaf> against <about:blank> +PASS Parsing: <http://0177.0.0.0189> against <about:blank> +PASS Parsing: <http://0x7f.0.0.0x7g> against <about:blank> +PASS Parsing: <http://0X7F.0.0.0X7G> against <about:blank> +PASS Parsing: <http://[::127.0.0.0.1]> against <about:blank> +PASS Parsing: <http://[0:1:0:1:0:1:0:1]> against <about:blank> +PASS Parsing: <http://[1:0:1:0:1:0:1:0]> against <about:blank> +PASS Parsing: <http://example.org/test?"> against <about:blank> +PASS Parsing: <http://example.org/test?#> against <about:blank> +PASS Parsing: <http://example.org/test?<> against <about:blank> +PASS Parsing: <http://example.org/test?>> against <about:blank> +PASS Parsing: <http://example.org/test?⌣> against <about:blank> +PASS Parsing: <http://example.org/test?%23%23> against <about:blank> +PASS Parsing: <http://example.org/test?%GH> against <about:blank> +PASS Parsing: <http://example.org/test?a#%EF> against <about:blank> +PASS Parsing: <http://example.org/test?a#%GH> against <about:blank> +PASS Parsing: <a> against <about:blank> +PASS Parsing: <a/> against <about:blank> +PASS Parsing: <a//> against <about:blank> +PASS Parsing: <test-a-colon.html> against <a:> +PASS Parsing: <test-a-colon-b.html> against <a:b> +PASS Parsing: <test-a-colon-slash.html> against <a:/> +FAIL Parsing: <test-a-colon-slash-slash.html> against <a://> Failed to construct 'URL': Invalid URL +PASS Parsing: <test-a-colon-slash-b.html> against <a:/b> +FAIL Parsing: <test-a-colon-slash-slash-b.html> against <a://b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://example.org/test?a#b\0c> against <about:blank> assert_equals: href expected "http://example.org/test?a#b%00c" but got "http://example.org/test?a#bc" +FAIL Parsing: <non-spec://example.org/test?a#b\0c> against <about:blank> assert_equals: host expected "example.org" but got "" +PASS Parsing: <non-spec:/test?a#b\0c> against <about:blank> +PASS Parsing: <10.0.0.7:8080/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a!@$*=/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a1234567890-+.:foo/bar> against <http://example.com/dir/file> +PASS Parsing: <file://ab/p> against <about:blank> +PASS Parsing: <file://a%C2%ADb/p> against <about:blank> +PASS Parsing: <file:///p> against <about:blank> +PASS Parsing: <file://%C2%AD/p> against <about:blank> +FAIL Parsing: <file://xn--/p> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <#link> against <https://example.org/##link> +PASS Parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor.any.worker-expected.txt new file mode 100644 index 0000000..e1cae2c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor.any.worker-expected.txt
@@ -0,0 +1,644 @@ +This is a testharness.js-based test. +Found 576 tests; 426 PASS, 150 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Parsing: <https://test:@test> against <about:blank> +PASS Parsing: <https://:@test> against <about:blank> +FAIL Parsing: <non-special://test:@test/x> against <about:blank> assert_equals: href expected "non-special://test@test/x" but got "non-special://test:@test/x" +FAIL Parsing: <non-special://:@test/x> against <about:blank> assert_equals: href expected "non-special://test/x" but got "non-special://:@test/x" +PASS Parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Parsing: < foo.com > against <http://example.org/foo/bar> +PASS Parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +FAIL Parsing: <lolscheme:x x#x x> against <about:blank> assert_equals: href expected "lolscheme:x x#x%20x" but got "lolscheme:x x#x x" +PASS Parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:b/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: /c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:fifty-two/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:999999/c> against <http://example.org/foo/bar> +FAIL Parsing: <non-special://f:999999/c> against <http://example.org/foo/bar> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://f: 21 / b ? d # e > against <http://example.org/foo/bar> +PASS Parsing: <> against <http://example.org/foo/bar> +PASS Parsing: < > against <http://example.org/foo/bar> +PASS Parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <:> against <http://example.org/foo/bar> +PASS Parsing: <:a> against <http://example.org/foo/bar> +PASS Parsing: <:/> against <http://example.org/foo/bar> +PASS Parsing: <:\> against <http://example.org/foo/bar> +PASS Parsing: <:#> against <http://example.org/foo/bar> +PASS Parsing: <#> against <http://example.org/foo/bar> +PASS Parsing: <#/> against <http://example.org/foo/bar> +PASS Parsing: <#\> against <http://example.org/foo/bar> +PASS Parsing: <#;?> against <http://example.org/foo/bar> +PASS Parsing: <?> against <http://example.org/foo/bar> +PASS Parsing: </> against <http://example.org/foo/bar> +PASS Parsing: <:23> against <http://example.org/foo/bar> +PASS Parsing: </:23> against <http://example.org/foo/bar> +PASS Parsing: <::> against <http://example.org/foo/bar> +PASS Parsing: <::23> against <http://example.org/foo/bar> +FAIL Parsing: <foo://> against <http://example.org/foo/bar> assert_equals: pathname expected "" but got "//" +PASS Parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <foo:/> against <http://example.org/foo/bar> +PASS Parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +FAIL Parsing: <foo://///////> against <http://example.org/foo/bar> assert_equals: pathname expected "///////" but got "/////////" +FAIL Parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> assert_equals: pathname expected "///////bar.com/" but got "/////////bar.com/" +FAIL Parsing: <foo:////://///> against <http://example.org/foo/bar> assert_equals: pathname expected "//://///" but got "////://///" +PASS Parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Parsing: <http://[1::2]:3:4> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file://example:1/> against <about:blank> +PASS Parsing: <file://example:test/> against <about:blank> +PASS Parsing: <file://example%/> against <about:blank> +PASS Parsing: <file://[example]/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Parsing: <#β> against <http://example.org/foo/bar> +PASS Parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Parsing: <tel:1234567890> against <http://example.org/foo/bar> +FAIL Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> assert_equals: host expected "example.com" but got "" +FAIL Parsing: <file:c:\foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:/foo/bar.html" but got "file:///tmp/mock/c:/foo/bar.html" +FAIL Parsing: < File:c|////foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:////foo/bar.html" but got "file:///tmp/mock/c%7C////foo/bar.html" +FAIL Parsing: <C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///tmp/mock/C%7C/foo/bar" +FAIL Parsing: </C|\foo\bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///C%7C/foo/bar" +FAIL Parsing: <//C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file://c%7C/foo/bar" +PASS Parsing: <//server/file> against <file:///tmp/mock/path> +PASS Parsing: <\\server\file> against <file:///tmp/mock/path> +PASS Parsing: </\server/file> against <file:///tmp/mock/path> +PASS Parsing: <file:///foo/bar.txt> against <file:///tmp/mock/path> +PASS Parsing: <file:///home/me> against <file:///tmp/mock/path> +PASS Parsing: <//> against <file:///tmp/mock/path> +PASS Parsing: <///> against <file:///tmp/mock/path> +PASS Parsing: <///test> against <file:///tmp/mock/path> +PASS Parsing: <file://test> against <file:///tmp/mock/path> +FAIL Parsing: <file://localhost> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/test> against <file:///tmp/mock/path> assert_equals: href expected "file:///test" but got "file://localhost/test" +PASS Parsing: <test> against <file:///tmp/mock/path> +PASS Parsing: <file:test> against <file:///tmp/mock/path> +PASS Parsing: <http://example.com/././foo> against <about:blank> +PASS Parsing: <http://example.com/./.foo> against <about:blank> +PASS Parsing: <http://example.com/foo/.> against <about:blank> +PASS Parsing: <http://example.com/foo/./> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/%2e> against <about:blank> +FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/%2e%2" but got "http://example.com/foo/.%2" +FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/%2e.bar" but got "http://example.com/..bar" +PASS Parsing: <http://example.com////../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Parsing: <http://example.com/foo> against <about:blank> +PASS Parsing: <http://example.com/%20foo> against <about:blank> +PASS Parsing: <http://example.com/foo%> against <about:blank> +PASS Parsing: <http://example.com/foo%2> against <about:blank> +PASS Parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Parsing: <http://example.com/foo%2©zbar> against <about:blank> +FAIL Parsing: <http://example.com/foo%41%7a> against <about:blank> assert_equals: href expected "http://example.com/foo%41%7a" but got "http://example.com/fooAz" +PASS Parsing: <http://example.com/foo %91> against <about:blank> +FAIL Parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Parsing: <http://example.com/foo bar> against <about:blank> +PASS Parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Parsing: <http://example.com/你好你好> against <about:blank> +PASS Parsing: <http://example.com/‥/foo> against <about:blank> +PASS Parsing: <http://example.com//foo> against <about:blank> +PASS Parsing: <http://example.com//foo//bar> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected "data:test#%20%C2%BB" but got "data:test# %C2%BB" +PASS Parsing: <http://www.google.com> against <about:blank> +PASS Parsing: <http://192.0x00A80001> against <about:blank> +FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo%2Ehtml" but got "http://www/foo.html" +PASS Parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Parsing: <http://user:pass@/> against <about:blank> +PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Parsing: <http://foo:80/> against <about:blank> +PASS Parsing: <http://foo:81/> against <about:blank> +FAIL Parsing: <httpa://foo:80/> against <about:blank> assert_equals: host expected "foo:80" but got "" +PASS Parsing: <http://foo:-80/> against <about:blank> +PASS Parsing: <https://foo:443/> against <about:blank> +PASS Parsing: <https://foo:80/> against <about:blank> +PASS Parsing: <ftp://foo:21/> against <about:blank> +PASS Parsing: <ftp://foo:80/> against <about:blank> +FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got "" +FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got "" +PASS Parsing: <ws://foo:80/> against <about:blank> +PASS Parsing: <ws://foo:81/> against <about:blank> +PASS Parsing: <ws://foo:443/> against <about:blank> +PASS Parsing: <ws://foo:815/> against <about:blank> +PASS Parsing: <wss://foo:80/> against <about:blank> +PASS Parsing: <wss://foo:81/> against <about:blank> +PASS Parsing: <wss://foo:443/> against <about:blank> +PASS Parsing: <wss://foo:815/> against <about:blank> +PASS Parsing: <http:/example.com/> against <about:blank> +PASS Parsing: <ftp:/example.com/> against <about:blank> +PASS Parsing: <https:/example.com/> against <about:blank> +PASS Parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Parsing: <file:/example.com/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <about:blank> +PASS Parsing: <gopher:/example.com/> against <about:blank> +PASS Parsing: <ws:/example.com/> against <about:blank> +PASS Parsing: <wss:/example.com/> against <about:blank> +PASS Parsing: <data:/example.com/> against <about:blank> +PASS Parsing: <javascript:/example.com/> against <about:blank> +PASS Parsing: <mailto:/example.com/> against <about:blank> +PASS Parsing: <http:example.com/> against <about:blank> +PASS Parsing: <ftp:example.com/> against <about:blank> +PASS Parsing: <https:example.com/> against <about:blank> +PASS Parsing: <madeupscheme:example.com/> against <about:blank> +PASS Parsing: <ftps:example.com/> against <about:blank> +PASS Parsing: <gopher:example.com/> against <about:blank> +PASS Parsing: <ws:example.com/> against <about:blank> +PASS Parsing: <wss:example.com/> against <about:blank> +PASS Parsing: <data:example.com/> against <about:blank> +PASS Parsing: <javascript:example.com/> against <about:blank> +PASS Parsing: <mailto:example.com/> against <about:blank> +PASS Parsing: <http:@www.example.com> against <about:blank> +PASS Parsing: <http:/@www.example.com> against <about:blank> +PASS Parsing: <http://@www.example.com> against <about:blank> +PASS Parsing: <http:a:b@www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Parsing: <http://a:b@www.example.com> against <about:blank> +PASS Parsing: <http://@pple.com> against <about:blank> +PASS Parsing: <http::b@www.example.com> against <about:blank> +PASS Parsing: <http:/:b@www.example.com> against <about:blank> +PASS Parsing: <http://:b@www.example.com> against <about:blank> +PASS Parsing: <http:/:@/www.example.com> against <about:blank> +PASS Parsing: <http://user@/www.example.com> against <about:blank> +PASS Parsing: <http:@/www.example.com> against <about:blank> +PASS Parsing: <http:/@/www.example.com> against <about:blank> +PASS Parsing: <http://@/www.example.com> against <about:blank> +PASS Parsing: <https:@/www.example.com> against <about:blank> +PASS Parsing: <http:a:b@/www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@/www.example.com> against <about:blank> +PASS Parsing: <http://a:b@/www.example.com> against <about:blank> +PASS Parsing: <http::@/www.example.com> against <about:blank> +PASS Parsing: <http:a:@www.example.com> against <about:blank> +PASS Parsing: <http:/a:@www.example.com> against <about:blank> +PASS Parsing: <http://a:@www.example.com> against <about:blank> +PASS Parsing: <http://www.@pple.com> against <about:blank> +PASS Parsing: <http:@:www.example.com> against <about:blank> +PASS Parsing: <http:/@:www.example.com> against <about:blank> +PASS Parsing: <http://@:www.example.com> against <about:blank> +PASS Parsing: <http://:@www.example.com> against <about:blank> +PASS Parsing: </> against <http://www.example.com/test> +PASS Parsing: </test.txt> against <http://www.example.com/test> +PASS Parsing: <.> against <http://www.example.com/test> +PASS Parsing: <..> against <http://www.example.com/test> +PASS Parsing: <test.txt> against <http://www.example.com/test> +PASS Parsing: <./test.txt> against <http://www.example.com/test> +PASS Parsing: <../test.txt> against <http://www.example.com/test> +PASS Parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Parsing: <../../test.txt> against <http://www.example.com/test> +PASS Parsing: <中/test.txt> against <http://www.example.com/test> +PASS Parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Parsing: <file:...> against <http://www.example.com/test> +PASS Parsing: <file:..> against <http://www.example.com/test> +PASS Parsing: <file:a> against <http://www.example.com/test> +PASS Parsing: <http://ExAmPlE.CoM> against <http://other.com/> +FAIL Parsing: <http://example example.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://Goo%20 goo%7C|.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://[]> against <http://other.com/> +PASS Parsing: <http://[:]> against <http://other.com/> +FAIL Parsing: <http://GOO goo.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Parsing: <http://zyx.com> against <http://other.com/> +PASS Parsing: <http://%ef%b7%90zyx.com> against <http://other.com/> +PASS Parsing: <https://�> against <about:blank> +PASS Parsing: <https://%EF%BF%BD> against <about:blank> +PASS Parsing: <https://x/�?�#�> against <about:blank> +PASS Parsing: <http://Go.com> against <http://other.com/> +FAIL Parsing: <http://%41.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://%ef%bc%85%ef%bc%94%ef%bc%91.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://%00.com> against <http://other.com/> +PASS Parsing: <http://%ef%bc%85%ef%bc%90%ef%bc%90.com> against <http://other.com/> +PASS Parsing: <http://你好你好> against <http://other.com/> +FAIL Parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: href expected "https://xn--fa-hia.example/" but got "https://fass.example/" +FAIL Parsing: <sc://faß.ExAmPlE/> against <about:blank> assert_equals: host expected "fa%C3%9F.ExAmPlE" but got "" +PASS Parsing: <http://%zz%66%a.com> against <http://other.com/> +PASS Parsing: <http://%25> against <http://other.com/> +PASS Parsing: <http://hello%00> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Parsing: <http://192.168.0.257> against <http://other.com/> +PASS Parsing: <http://%3g%78%63%30%2e%30%32%35%30%2E.01> against <http://other.com/> +FAIL Parsing: <http://192.168.0.1 hello> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <https://x x:12> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Parsing: <http://./> against <about:blank> +PASS Parsing: <http://../> against <about:blank> +PASS Parsing: <http://0..0x300/> against <about:blank> +PASS Parsing: <http://[www.google.com]/> against <about:blank> +PASS Parsing: <http://[google.com]> against <http://other.com/> +PASS Parsing: <http://[::1.2.3.4x]> against <http://other.com/> +FAIL Parsing: <http://[::1.2.3.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.2.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Parsing: <#> against <test:test> +PASS Parsing: <#x> against <mailto:x@x.com> +PASS Parsing: <#x> against <data:,> +PASS Parsing: <#x> against <about:blank> +PASS Parsing: <#> against <test:test?test> +PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Parsing: <http://host/?'> against <about:blank> +FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got "" +PASS Parsing: </some/path> against <http://user@example.org/smth> +PASS Parsing: <> against <http://user:pass@example.org:21/smth> +PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Parsing: <i> against <sc:sd> +PASS Parsing: <i> against <sc:sd/sd> +PASS Parsing: <i> against <sc:/pa/pa> +FAIL Parsing: <i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/i" but got "///pa/i" +PASS Parsing: <../i> against <sc:sd> +PASS Parsing: <../i> against <sc:sd/sd> +PASS Parsing: <../i> against <sc:/pa/pa> +FAIL Parsing: <../i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <../i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: </i> against <sc:sd> +PASS Parsing: </i> against <sc:sd/sd> +PASS Parsing: </i> against <sc:/pa/pa> +FAIL Parsing: </i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: </i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: <?i> against <sc:sd> +PASS Parsing: <?i> against <sc:sd/sd> +PASS Parsing: <?i> against <sc:/pa/pa> +FAIL Parsing: <?i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <?i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +PASS Parsing: <#i> against <sc:sd> +PASS Parsing: <#i> against <sc:sd/sd> +PASS Parsing: <#i> against <sc:/pa/pa> +FAIL Parsing: <#i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <#i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +FAIL Parsing: <about:/../> against <about:blank> assert_equals: href expected "about:/" but got "about:/../" +FAIL Parsing: <data:/../> against <about:blank> assert_equals: href expected "data:/" but got "data:/../" +FAIL Parsing: <javascript:/../> against <about:blank> assert_equals: href expected "javascript:/" but got "javascript:/../" +FAIL Parsing: <mailto:/../> against <about:blank> assert_equals: href expected "mailto:/" but got "mailto:/../" +FAIL Parsing: <sc://ñ.test/> against <about:blank> assert_equals: host expected "%C3%B1.test" but got "" +FAIL Parsing: <sc://\0/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc:// /> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://%/> against <about:blank> assert_equals: host expected "%" but got "" +FAIL Parsing: <sc://@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://te@s:t@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:12/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://[/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://\/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://]/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Parsing: <sc:\../> against <about:blank> +PASS Parsing: <sc::a@example.net> against <about:blank> +PASS Parsing: <wow:%NBD> against <about:blank> +PASS Parsing: <wow:%1G> against <about:blank> +FAIL Parsing: <wow:> against <about:blank> assert_equals: href expected "wow:%EF%BF%BF" but got "wow:%EF%BF%BD" +FAIL Parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://a^b> against <about:blank> +FAIL Parsing: <non-special://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a^b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> assert_equals: host expected "%1F!\"$&'()*+,-.;=_`{|}~" but got "" +PASS Parsing: <ftp://example.com%80/> against <about:blank> +PASS Parsing: <ftp://example.com%A0/> against <about:blank> +PASS Parsing: <https://example.com%80/> against <about:blank> +PASS Parsing: <https://example.com%A0/> against <about:blank> +PASS Parsing: <ftp://%e2%98%83> against <about:blank> +PASS Parsing: <https://%e2%98%83> against <about:blank> +PASS Parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <https://example.org/foo/bar> +PASS Parsing: <sc:> against <https://example.org/foo/bar> +PASS Parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Parsing: <http://192.168.257> against <http://other.com/> +PASS Parsing: <http://192.168.257.com> against <http://other.com/> +PASS Parsing: <http://256> against <http://other.com/> +PASS Parsing: <http://256.com> against <http://other.com/> +PASS Parsing: <http://999999999> against <http://other.com/> +PASS Parsing: <http://999999999.com> against <http://other.com/> +PASS Parsing: <http://10000000000> against <http://other.com/> +PASS Parsing: <http://10000000000.com> against <http://other.com/> +PASS Parsing: <http://4294967295> against <http://other.com/> +PASS Parsing: <http://4294967296> against <http://other.com/> +PASS Parsing: <http://0xffffffff> against <http://other.com/> +PASS Parsing: <http://0xffffffff1> against <http://other.com/> +PASS Parsing: <http://256.256.256.256> against <http://other.com/> +PASS Parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Parsing: <https://0x.0x.0> against <about:blank> +PASS Parsing: <https://0x100000000/test> against <about:blank> +PASS Parsing: <https://256.0.0.1/test> against <about:blank> +PASS Parsing: <file:///C%3A/> against <about:blank> +PASS Parsing: <file:///C%7C/> against <about:blank> +PASS Parsing: <pix/submit.gif> against <file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html> +FAIL Parsing: <..> against <file:///C:/> assert_equals: href expected "file:///C:/" but got "file:///" +PASS Parsing: <..> against <file:///> +FAIL Parsing: </> against <file:///C:/a/b> assert_equals: href expected "file:///C:/" but got "file:///" +FAIL Parsing: </> against <file://h/C:/a/b> assert_equals: href expected "file://h/C:/" but got "file:///" +FAIL Parsing: </> against <file://h/a/b> assert_equals: href expected "file://h/" but got "file:///" +FAIL Parsing: <//d:> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <//d:/..> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +PASS Parsing: <..> against <file:///ab:/> +PASS Parsing: <..> against <file:///1:/> +PASS Parsing: <> against <file:///test?test#test> +PASS Parsing: <file:> against <file:///test?test#test> +PASS Parsing: <?x> against <file:///test?test#test> +PASS Parsing: <file:?x> against <file:///test?test#test> +PASS Parsing: <#x> against <file:///test?test#test> +PASS Parsing: <file:#x> against <file:///test?test#test> +FAIL Parsing: <file:\\//> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\?fox> against <about:blank> assert_equals: href expected "file:////?fox" but got "file:///?fox" +FAIL Parsing: <file:\\\\#guppy> against <about:blank> assert_equals: href expected "file:////#guppy" but got "file:///#guppy" +PASS Parsing: <file://spider///> against <about:blank> +FAIL Parsing: <file:\\localhost//> against <about:blank> assert_equals: href expected "file:////" but got "file://localhost//" +PASS Parsing: <file:///localhost//cat> against <about:blank> +FAIL Parsing: <file://\/localhost//cat> against <about:blank> assert_equals: href expected "file:////localhost//cat" but got "file:///localhost//cat" +FAIL Parsing: <file://localhost//a//../..//> against <about:blank> assert_equals: href expected "file://///" but got "file://localhost///" +FAIL Parsing: </////mouse> against <file:///elephant> assert_equals: href expected "file://///mouse" but got "file:///mouse" +PASS Parsing: <\//pig> against <file://lion/> +FAIL Parsing: <\/localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +FAIL Parsing: <//localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +PASS Parsing: </..//localhost//pig> against <file://lion/> +PASS Parsing: <file://> against <file://ape/> +PASS Parsing: </rooibos> against <file://tea/> +PASS Parsing: </?chai> against <file://tea/> +FAIL Parsing: <C|> against <file://host/dir/file> assert_equals: href expected "file://host/C:" but got "file://host/dir/C%7C" +FAIL Parsing: <C|> against <file://host/D:/dir1/dir2/file> assert_equals: href expected "file://host/C:" but got "file://host/D:/dir1/dir2/C%7C" +FAIL Parsing: <C|#> against <file://host/dir/file> assert_equals: href expected "file://host/C:#" but got "file://host/dir/C%7C#" +FAIL Parsing: <C|?> against <file://host/dir/file> assert_equals: href expected "file://host/C:?" but got "file://host/dir/C%7C?" +FAIL Parsing: <C|/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C| +/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C|\> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +PASS Parsing: <C> against <file://host/dir/file> +FAIL Parsing: <C|a> against <file://host/dir/file> assert_equals: href expected "file://host/dir/C|a" but got "file://host/dir/C%7Ca" +PASS Parsing: </c:/foo/bar> against <file:///c:/baz/qux> +FAIL Parsing: </c|/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///c%7C/foo/bar" +PASS Parsing: <file:\c:\foo\bar> against <file:///c:/baz/qux> +PASS Parsing: </c:/foo/bar> against <file://host/path> +PASS Parsing: <file://example.net/C:/> against <about:blank> +PASS Parsing: <file://1.2.3.4/C:/> against <about:blank> +PASS Parsing: <file://[1::8]/C:/> against <about:blank> +FAIL Parsing: <file:/C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file:///C%7C/" +FAIL Parsing: <file://C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file://c%7C/" +PASS Parsing: <file:> against <about:blank> +PASS Parsing: <file:?q=v> against <about:blank> +PASS Parsing: <file:#frag> against <about:blank> +PASS Parsing: <file:///Y:> against <about:blank> +PASS Parsing: <file:///Y:/> against <about:blank> +PASS Parsing: <file:///./Y> against <about:blank> +PASS Parsing: <file:///./Y:> against <about:blank> +PASS Parsing: <\\\.\Y:> against <about:blank> +PASS Parsing: <file:///y:> against <about:blank> +PASS Parsing: <file:///y:/> against <about:blank> +PASS Parsing: <file:///./y> against <about:blank> +PASS Parsing: <file:///./y:> against <about:blank> +PASS Parsing: <\\\.\y:> against <about:blank> +FAIL Parsing: <file://localhost//a//../..//foo> against <about:blank> assert_equals: href expected "file://///foo" but got "file://localhost///foo" +FAIL Parsing: <file://localhost////foo> against <about:blank> assert_equals: href expected "file://////foo" but got "file://localhost////foo" +FAIL Parsing: <file:////foo> against <about:blank> assert_equals: href expected "file:////foo" but got "file:///foo" +PASS Parsing: <file:///one/two> against <file:///> +FAIL Parsing: <file:////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <//one/two> against <file:///> +PASS Parsing: <///one/two> against <file:///> +FAIL Parsing: <////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <file:///.//> against <file:////> +PASS Parsing: <file:.//p> against <about:blank> +PASS Parsing: <file:/.//p> against <about:blank> +PASS Parsing: <http://[1:0::]> against <http://example.net/> +PASS Parsing: <http://[0:1:2:3:4:5:6:7:8]> against <http://example.net/> +PASS Parsing: <https://[0::0::0]> against <about:blank> +PASS Parsing: <https://[0:.0]> against <about:blank> +PASS Parsing: <https://[0:0:]> against <about:blank> +PASS Parsing: <https://[0:1:2:3:4:5:6:7.0.0.0.1]> against <about:blank> +PASS Parsing: <https://[0:1.00.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.290.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.23.23]> against <about:blank> +PASS Parsing: <http://?> against <about:blank> +PASS Parsing: <http://#> against <about:blank> +PASS Parsing: <http://f:4294967377/c> against <http://example.org/> +PASS Parsing: <http://f:18446744073709551697/c> against <http://example.org/> +PASS Parsing: <http://f:340282366920938463463374607431768211537/c> against <http://example.org/> +FAIL Parsing: <sc://ñ> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ?x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ#x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://?> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <sc://#> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <///> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////x/> against <sc://x/> assert_equals: href expected "sc:////x/" but got "sc://x/" +FAIL Parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> assert_equals: host expected "foobar.com" but got "" +FAIL Parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> assert_equals: username expected "user" but got "" +FAIL Parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> assert_equals: host expected "10.10.10.10:7777" but got "" +FAIL Parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <rsync://foo@host:911/sup> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <git://github.com/foo/bar.git> against <about:blank> assert_equals: host expected "github.com" but got "" +FAIL Parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> assert_equals: host expected "myserver.com:6999" but got "" +FAIL Parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> assert_equals: host expected "fw.example.org:9999" but got "" +FAIL Parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> assert_equals: host expected "localhost:389" but got "" +FAIL Parsing: <git+https://github.com/foo/bar> against <about:blank> assert_equals: host expected "github.com" but got "" +PASS Parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +FAIL Parsing: <non-spec:/.//> against <about:blank> assert_equals: pathname expected "//" but got "/.//" +FAIL Parsing: <non-spec:/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/..//" +FAIL Parsing: <non-spec:/a/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/a/..//" +FAIL Parsing: <non-spec:/.//path> against <about:blank> assert_equals: pathname expected "//path" but got "/.//path" +FAIL Parsing: <non-spec:/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <non-spec:/a/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/a/..//path" +FAIL Parsing: </.//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: </..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <a/..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//p" but got "non-spec:/..//p" +FAIL Parsing: <path> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <../path> against <non-spec:/.//p> assert_equals: href expected "non-spec:/path" but got "non-spec:/./path" +FAIL Parsing: <non-special://%E2%80%A0/> against <about:blank> assert_equals: host expected "%E2%80%A0" but got "" +FAIL Parsing: <non-special://H%4fSt/path> against <about:blank> assert_equals: host expected "H%4fSt" but got "" +FAIL Parsing: <non-special://[1:2:0:0:5:0:0:0]/> against <about:blank> assert_equals: href expected "non-special://[1:2:0:0:5::]/" but got "non-special://[1:2:0:0:5:0:0:0]/" +FAIL Parsing: <non-special://[1:2:0:0:0:0:0:3]/> against <about:blank> assert_equals: href expected "non-special://[1:2::3]/" but got "non-special://[1:2:0:0:0:0:0:3]/" +FAIL Parsing: <non-special://[1:2::3]:80/> against <about:blank> assert_equals: host expected "[1:2::3]:80" but got "" +FAIL Parsing: <non-special://[:80/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <blob:https://example.com:443/> against <about:blank> +PASS Parsing: <blob:d3958f5c-0777-0845-9dcf-2cb28783acaf> against <about:blank> +PASS Parsing: <http://0177.0.0.0189> against <about:blank> +PASS Parsing: <http://0x7f.0.0.0x7g> against <about:blank> +PASS Parsing: <http://0X7F.0.0.0X7G> against <about:blank> +PASS Parsing: <http://[::127.0.0.0.1]> against <about:blank> +PASS Parsing: <http://[0:1:0:1:0:1:0:1]> against <about:blank> +PASS Parsing: <http://[1:0:1:0:1:0:1:0]> against <about:blank> +PASS Parsing: <http://example.org/test?"> against <about:blank> +PASS Parsing: <http://example.org/test?#> against <about:blank> +PASS Parsing: <http://example.org/test?<> against <about:blank> +PASS Parsing: <http://example.org/test?>> against <about:blank> +PASS Parsing: <http://example.org/test?⌣> against <about:blank> +PASS Parsing: <http://example.org/test?%23%23> against <about:blank> +PASS Parsing: <http://example.org/test?%GH> against <about:blank> +PASS Parsing: <http://example.org/test?a#%EF> against <about:blank> +PASS Parsing: <http://example.org/test?a#%GH> against <about:blank> +PASS Parsing: <a> against <about:blank> +PASS Parsing: <a/> against <about:blank> +PASS Parsing: <a//> against <about:blank> +PASS Parsing: <test-a-colon.html> against <a:> +PASS Parsing: <test-a-colon-b.html> against <a:b> +PASS Parsing: <test-a-colon-slash.html> against <a:/> +FAIL Parsing: <test-a-colon-slash-slash.html> against <a://> Failed to construct 'URL': Invalid URL +PASS Parsing: <test-a-colon-slash-b.html> against <a:/b> +FAIL Parsing: <test-a-colon-slash-slash-b.html> against <a://b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://example.org/test?a#b\0c> against <about:blank> assert_equals: href expected "http://example.org/test?a#b%00c" but got "http://example.org/test?a#bc" +FAIL Parsing: <non-spec://example.org/test?a#b\0c> against <about:blank> assert_equals: host expected "example.org" but got "" +PASS Parsing: <non-spec:/test?a#b\0c> against <about:blank> +PASS Parsing: <10.0.0.7:8080/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a!@$*=/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a1234567890-+.:foo/bar> against <http://example.com/dir/file> +PASS Parsing: <file://ab/p> against <about:blank> +PASS Parsing: <file://a%C2%ADb/p> against <about:blank> +PASS Parsing: <file:///p> against <about:blank> +PASS Parsing: <file://%C2%AD/p> against <about:blank> +FAIL Parsing: <file://xn--/p> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <#link> against <https://example.org/##link> +PASS Parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin.any-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin.any-expected.txt new file mode 100644 index 0000000..e6b9139 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin.any-expected.txt
@@ -0,0 +1,322 @@ +This is a testharness.js-based test. +Found 309 tests; 302 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Origin parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Origin parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Origin parsing: <https://test:@test> against <about:blank> +PASS Origin parsing: <https://:@test> against <about:blank> +PASS Origin parsing: <non-special://test:@test/x> against <about:blank> +PASS Origin parsing: <non-special://:@test/x> against <about:blank> +PASS Origin parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Origin parsing: < foo.com > against <http://example.org/foo/bar> +PASS Origin parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Origin parsing: <> against <http://example.org/foo/bar> +PASS Origin parsing: < > against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <:> against <http://example.org/foo/bar> +PASS Origin parsing: <:a> against <http://example.org/foo/bar> +PASS Origin parsing: <:/> against <http://example.org/foo/bar> +PASS Origin parsing: <:\> against <http://example.org/foo/bar> +PASS Origin parsing: <:#> against <http://example.org/foo/bar> +PASS Origin parsing: <#> against <http://example.org/foo/bar> +PASS Origin parsing: <#/> against <http://example.org/foo/bar> +PASS Origin parsing: <#\> against <http://example.org/foo/bar> +PASS Origin parsing: <#;?> against <http://example.org/foo/bar> +PASS Origin parsing: <?> against <http://example.org/foo/bar> +PASS Origin parsing: </> against <http://example.org/foo/bar> +PASS Origin parsing: <:23> against <http://example.org/foo/bar> +PASS Origin parsing: </:23> against <http://example.org/foo/bar> +PASS Origin parsing: <::> against <http://example.org/foo/bar> +PASS Origin parsing: <::23> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://> against <http://example.org/foo/bar> +PASS Origin parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Origin parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Origin parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:////://///> against <http://example.org/foo/bar> +PASS Origin parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Origin parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Origin parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Origin parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Origin parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Origin parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Origin parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Origin parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Origin parsing: <#β> against <http://example.org/foo/bar> +PASS Origin parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Origin parsing: <tel:1234567890> against <http://example.org/foo/bar> +PASS Origin parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> +PASS Origin parsing: <http://example.com/././foo> against <about:blank> +PASS Origin parsing: <http://example.com/./.foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo/.> against <about:blank> +PASS Origin parsing: <http://example.com/foo/./> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Origin parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> +PASS Origin parsing: <http://example.com////../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Origin parsing: <http://example.com/foo> against <about:blank> +PASS Origin parsing: <http://example.com/%20foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo%> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2©zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%41%7a> against <about:blank> +PASS Origin parsing: <http://example.com/foo %91> against <about:blank> +FAIL Origin parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Origin parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Origin parsing: <http://example.com/foo bar> against <about:blank> +PASS Origin parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Origin parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Origin parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Origin parsing: <http://example.com/你好你好> against <about:blank> +PASS Origin parsing: <http://example.com/‥/foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo//bar> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +PASS Origin parsing: <data:test# »> against <about:blank> +PASS Origin parsing: <http://www.google.com> against <about:blank> +PASS Origin parsing: <http://192.0x00A80001> against <about:blank> +PASS Origin parsing: <http://www/foo%2Ehtml> against <about:blank> +PASS Origin parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Origin parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Origin parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Origin parsing: <http://foo:80/> against <about:blank> +PASS Origin parsing: <http://foo:81/> against <about:blank> +PASS Origin parsing: <httpa://foo:80/> against <about:blank> +PASS Origin parsing: <https://foo:443/> against <about:blank> +PASS Origin parsing: <https://foo:80/> against <about:blank> +PASS Origin parsing: <ftp://foo:21/> against <about:blank> +PASS Origin parsing: <ftp://foo:80/> against <about:blank> +PASS Origin parsing: <gopher://foo:70/> against <about:blank> +PASS Origin parsing: <gopher://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:80/> against <about:blank> +PASS Origin parsing: <ws://foo:81/> against <about:blank> +PASS Origin parsing: <ws://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:815/> against <about:blank> +PASS Origin parsing: <wss://foo:80/> against <about:blank> +PASS Origin parsing: <wss://foo:81/> against <about:blank> +PASS Origin parsing: <wss://foo:443/> against <about:blank> +PASS Origin parsing: <wss://foo:815/> against <about:blank> +PASS Origin parsing: <http:/example.com/> against <about:blank> +PASS Origin parsing: <ftp:/example.com/> against <about:blank> +PASS Origin parsing: <https:/example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Origin parsing: <ftps:/example.com/> against <about:blank> +PASS Origin parsing: <gopher:/example.com/> against <about:blank> +PASS Origin parsing: <ws:/example.com/> against <about:blank> +PASS Origin parsing: <wss:/example.com/> against <about:blank> +PASS Origin parsing: <data:/example.com/> against <about:blank> +PASS Origin parsing: <javascript:/example.com/> against <about:blank> +PASS Origin parsing: <mailto:/example.com/> against <about:blank> +PASS Origin parsing: <http:example.com/> against <about:blank> +PASS Origin parsing: <ftp:example.com/> against <about:blank> +PASS Origin parsing: <https:example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:example.com/> against <about:blank> +PASS Origin parsing: <ftps:example.com/> against <about:blank> +PASS Origin parsing: <gopher:example.com/> against <about:blank> +PASS Origin parsing: <ws:example.com/> against <about:blank> +PASS Origin parsing: <wss:example.com/> against <about:blank> +PASS Origin parsing: <data:example.com/> against <about:blank> +PASS Origin parsing: <javascript:example.com/> against <about:blank> +PASS Origin parsing: <mailto:example.com/> against <about:blank> +PASS Origin parsing: <http:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/@www.example.com> against <about:blank> +PASS Origin parsing: <http://@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://@pple.com> against <about:blank> +PASS Origin parsing: <http::b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://www.@pple.com> against <about:blank> +PASS Origin parsing: <http://:@www.example.com> against <about:blank> +PASS Origin parsing: </> against <http://www.example.com/test> +PASS Origin parsing: </test.txt> against <http://www.example.com/test> +PASS Origin parsing: <.> against <http://www.example.com/test> +PASS Origin parsing: <..> against <http://www.example.com/test> +PASS Origin parsing: <test.txt> against <http://www.example.com/test> +PASS Origin parsing: <./test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <中/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <http://ExAmPlE.CoM> against <http://other.com/> +PASS Origin parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Origin parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Origin parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Origin parsing: <https://x/�?�#�> against <about:blank> +PASS Origin parsing: <http://Go.com> against <http://other.com/> +PASS Origin parsing: <http://你好你好> against <http://other.com/> +FAIL Origin parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: origin expected "https://xn--fa-hia.example" but got "https://fass.example" +PASS Origin parsing: <sc://faß.ExAmPlE/> against <about:blank> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Origin parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Origin parsing: <http://./> against <about:blank> +PASS Origin parsing: <http://../> against <about:blank> +PASS Origin parsing: <http://0..0x300/> against <about:blank> +PASS Origin parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Origin parsing: <#> against <test:test> +PASS Origin parsing: <#x> against <mailto:x@x.com> +PASS Origin parsing: <#x> against <data:,> +PASS Origin parsing: <#x> against <about:blank> +PASS Origin parsing: <#> against <test:test?test> +PASS Origin parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Origin parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Origin parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Origin parsing: <http://host/?'> against <about:blank> +PASS Origin parsing: <notspecial://host/?'> against <about:blank> +PASS Origin parsing: </some/path> against <http://user@example.org/smth> +PASS Origin parsing: <> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: <i> against <sc:/pa/pa> +PASS Origin parsing: <i> against <sc://ho/pa> +PASS Origin parsing: <i> against <sc:///pa/pa> +PASS Origin parsing: <../i> against <sc:/pa/pa> +PASS Origin parsing: <../i> against <sc://ho/pa> +PASS Origin parsing: <../i> against <sc:///pa/pa> +PASS Origin parsing: </i> against <sc:/pa/pa> +PASS Origin parsing: </i> against <sc://ho/pa> +PASS Origin parsing: </i> against <sc:///pa/pa> +PASS Origin parsing: <?i> against <sc:/pa/pa> +PASS Origin parsing: <?i> against <sc://ho/pa> +PASS Origin parsing: <?i> against <sc:///pa/pa> +PASS Origin parsing: <#i> against <sc:sd> +PASS Origin parsing: <#i> against <sc:sd/sd> +PASS Origin parsing: <#i> against <sc:/pa/pa> +PASS Origin parsing: <#i> against <sc://ho/pa> +PASS Origin parsing: <#i> against <sc:///pa/pa> +PASS Origin parsing: <about:/../> against <about:blank> +PASS Origin parsing: <data:/../> against <about:blank> +PASS Origin parsing: <javascript:/../> against <about:blank> +PASS Origin parsing: <mailto:/../> against <about:blank> +PASS Origin parsing: <sc://ñ.test/> against <about:blank> +FAIL Origin parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc:\../> against <about:blank> +PASS Origin parsing: <sc::a@example.net> against <about:blank> +PASS Origin parsing: <wow:%NBD> against <about:blank> +PASS Origin parsing: <wow:%1G> against <about:blank> +PASS Origin parsing: <wow:> against <about:blank> +FAIL Origin parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> +PASS Origin parsing: <ftp://%e2%98%83> against <about:blank> +PASS Origin parsing: <https://%e2%98%83> against <about:blank> +PASS Origin parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Origin parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Origin parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Origin parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Origin parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <http:> against <http://example.org/foo/bar> +PASS Origin parsing: <sc:> against <https://example.org/foo/bar> +PASS Origin parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Origin parsing: <http://192.168.257> against <http://other.com/> +PASS Origin parsing: <http://192.168.257.com> against <http://other.com/> +PASS Origin parsing: <http://256> against <http://other.com/> +PASS Origin parsing: <http://256.com> against <http://other.com/> +PASS Origin parsing: <http://999999999> against <http://other.com/> +PASS Origin parsing: <http://999999999.com> against <http://other.com/> +PASS Origin parsing: <http://10000000000.com> against <http://other.com/> +PASS Origin parsing: <http://4294967295> against <http://other.com/> +PASS Origin parsing: <http://0xffffffff> against <http://other.com/> +PASS Origin parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Origin parsing: <https://0x.0x.0> against <about:blank> +PASS Origin parsing: <http://[1:0::]> against <http://example.net/> +PASS Origin parsing: <sc://ñ> against <about:blank> +PASS Origin parsing: <sc://ñ?x> against <about:blank> +PASS Origin parsing: <sc://ñ#x> against <about:blank> +FAIL Origin parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> +PASS Origin parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> +PASS Origin parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> +PASS Origin parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> +PASS Origin parsing: <rsync://foo@host:911/sup> against <about:blank> +PASS Origin parsing: <git://github.com/foo/bar.git> against <about:blank> +PASS Origin parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> +PASS Origin parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> +PASS Origin parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> +PASS Origin parsing: <git+https://github.com/foo/bar> against <about:blank> +PASS Origin parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Origin parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +PASS Origin parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Origin parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Origin parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin.any.worker-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin.any.worker-expected.txt new file mode 100644 index 0000000..e6b9139 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin.any.worker-expected.txt
@@ -0,0 +1,322 @@ +This is a testharness.js-based test. +Found 309 tests; 302 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Origin parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Origin parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Origin parsing: <https://test:@test> against <about:blank> +PASS Origin parsing: <https://:@test> against <about:blank> +PASS Origin parsing: <non-special://test:@test/x> against <about:blank> +PASS Origin parsing: <non-special://:@test/x> against <about:blank> +PASS Origin parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Origin parsing: < foo.com > against <http://example.org/foo/bar> +PASS Origin parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Origin parsing: <> against <http://example.org/foo/bar> +PASS Origin parsing: < > against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <:> against <http://example.org/foo/bar> +PASS Origin parsing: <:a> against <http://example.org/foo/bar> +PASS Origin parsing: <:/> against <http://example.org/foo/bar> +PASS Origin parsing: <:\> against <http://example.org/foo/bar> +PASS Origin parsing: <:#> against <http://example.org/foo/bar> +PASS Origin parsing: <#> against <http://example.org/foo/bar> +PASS Origin parsing: <#/> against <http://example.org/foo/bar> +PASS Origin parsing: <#\> against <http://example.org/foo/bar> +PASS Origin parsing: <#;?> against <http://example.org/foo/bar> +PASS Origin parsing: <?> against <http://example.org/foo/bar> +PASS Origin parsing: </> against <http://example.org/foo/bar> +PASS Origin parsing: <:23> against <http://example.org/foo/bar> +PASS Origin parsing: </:23> against <http://example.org/foo/bar> +PASS Origin parsing: <::> against <http://example.org/foo/bar> +PASS Origin parsing: <::23> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://> against <http://example.org/foo/bar> +PASS Origin parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Origin parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Origin parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:////://///> against <http://example.org/foo/bar> +PASS Origin parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Origin parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Origin parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Origin parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Origin parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Origin parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Origin parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Origin parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Origin parsing: <#β> against <http://example.org/foo/bar> +PASS Origin parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Origin parsing: <tel:1234567890> against <http://example.org/foo/bar> +PASS Origin parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> +PASS Origin parsing: <http://example.com/././foo> against <about:blank> +PASS Origin parsing: <http://example.com/./.foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo/.> against <about:blank> +PASS Origin parsing: <http://example.com/foo/./> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Origin parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> +PASS Origin parsing: <http://example.com////../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Origin parsing: <http://example.com/foo> against <about:blank> +PASS Origin parsing: <http://example.com/%20foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo%> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2©zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%41%7a> against <about:blank> +PASS Origin parsing: <http://example.com/foo %91> against <about:blank> +FAIL Origin parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Origin parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Origin parsing: <http://example.com/foo bar> against <about:blank> +PASS Origin parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Origin parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Origin parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Origin parsing: <http://example.com/你好你好> against <about:blank> +PASS Origin parsing: <http://example.com/‥/foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo//bar> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +PASS Origin parsing: <data:test# »> against <about:blank> +PASS Origin parsing: <http://www.google.com> against <about:blank> +PASS Origin parsing: <http://192.0x00A80001> against <about:blank> +PASS Origin parsing: <http://www/foo%2Ehtml> against <about:blank> +PASS Origin parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Origin parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Origin parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Origin parsing: <http://foo:80/> against <about:blank> +PASS Origin parsing: <http://foo:81/> against <about:blank> +PASS Origin parsing: <httpa://foo:80/> against <about:blank> +PASS Origin parsing: <https://foo:443/> against <about:blank> +PASS Origin parsing: <https://foo:80/> against <about:blank> +PASS Origin parsing: <ftp://foo:21/> against <about:blank> +PASS Origin parsing: <ftp://foo:80/> against <about:blank> +PASS Origin parsing: <gopher://foo:70/> against <about:blank> +PASS Origin parsing: <gopher://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:80/> against <about:blank> +PASS Origin parsing: <ws://foo:81/> against <about:blank> +PASS Origin parsing: <ws://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:815/> against <about:blank> +PASS Origin parsing: <wss://foo:80/> against <about:blank> +PASS Origin parsing: <wss://foo:81/> against <about:blank> +PASS Origin parsing: <wss://foo:443/> against <about:blank> +PASS Origin parsing: <wss://foo:815/> against <about:blank> +PASS Origin parsing: <http:/example.com/> against <about:blank> +PASS Origin parsing: <ftp:/example.com/> against <about:blank> +PASS Origin parsing: <https:/example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Origin parsing: <ftps:/example.com/> against <about:blank> +PASS Origin parsing: <gopher:/example.com/> against <about:blank> +PASS Origin parsing: <ws:/example.com/> against <about:blank> +PASS Origin parsing: <wss:/example.com/> against <about:blank> +PASS Origin parsing: <data:/example.com/> against <about:blank> +PASS Origin parsing: <javascript:/example.com/> against <about:blank> +PASS Origin parsing: <mailto:/example.com/> against <about:blank> +PASS Origin parsing: <http:example.com/> against <about:blank> +PASS Origin parsing: <ftp:example.com/> against <about:blank> +PASS Origin parsing: <https:example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:example.com/> against <about:blank> +PASS Origin parsing: <ftps:example.com/> against <about:blank> +PASS Origin parsing: <gopher:example.com/> against <about:blank> +PASS Origin parsing: <ws:example.com/> against <about:blank> +PASS Origin parsing: <wss:example.com/> against <about:blank> +PASS Origin parsing: <data:example.com/> against <about:blank> +PASS Origin parsing: <javascript:example.com/> against <about:blank> +PASS Origin parsing: <mailto:example.com/> against <about:blank> +PASS Origin parsing: <http:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/@www.example.com> against <about:blank> +PASS Origin parsing: <http://@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://@pple.com> against <about:blank> +PASS Origin parsing: <http::b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://www.@pple.com> against <about:blank> +PASS Origin parsing: <http://:@www.example.com> against <about:blank> +PASS Origin parsing: </> against <http://www.example.com/test> +PASS Origin parsing: </test.txt> against <http://www.example.com/test> +PASS Origin parsing: <.> against <http://www.example.com/test> +PASS Origin parsing: <..> against <http://www.example.com/test> +PASS Origin parsing: <test.txt> against <http://www.example.com/test> +PASS Origin parsing: <./test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <中/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <http://ExAmPlE.CoM> against <http://other.com/> +PASS Origin parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Origin parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Origin parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Origin parsing: <https://x/�?�#�> against <about:blank> +PASS Origin parsing: <http://Go.com> against <http://other.com/> +PASS Origin parsing: <http://你好你好> against <http://other.com/> +FAIL Origin parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: origin expected "https://xn--fa-hia.example" but got "https://fass.example" +PASS Origin parsing: <sc://faß.ExAmPlE/> against <about:blank> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Origin parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Origin parsing: <http://./> against <about:blank> +PASS Origin parsing: <http://../> against <about:blank> +PASS Origin parsing: <http://0..0x300/> against <about:blank> +PASS Origin parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Origin parsing: <#> against <test:test> +PASS Origin parsing: <#x> against <mailto:x@x.com> +PASS Origin parsing: <#x> against <data:,> +PASS Origin parsing: <#x> against <about:blank> +PASS Origin parsing: <#> against <test:test?test> +PASS Origin parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Origin parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Origin parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Origin parsing: <http://host/?'> against <about:blank> +PASS Origin parsing: <notspecial://host/?'> against <about:blank> +PASS Origin parsing: </some/path> against <http://user@example.org/smth> +PASS Origin parsing: <> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: <i> against <sc:/pa/pa> +PASS Origin parsing: <i> against <sc://ho/pa> +PASS Origin parsing: <i> against <sc:///pa/pa> +PASS Origin parsing: <../i> against <sc:/pa/pa> +PASS Origin parsing: <../i> against <sc://ho/pa> +PASS Origin parsing: <../i> against <sc:///pa/pa> +PASS Origin parsing: </i> against <sc:/pa/pa> +PASS Origin parsing: </i> against <sc://ho/pa> +PASS Origin parsing: </i> against <sc:///pa/pa> +PASS Origin parsing: <?i> against <sc:/pa/pa> +PASS Origin parsing: <?i> against <sc://ho/pa> +PASS Origin parsing: <?i> against <sc:///pa/pa> +PASS Origin parsing: <#i> against <sc:sd> +PASS Origin parsing: <#i> against <sc:sd/sd> +PASS Origin parsing: <#i> against <sc:/pa/pa> +PASS Origin parsing: <#i> against <sc://ho/pa> +PASS Origin parsing: <#i> against <sc:///pa/pa> +PASS Origin parsing: <about:/../> against <about:blank> +PASS Origin parsing: <data:/../> against <about:blank> +PASS Origin parsing: <javascript:/../> against <about:blank> +PASS Origin parsing: <mailto:/../> against <about:blank> +PASS Origin parsing: <sc://ñ.test/> against <about:blank> +FAIL Origin parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc:\../> against <about:blank> +PASS Origin parsing: <sc::a@example.net> against <about:blank> +PASS Origin parsing: <wow:%NBD> against <about:blank> +PASS Origin parsing: <wow:%1G> against <about:blank> +PASS Origin parsing: <wow:> against <about:blank> +FAIL Origin parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> +PASS Origin parsing: <ftp://%e2%98%83> against <about:blank> +PASS Origin parsing: <https://%e2%98%83> against <about:blank> +PASS Origin parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Origin parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Origin parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Origin parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Origin parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <http:> against <http://example.org/foo/bar> +PASS Origin parsing: <sc:> against <https://example.org/foo/bar> +PASS Origin parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Origin parsing: <http://192.168.257> against <http://other.com/> +PASS Origin parsing: <http://192.168.257.com> against <http://other.com/> +PASS Origin parsing: <http://256> against <http://other.com/> +PASS Origin parsing: <http://256.com> against <http://other.com/> +PASS Origin parsing: <http://999999999> against <http://other.com/> +PASS Origin parsing: <http://999999999.com> against <http://other.com/> +PASS Origin parsing: <http://10000000000.com> against <http://other.com/> +PASS Origin parsing: <http://4294967295> against <http://other.com/> +PASS Origin parsing: <http://0xffffffff> against <http://other.com/> +PASS Origin parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Origin parsing: <https://0x.0x.0> against <about:blank> +PASS Origin parsing: <http://[1:0::]> against <http://example.net/> +PASS Origin parsing: <sc://ñ> against <about:blank> +PASS Origin parsing: <sc://ñ?x> against <about:blank> +PASS Origin parsing: <sc://ñ#x> against <about:blank> +FAIL Origin parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> +PASS Origin parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> +PASS Origin parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> +PASS Origin parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> +PASS Origin parsing: <rsync://foo@host:911/sup> against <about:blank> +PASS Origin parsing: <git://github.com/foo/bar.git> against <about:blank> +PASS Origin parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> +PASS Origin parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> +PASS Origin parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> +PASS Origin parsing: <git+https://github.com/foo/bar> against <about:blank> +PASS Origin parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Origin parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +PASS Origin parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Origin parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Origin parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..b5fb4d2 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..8313799 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..9ea6706 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png deleted file mode 100644 index 34fdb14b..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/linux/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..b5fb4d2 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/compositing/overflow/nested-render-surfaces-with-rotation-expected.png similarity index 100% copy from third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png copy to third_party/blink/web_tests/platform/mac-mac-arm11.0/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt new file mode 100644 index 0000000..208f97b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt
@@ -0,0 +1,11 @@ +This is a testharness.js-based test. +PASS A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation +PASS During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation +PASS A stopped sendonly transceiver should generate an inactive m-section in the offer +PASS A stopped inactive transceiver should generate an inactive m-section in the offer +PASS If a transceiver is stopped locally, setting a locally generated answer should still work +PASS If a transceiver is stopped remotely, setting a locally generated answer should still work +PASS If a transceiver is stopped, transceivers, senders and receivers should disappear after offer/answer +FAIL If a transceiver is stopped, transceivers should end up in state stopped assert_equals: expected "stopped" but got "recvonly" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png similarity index 100% rename from third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png rename to third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt new file mode 100644 index 0000000..7339289 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac-arm11.0/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt
@@ -0,0 +1,11 @@ +This is a testharness.js-based test. +FAIL A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL A stopped sendonly transceiver should generate an inactive m-section in the offer promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL A stopped inactive transceiver should generate an inactive m-section in the offer promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL If a transceiver is stopped locally, setting a locally generated answer should still work promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL If a transceiver is stopped remotely, setting a locally generated answer should still work promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL If a transceiver is stopped, transceivers, senders and receivers should disappear after offer/answer promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL If a transceiver is stopped, transceivers should end up in state stopped promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3dbed0b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..74b79d6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3929863 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-popup-same-origin-allow-popups-report-to.https-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-popup-same-origin-allow-popups-report-to.https-expected.txt new file mode 100644 index 0000000..b964a17 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/html/cross-origin-opener-policy/reporting/navigation-reporting/reporting-popup-same-origin-allow-popups-report-to.https-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +PASS coop reporting test reporting same origin with report-to to SAME_ORIGIN with same-origin; report-to="coop-popup-report-endpoint", , , +PASS coop reporting test reporting same origin with report-to to CROSS_ORIGIN with same-origin-allow-popups; report-to="coop-popup-report-endpoint", require-corp, , +PASS coop reporting test reporting same origin with report-to to CROSS_ORIGIN with same-origin, require-corp, , +FAIL verify remaining reports promise_test: Unhandled rejection with value: "coop-report-endpoint not empty" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3929863 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3dbed0b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..74b79d6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png new file mode 100644 index 0000000..f8d8258 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3929863 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3dbed0b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..74b79d6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..b402580 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3dbed0b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..74b79d6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..b402580 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png index c5c8929a..f8d8258 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor.any-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor.any-expected.txt new file mode 100644 index 0000000..e1cae2c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor.any-expected.txt
@@ -0,0 +1,644 @@ +This is a testharness.js-based test. +Found 576 tests; 426 PASS, 150 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Parsing: <https://test:@test> against <about:blank> +PASS Parsing: <https://:@test> against <about:blank> +FAIL Parsing: <non-special://test:@test/x> against <about:blank> assert_equals: href expected "non-special://test@test/x" but got "non-special://test:@test/x" +FAIL Parsing: <non-special://:@test/x> against <about:blank> assert_equals: href expected "non-special://test/x" but got "non-special://:@test/x" +PASS Parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Parsing: < foo.com > against <http://example.org/foo/bar> +PASS Parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +FAIL Parsing: <lolscheme:x x#x x> against <about:blank> assert_equals: href expected "lolscheme:x x#x%20x" but got "lolscheme:x x#x x" +PASS Parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:b/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: /c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:fifty-two/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:999999/c> against <http://example.org/foo/bar> +FAIL Parsing: <non-special://f:999999/c> against <http://example.org/foo/bar> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://f: 21 / b ? d # e > against <http://example.org/foo/bar> +PASS Parsing: <> against <http://example.org/foo/bar> +PASS Parsing: < > against <http://example.org/foo/bar> +PASS Parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <:> against <http://example.org/foo/bar> +PASS Parsing: <:a> against <http://example.org/foo/bar> +PASS Parsing: <:/> against <http://example.org/foo/bar> +PASS Parsing: <:\> against <http://example.org/foo/bar> +PASS Parsing: <:#> against <http://example.org/foo/bar> +PASS Parsing: <#> against <http://example.org/foo/bar> +PASS Parsing: <#/> against <http://example.org/foo/bar> +PASS Parsing: <#\> against <http://example.org/foo/bar> +PASS Parsing: <#;?> against <http://example.org/foo/bar> +PASS Parsing: <?> against <http://example.org/foo/bar> +PASS Parsing: </> against <http://example.org/foo/bar> +PASS Parsing: <:23> against <http://example.org/foo/bar> +PASS Parsing: </:23> against <http://example.org/foo/bar> +PASS Parsing: <::> against <http://example.org/foo/bar> +PASS Parsing: <::23> against <http://example.org/foo/bar> +FAIL Parsing: <foo://> against <http://example.org/foo/bar> assert_equals: pathname expected "" but got "//" +PASS Parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <foo:/> against <http://example.org/foo/bar> +PASS Parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +FAIL Parsing: <foo://///////> against <http://example.org/foo/bar> assert_equals: pathname expected "///////" but got "/////////" +FAIL Parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> assert_equals: pathname expected "///////bar.com/" but got "/////////bar.com/" +FAIL Parsing: <foo:////://///> against <http://example.org/foo/bar> assert_equals: pathname expected "//://///" but got "////://///" +PASS Parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Parsing: <http://[1::2]:3:4> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file://example:1/> against <about:blank> +PASS Parsing: <file://example:test/> against <about:blank> +PASS Parsing: <file://example%/> against <about:blank> +PASS Parsing: <file://[example]/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Parsing: <#β> against <http://example.org/foo/bar> +PASS Parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Parsing: <tel:1234567890> against <http://example.org/foo/bar> +FAIL Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> assert_equals: host expected "example.com" but got "" +FAIL Parsing: <file:c:\foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:/foo/bar.html" but got "file:///tmp/mock/c:/foo/bar.html" +FAIL Parsing: < File:c|////foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:////foo/bar.html" but got "file:///tmp/mock/c%7C////foo/bar.html" +FAIL Parsing: <C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///tmp/mock/C%7C/foo/bar" +FAIL Parsing: </C|\foo\bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///C%7C/foo/bar" +FAIL Parsing: <//C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file://c%7C/foo/bar" +PASS Parsing: <//server/file> against <file:///tmp/mock/path> +PASS Parsing: <\\server\file> against <file:///tmp/mock/path> +PASS Parsing: </\server/file> against <file:///tmp/mock/path> +PASS Parsing: <file:///foo/bar.txt> against <file:///tmp/mock/path> +PASS Parsing: <file:///home/me> against <file:///tmp/mock/path> +PASS Parsing: <//> against <file:///tmp/mock/path> +PASS Parsing: <///> against <file:///tmp/mock/path> +PASS Parsing: <///test> against <file:///tmp/mock/path> +PASS Parsing: <file://test> against <file:///tmp/mock/path> +FAIL Parsing: <file://localhost> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/test> against <file:///tmp/mock/path> assert_equals: href expected "file:///test" but got "file://localhost/test" +PASS Parsing: <test> against <file:///tmp/mock/path> +PASS Parsing: <file:test> against <file:///tmp/mock/path> +PASS Parsing: <http://example.com/././foo> against <about:blank> +PASS Parsing: <http://example.com/./.foo> against <about:blank> +PASS Parsing: <http://example.com/foo/.> against <about:blank> +PASS Parsing: <http://example.com/foo/./> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/%2e> against <about:blank> +FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/%2e%2" but got "http://example.com/foo/.%2" +FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/%2e.bar" but got "http://example.com/..bar" +PASS Parsing: <http://example.com////../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Parsing: <http://example.com/foo> against <about:blank> +PASS Parsing: <http://example.com/%20foo> against <about:blank> +PASS Parsing: <http://example.com/foo%> against <about:blank> +PASS Parsing: <http://example.com/foo%2> against <about:blank> +PASS Parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Parsing: <http://example.com/foo%2©zbar> against <about:blank> +FAIL Parsing: <http://example.com/foo%41%7a> against <about:blank> assert_equals: href expected "http://example.com/foo%41%7a" but got "http://example.com/fooAz" +PASS Parsing: <http://example.com/foo %91> against <about:blank> +FAIL Parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Parsing: <http://example.com/foo bar> against <about:blank> +PASS Parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Parsing: <http://example.com/你好你好> against <about:blank> +PASS Parsing: <http://example.com/‥/foo> against <about:blank> +PASS Parsing: <http://example.com//foo> against <about:blank> +PASS Parsing: <http://example.com//foo//bar> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected "data:test#%20%C2%BB" but got "data:test# %C2%BB" +PASS Parsing: <http://www.google.com> against <about:blank> +PASS Parsing: <http://192.0x00A80001> against <about:blank> +FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo%2Ehtml" but got "http://www/foo.html" +PASS Parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Parsing: <http://user:pass@/> against <about:blank> +PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Parsing: <http://foo:80/> against <about:blank> +PASS Parsing: <http://foo:81/> against <about:blank> +FAIL Parsing: <httpa://foo:80/> against <about:blank> assert_equals: host expected "foo:80" but got "" +PASS Parsing: <http://foo:-80/> against <about:blank> +PASS Parsing: <https://foo:443/> against <about:blank> +PASS Parsing: <https://foo:80/> against <about:blank> +PASS Parsing: <ftp://foo:21/> against <about:blank> +PASS Parsing: <ftp://foo:80/> against <about:blank> +FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got "" +FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got "" +PASS Parsing: <ws://foo:80/> against <about:blank> +PASS Parsing: <ws://foo:81/> against <about:blank> +PASS Parsing: <ws://foo:443/> against <about:blank> +PASS Parsing: <ws://foo:815/> against <about:blank> +PASS Parsing: <wss://foo:80/> against <about:blank> +PASS Parsing: <wss://foo:81/> against <about:blank> +PASS Parsing: <wss://foo:443/> against <about:blank> +PASS Parsing: <wss://foo:815/> against <about:blank> +PASS Parsing: <http:/example.com/> against <about:blank> +PASS Parsing: <ftp:/example.com/> against <about:blank> +PASS Parsing: <https:/example.com/> against <about:blank> +PASS Parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Parsing: <file:/example.com/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <about:blank> +PASS Parsing: <gopher:/example.com/> against <about:blank> +PASS Parsing: <ws:/example.com/> against <about:blank> +PASS Parsing: <wss:/example.com/> against <about:blank> +PASS Parsing: <data:/example.com/> against <about:blank> +PASS Parsing: <javascript:/example.com/> against <about:blank> +PASS Parsing: <mailto:/example.com/> against <about:blank> +PASS Parsing: <http:example.com/> against <about:blank> +PASS Parsing: <ftp:example.com/> against <about:blank> +PASS Parsing: <https:example.com/> against <about:blank> +PASS Parsing: <madeupscheme:example.com/> against <about:blank> +PASS Parsing: <ftps:example.com/> against <about:blank> +PASS Parsing: <gopher:example.com/> against <about:blank> +PASS Parsing: <ws:example.com/> against <about:blank> +PASS Parsing: <wss:example.com/> against <about:blank> +PASS Parsing: <data:example.com/> against <about:blank> +PASS Parsing: <javascript:example.com/> against <about:blank> +PASS Parsing: <mailto:example.com/> against <about:blank> +PASS Parsing: <http:@www.example.com> against <about:blank> +PASS Parsing: <http:/@www.example.com> against <about:blank> +PASS Parsing: <http://@www.example.com> against <about:blank> +PASS Parsing: <http:a:b@www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Parsing: <http://a:b@www.example.com> against <about:blank> +PASS Parsing: <http://@pple.com> against <about:blank> +PASS Parsing: <http::b@www.example.com> against <about:blank> +PASS Parsing: <http:/:b@www.example.com> against <about:blank> +PASS Parsing: <http://:b@www.example.com> against <about:blank> +PASS Parsing: <http:/:@/www.example.com> against <about:blank> +PASS Parsing: <http://user@/www.example.com> against <about:blank> +PASS Parsing: <http:@/www.example.com> against <about:blank> +PASS Parsing: <http:/@/www.example.com> against <about:blank> +PASS Parsing: <http://@/www.example.com> against <about:blank> +PASS Parsing: <https:@/www.example.com> against <about:blank> +PASS Parsing: <http:a:b@/www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@/www.example.com> against <about:blank> +PASS Parsing: <http://a:b@/www.example.com> against <about:blank> +PASS Parsing: <http::@/www.example.com> against <about:blank> +PASS Parsing: <http:a:@www.example.com> against <about:blank> +PASS Parsing: <http:/a:@www.example.com> against <about:blank> +PASS Parsing: <http://a:@www.example.com> against <about:blank> +PASS Parsing: <http://www.@pple.com> against <about:blank> +PASS Parsing: <http:@:www.example.com> against <about:blank> +PASS Parsing: <http:/@:www.example.com> against <about:blank> +PASS Parsing: <http://@:www.example.com> against <about:blank> +PASS Parsing: <http://:@www.example.com> against <about:blank> +PASS Parsing: </> against <http://www.example.com/test> +PASS Parsing: </test.txt> against <http://www.example.com/test> +PASS Parsing: <.> against <http://www.example.com/test> +PASS Parsing: <..> against <http://www.example.com/test> +PASS Parsing: <test.txt> against <http://www.example.com/test> +PASS Parsing: <./test.txt> against <http://www.example.com/test> +PASS Parsing: <../test.txt> against <http://www.example.com/test> +PASS Parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Parsing: <../../test.txt> against <http://www.example.com/test> +PASS Parsing: <中/test.txt> against <http://www.example.com/test> +PASS Parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Parsing: <file:...> against <http://www.example.com/test> +PASS Parsing: <file:..> against <http://www.example.com/test> +PASS Parsing: <file:a> against <http://www.example.com/test> +PASS Parsing: <http://ExAmPlE.CoM> against <http://other.com/> +FAIL Parsing: <http://example example.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://Goo%20 goo%7C|.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://[]> against <http://other.com/> +PASS Parsing: <http://[:]> against <http://other.com/> +FAIL Parsing: <http://GOO goo.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Parsing: <http://zyx.com> against <http://other.com/> +PASS Parsing: <http://%ef%b7%90zyx.com> against <http://other.com/> +PASS Parsing: <https://�> against <about:blank> +PASS Parsing: <https://%EF%BF%BD> against <about:blank> +PASS Parsing: <https://x/�?�#�> against <about:blank> +PASS Parsing: <http://Go.com> against <http://other.com/> +FAIL Parsing: <http://%41.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://%ef%bc%85%ef%bc%94%ef%bc%91.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://%00.com> against <http://other.com/> +PASS Parsing: <http://%ef%bc%85%ef%bc%90%ef%bc%90.com> against <http://other.com/> +PASS Parsing: <http://你好你好> against <http://other.com/> +FAIL Parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: href expected "https://xn--fa-hia.example/" but got "https://fass.example/" +FAIL Parsing: <sc://faß.ExAmPlE/> against <about:blank> assert_equals: host expected "fa%C3%9F.ExAmPlE" but got "" +PASS Parsing: <http://%zz%66%a.com> against <http://other.com/> +PASS Parsing: <http://%25> against <http://other.com/> +PASS Parsing: <http://hello%00> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Parsing: <http://192.168.0.257> against <http://other.com/> +PASS Parsing: <http://%3g%78%63%30%2e%30%32%35%30%2E.01> against <http://other.com/> +FAIL Parsing: <http://192.168.0.1 hello> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <https://x x:12> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Parsing: <http://./> against <about:blank> +PASS Parsing: <http://../> against <about:blank> +PASS Parsing: <http://0..0x300/> against <about:blank> +PASS Parsing: <http://[www.google.com]/> against <about:blank> +PASS Parsing: <http://[google.com]> against <http://other.com/> +PASS Parsing: <http://[::1.2.3.4x]> against <http://other.com/> +FAIL Parsing: <http://[::1.2.3.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.2.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Parsing: <#> against <test:test> +PASS Parsing: <#x> against <mailto:x@x.com> +PASS Parsing: <#x> against <data:,> +PASS Parsing: <#x> against <about:blank> +PASS Parsing: <#> against <test:test?test> +PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Parsing: <http://host/?'> against <about:blank> +FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got "" +PASS Parsing: </some/path> against <http://user@example.org/smth> +PASS Parsing: <> against <http://user:pass@example.org:21/smth> +PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Parsing: <i> against <sc:sd> +PASS Parsing: <i> against <sc:sd/sd> +PASS Parsing: <i> against <sc:/pa/pa> +FAIL Parsing: <i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/i" but got "///pa/i" +PASS Parsing: <../i> against <sc:sd> +PASS Parsing: <../i> against <sc:sd/sd> +PASS Parsing: <../i> against <sc:/pa/pa> +FAIL Parsing: <../i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <../i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: </i> against <sc:sd> +PASS Parsing: </i> against <sc:sd/sd> +PASS Parsing: </i> against <sc:/pa/pa> +FAIL Parsing: </i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: </i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: <?i> against <sc:sd> +PASS Parsing: <?i> against <sc:sd/sd> +PASS Parsing: <?i> against <sc:/pa/pa> +FAIL Parsing: <?i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <?i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +PASS Parsing: <#i> against <sc:sd> +PASS Parsing: <#i> against <sc:sd/sd> +PASS Parsing: <#i> against <sc:/pa/pa> +FAIL Parsing: <#i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <#i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +FAIL Parsing: <about:/../> against <about:blank> assert_equals: href expected "about:/" but got "about:/../" +FAIL Parsing: <data:/../> against <about:blank> assert_equals: href expected "data:/" but got "data:/../" +FAIL Parsing: <javascript:/../> against <about:blank> assert_equals: href expected "javascript:/" but got "javascript:/../" +FAIL Parsing: <mailto:/../> against <about:blank> assert_equals: href expected "mailto:/" but got "mailto:/../" +FAIL Parsing: <sc://ñ.test/> against <about:blank> assert_equals: host expected "%C3%B1.test" but got "" +FAIL Parsing: <sc://\0/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc:// /> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://%/> against <about:blank> assert_equals: host expected "%" but got "" +FAIL Parsing: <sc://@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://te@s:t@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:12/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://[/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://\/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://]/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Parsing: <sc:\../> against <about:blank> +PASS Parsing: <sc::a@example.net> against <about:blank> +PASS Parsing: <wow:%NBD> against <about:blank> +PASS Parsing: <wow:%1G> against <about:blank> +FAIL Parsing: <wow:> against <about:blank> assert_equals: href expected "wow:%EF%BF%BF" but got "wow:%EF%BF%BD" +FAIL Parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://a^b> against <about:blank> +FAIL Parsing: <non-special://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a^b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> assert_equals: host expected "%1F!\"$&'()*+,-.;=_`{|}~" but got "" +PASS Parsing: <ftp://example.com%80/> against <about:blank> +PASS Parsing: <ftp://example.com%A0/> against <about:blank> +PASS Parsing: <https://example.com%80/> against <about:blank> +PASS Parsing: <https://example.com%A0/> against <about:blank> +PASS Parsing: <ftp://%e2%98%83> against <about:blank> +PASS Parsing: <https://%e2%98%83> against <about:blank> +PASS Parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <https://example.org/foo/bar> +PASS Parsing: <sc:> against <https://example.org/foo/bar> +PASS Parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Parsing: <http://192.168.257> against <http://other.com/> +PASS Parsing: <http://192.168.257.com> against <http://other.com/> +PASS Parsing: <http://256> against <http://other.com/> +PASS Parsing: <http://256.com> against <http://other.com/> +PASS Parsing: <http://999999999> against <http://other.com/> +PASS Parsing: <http://999999999.com> against <http://other.com/> +PASS Parsing: <http://10000000000> against <http://other.com/> +PASS Parsing: <http://10000000000.com> against <http://other.com/> +PASS Parsing: <http://4294967295> against <http://other.com/> +PASS Parsing: <http://4294967296> against <http://other.com/> +PASS Parsing: <http://0xffffffff> against <http://other.com/> +PASS Parsing: <http://0xffffffff1> against <http://other.com/> +PASS Parsing: <http://256.256.256.256> against <http://other.com/> +PASS Parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Parsing: <https://0x.0x.0> against <about:blank> +PASS Parsing: <https://0x100000000/test> against <about:blank> +PASS Parsing: <https://256.0.0.1/test> against <about:blank> +PASS Parsing: <file:///C%3A/> against <about:blank> +PASS Parsing: <file:///C%7C/> against <about:blank> +PASS Parsing: <pix/submit.gif> against <file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html> +FAIL Parsing: <..> against <file:///C:/> assert_equals: href expected "file:///C:/" but got "file:///" +PASS Parsing: <..> against <file:///> +FAIL Parsing: </> against <file:///C:/a/b> assert_equals: href expected "file:///C:/" but got "file:///" +FAIL Parsing: </> against <file://h/C:/a/b> assert_equals: href expected "file://h/C:/" but got "file:///" +FAIL Parsing: </> against <file://h/a/b> assert_equals: href expected "file://h/" but got "file:///" +FAIL Parsing: <//d:> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <//d:/..> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +PASS Parsing: <..> against <file:///ab:/> +PASS Parsing: <..> against <file:///1:/> +PASS Parsing: <> against <file:///test?test#test> +PASS Parsing: <file:> against <file:///test?test#test> +PASS Parsing: <?x> against <file:///test?test#test> +PASS Parsing: <file:?x> against <file:///test?test#test> +PASS Parsing: <#x> against <file:///test?test#test> +PASS Parsing: <file:#x> against <file:///test?test#test> +FAIL Parsing: <file:\\//> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\?fox> against <about:blank> assert_equals: href expected "file:////?fox" but got "file:///?fox" +FAIL Parsing: <file:\\\\#guppy> against <about:blank> assert_equals: href expected "file:////#guppy" but got "file:///#guppy" +PASS Parsing: <file://spider///> against <about:blank> +FAIL Parsing: <file:\\localhost//> against <about:blank> assert_equals: href expected "file:////" but got "file://localhost//" +PASS Parsing: <file:///localhost//cat> against <about:blank> +FAIL Parsing: <file://\/localhost//cat> against <about:blank> assert_equals: href expected "file:////localhost//cat" but got "file:///localhost//cat" +FAIL Parsing: <file://localhost//a//../..//> against <about:blank> assert_equals: href expected "file://///" but got "file://localhost///" +FAIL Parsing: </////mouse> against <file:///elephant> assert_equals: href expected "file://///mouse" but got "file:///mouse" +PASS Parsing: <\//pig> against <file://lion/> +FAIL Parsing: <\/localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +FAIL Parsing: <//localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +PASS Parsing: </..//localhost//pig> against <file://lion/> +PASS Parsing: <file://> against <file://ape/> +PASS Parsing: </rooibos> against <file://tea/> +PASS Parsing: </?chai> against <file://tea/> +FAIL Parsing: <C|> against <file://host/dir/file> assert_equals: href expected "file://host/C:" but got "file://host/dir/C%7C" +FAIL Parsing: <C|> against <file://host/D:/dir1/dir2/file> assert_equals: href expected "file://host/C:" but got "file://host/D:/dir1/dir2/C%7C" +FAIL Parsing: <C|#> against <file://host/dir/file> assert_equals: href expected "file://host/C:#" but got "file://host/dir/C%7C#" +FAIL Parsing: <C|?> against <file://host/dir/file> assert_equals: href expected "file://host/C:?" but got "file://host/dir/C%7C?" +FAIL Parsing: <C|/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C| +/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C|\> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +PASS Parsing: <C> against <file://host/dir/file> +FAIL Parsing: <C|a> against <file://host/dir/file> assert_equals: href expected "file://host/dir/C|a" but got "file://host/dir/C%7Ca" +PASS Parsing: </c:/foo/bar> against <file:///c:/baz/qux> +FAIL Parsing: </c|/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///c%7C/foo/bar" +PASS Parsing: <file:\c:\foo\bar> against <file:///c:/baz/qux> +PASS Parsing: </c:/foo/bar> against <file://host/path> +PASS Parsing: <file://example.net/C:/> against <about:blank> +PASS Parsing: <file://1.2.3.4/C:/> against <about:blank> +PASS Parsing: <file://[1::8]/C:/> against <about:blank> +FAIL Parsing: <file:/C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file:///C%7C/" +FAIL Parsing: <file://C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file://c%7C/" +PASS Parsing: <file:> against <about:blank> +PASS Parsing: <file:?q=v> against <about:blank> +PASS Parsing: <file:#frag> against <about:blank> +PASS Parsing: <file:///Y:> against <about:blank> +PASS Parsing: <file:///Y:/> against <about:blank> +PASS Parsing: <file:///./Y> against <about:blank> +PASS Parsing: <file:///./Y:> against <about:blank> +PASS Parsing: <\\\.\Y:> against <about:blank> +PASS Parsing: <file:///y:> against <about:blank> +PASS Parsing: <file:///y:/> against <about:blank> +PASS Parsing: <file:///./y> against <about:blank> +PASS Parsing: <file:///./y:> against <about:blank> +PASS Parsing: <\\\.\y:> against <about:blank> +FAIL Parsing: <file://localhost//a//../..//foo> against <about:blank> assert_equals: href expected "file://///foo" but got "file://localhost///foo" +FAIL Parsing: <file://localhost////foo> against <about:blank> assert_equals: href expected "file://////foo" but got "file://localhost////foo" +FAIL Parsing: <file:////foo> against <about:blank> assert_equals: href expected "file:////foo" but got "file:///foo" +PASS Parsing: <file:///one/two> against <file:///> +FAIL Parsing: <file:////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <//one/two> against <file:///> +PASS Parsing: <///one/two> against <file:///> +FAIL Parsing: <////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <file:///.//> against <file:////> +PASS Parsing: <file:.//p> against <about:blank> +PASS Parsing: <file:/.//p> against <about:blank> +PASS Parsing: <http://[1:0::]> against <http://example.net/> +PASS Parsing: <http://[0:1:2:3:4:5:6:7:8]> against <http://example.net/> +PASS Parsing: <https://[0::0::0]> against <about:blank> +PASS Parsing: <https://[0:.0]> against <about:blank> +PASS Parsing: <https://[0:0:]> against <about:blank> +PASS Parsing: <https://[0:1:2:3:4:5:6:7.0.0.0.1]> against <about:blank> +PASS Parsing: <https://[0:1.00.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.290.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.23.23]> against <about:blank> +PASS Parsing: <http://?> against <about:blank> +PASS Parsing: <http://#> against <about:blank> +PASS Parsing: <http://f:4294967377/c> against <http://example.org/> +PASS Parsing: <http://f:18446744073709551697/c> against <http://example.org/> +PASS Parsing: <http://f:340282366920938463463374607431768211537/c> against <http://example.org/> +FAIL Parsing: <sc://ñ> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ?x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ#x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://?> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <sc://#> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <///> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////x/> against <sc://x/> assert_equals: href expected "sc:////x/" but got "sc://x/" +FAIL Parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> assert_equals: host expected "foobar.com" but got "" +FAIL Parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> assert_equals: username expected "user" but got "" +FAIL Parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> assert_equals: host expected "10.10.10.10:7777" but got "" +FAIL Parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <rsync://foo@host:911/sup> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <git://github.com/foo/bar.git> against <about:blank> assert_equals: host expected "github.com" but got "" +FAIL Parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> assert_equals: host expected "myserver.com:6999" but got "" +FAIL Parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> assert_equals: host expected "fw.example.org:9999" but got "" +FAIL Parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> assert_equals: host expected "localhost:389" but got "" +FAIL Parsing: <git+https://github.com/foo/bar> against <about:blank> assert_equals: host expected "github.com" but got "" +PASS Parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +FAIL Parsing: <non-spec:/.//> against <about:blank> assert_equals: pathname expected "//" but got "/.//" +FAIL Parsing: <non-spec:/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/..//" +FAIL Parsing: <non-spec:/a/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/a/..//" +FAIL Parsing: <non-spec:/.//path> against <about:blank> assert_equals: pathname expected "//path" but got "/.//path" +FAIL Parsing: <non-spec:/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <non-spec:/a/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/a/..//path" +FAIL Parsing: </.//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: </..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <a/..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//p" but got "non-spec:/..//p" +FAIL Parsing: <path> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <../path> against <non-spec:/.//p> assert_equals: href expected "non-spec:/path" but got "non-spec:/./path" +FAIL Parsing: <non-special://%E2%80%A0/> against <about:blank> assert_equals: host expected "%E2%80%A0" but got "" +FAIL Parsing: <non-special://H%4fSt/path> against <about:blank> assert_equals: host expected "H%4fSt" but got "" +FAIL Parsing: <non-special://[1:2:0:0:5:0:0:0]/> against <about:blank> assert_equals: href expected "non-special://[1:2:0:0:5::]/" but got "non-special://[1:2:0:0:5:0:0:0]/" +FAIL Parsing: <non-special://[1:2:0:0:0:0:0:3]/> against <about:blank> assert_equals: href expected "non-special://[1:2::3]/" but got "non-special://[1:2:0:0:0:0:0:3]/" +FAIL Parsing: <non-special://[1:2::3]:80/> against <about:blank> assert_equals: host expected "[1:2::3]:80" but got "" +FAIL Parsing: <non-special://[:80/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <blob:https://example.com:443/> against <about:blank> +PASS Parsing: <blob:d3958f5c-0777-0845-9dcf-2cb28783acaf> against <about:blank> +PASS Parsing: <http://0177.0.0.0189> against <about:blank> +PASS Parsing: <http://0x7f.0.0.0x7g> against <about:blank> +PASS Parsing: <http://0X7F.0.0.0X7G> against <about:blank> +PASS Parsing: <http://[::127.0.0.0.1]> against <about:blank> +PASS Parsing: <http://[0:1:0:1:0:1:0:1]> against <about:blank> +PASS Parsing: <http://[1:0:1:0:1:0:1:0]> against <about:blank> +PASS Parsing: <http://example.org/test?"> against <about:blank> +PASS Parsing: <http://example.org/test?#> against <about:blank> +PASS Parsing: <http://example.org/test?<> against <about:blank> +PASS Parsing: <http://example.org/test?>> against <about:blank> +PASS Parsing: <http://example.org/test?⌣> against <about:blank> +PASS Parsing: <http://example.org/test?%23%23> against <about:blank> +PASS Parsing: <http://example.org/test?%GH> against <about:blank> +PASS Parsing: <http://example.org/test?a#%EF> against <about:blank> +PASS Parsing: <http://example.org/test?a#%GH> against <about:blank> +PASS Parsing: <a> against <about:blank> +PASS Parsing: <a/> against <about:blank> +PASS Parsing: <a//> against <about:blank> +PASS Parsing: <test-a-colon.html> against <a:> +PASS Parsing: <test-a-colon-b.html> against <a:b> +PASS Parsing: <test-a-colon-slash.html> against <a:/> +FAIL Parsing: <test-a-colon-slash-slash.html> against <a://> Failed to construct 'URL': Invalid URL +PASS Parsing: <test-a-colon-slash-b.html> against <a:/b> +FAIL Parsing: <test-a-colon-slash-slash-b.html> against <a://b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://example.org/test?a#b\0c> against <about:blank> assert_equals: href expected "http://example.org/test?a#b%00c" but got "http://example.org/test?a#bc" +FAIL Parsing: <non-spec://example.org/test?a#b\0c> against <about:blank> assert_equals: host expected "example.org" but got "" +PASS Parsing: <non-spec:/test?a#b\0c> against <about:blank> +PASS Parsing: <10.0.0.7:8080/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a!@$*=/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a1234567890-+.:foo/bar> against <http://example.com/dir/file> +PASS Parsing: <file://ab/p> against <about:blank> +PASS Parsing: <file://a%C2%ADb/p> against <about:blank> +PASS Parsing: <file:///p> against <about:blank> +PASS Parsing: <file://%C2%AD/p> against <about:blank> +FAIL Parsing: <file://xn--/p> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <#link> against <https://example.org/##link> +PASS Parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor.any.worker-expected.txt new file mode 100644 index 0000000..e1cae2c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor.any.worker-expected.txt
@@ -0,0 +1,644 @@ +This is a testharness.js-based test. +Found 576 tests; 426 PASS, 150 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Parsing: <https://test:@test> against <about:blank> +PASS Parsing: <https://:@test> against <about:blank> +FAIL Parsing: <non-special://test:@test/x> against <about:blank> assert_equals: href expected "non-special://test@test/x" but got "non-special://test:@test/x" +FAIL Parsing: <non-special://:@test/x> against <about:blank> assert_equals: href expected "non-special://test/x" but got "non-special://:@test/x" +PASS Parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Parsing: < foo.com > against <http://example.org/foo/bar> +PASS Parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +FAIL Parsing: <lolscheme:x x#x x> against <about:blank> assert_equals: href expected "lolscheme:x x#x%20x" but got "lolscheme:x x#x x" +PASS Parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:b/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: /c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:fifty-two/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:999999/c> against <http://example.org/foo/bar> +FAIL Parsing: <non-special://f:999999/c> against <http://example.org/foo/bar> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://f: 21 / b ? d # e > against <http://example.org/foo/bar> +PASS Parsing: <> against <http://example.org/foo/bar> +PASS Parsing: < > against <http://example.org/foo/bar> +PASS Parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <:> against <http://example.org/foo/bar> +PASS Parsing: <:a> against <http://example.org/foo/bar> +PASS Parsing: <:/> against <http://example.org/foo/bar> +PASS Parsing: <:\> against <http://example.org/foo/bar> +PASS Parsing: <:#> against <http://example.org/foo/bar> +PASS Parsing: <#> against <http://example.org/foo/bar> +PASS Parsing: <#/> against <http://example.org/foo/bar> +PASS Parsing: <#\> against <http://example.org/foo/bar> +PASS Parsing: <#;?> against <http://example.org/foo/bar> +PASS Parsing: <?> against <http://example.org/foo/bar> +PASS Parsing: </> against <http://example.org/foo/bar> +PASS Parsing: <:23> against <http://example.org/foo/bar> +PASS Parsing: </:23> against <http://example.org/foo/bar> +PASS Parsing: <::> against <http://example.org/foo/bar> +PASS Parsing: <::23> against <http://example.org/foo/bar> +FAIL Parsing: <foo://> against <http://example.org/foo/bar> assert_equals: pathname expected "" but got "//" +PASS Parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <foo:/> against <http://example.org/foo/bar> +PASS Parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +FAIL Parsing: <foo://///////> against <http://example.org/foo/bar> assert_equals: pathname expected "///////" but got "/////////" +FAIL Parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> assert_equals: pathname expected "///////bar.com/" but got "/////////bar.com/" +FAIL Parsing: <foo:////://///> against <http://example.org/foo/bar> assert_equals: pathname expected "//://///" but got "////://///" +PASS Parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Parsing: <http://[1::2]:3:4> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <file://example:1/> against <about:blank> +PASS Parsing: <file://example:test/> against <about:blank> +PASS Parsing: <file://example%/> against <about:blank> +PASS Parsing: <file://[example]/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Parsing: <#β> against <http://example.org/foo/bar> +PASS Parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Parsing: <tel:1234567890> against <http://example.org/foo/bar> +FAIL Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> assert_equals: host expected "example.com" but got "" +FAIL Parsing: <file:c:\foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:/foo/bar.html" but got "file:///tmp/mock/c:/foo/bar.html" +FAIL Parsing: < File:c|////foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:////foo/bar.html" but got "file:///tmp/mock/c%7C////foo/bar.html" +FAIL Parsing: <C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///tmp/mock/C%7C/foo/bar" +FAIL Parsing: </C|\foo\bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file:///C%7C/foo/bar" +FAIL Parsing: <//C|/foo/bar> against <file:///tmp/mock/path> assert_equals: href expected "file:///C:/foo/bar" but got "file://c%7C/foo/bar" +PASS Parsing: <//server/file> against <file:///tmp/mock/path> +PASS Parsing: <\\server\file> against <file:///tmp/mock/path> +PASS Parsing: </\server/file> against <file:///tmp/mock/path> +PASS Parsing: <file:///foo/bar.txt> against <file:///tmp/mock/path> +PASS Parsing: <file:///home/me> against <file:///tmp/mock/path> +PASS Parsing: <//> against <file:///tmp/mock/path> +PASS Parsing: <///> against <file:///tmp/mock/path> +PASS Parsing: <///test> against <file:///tmp/mock/path> +PASS Parsing: <file://test> against <file:///tmp/mock/path> +FAIL Parsing: <file://localhost> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/test> against <file:///tmp/mock/path> assert_equals: href expected "file:///test" but got "file://localhost/test" +PASS Parsing: <test> against <file:///tmp/mock/path> +PASS Parsing: <file:test> against <file:///tmp/mock/path> +PASS Parsing: <http://example.com/././foo> against <about:blank> +PASS Parsing: <http://example.com/./.foo> against <about:blank> +PASS Parsing: <http://example.com/foo/.> against <about:blank> +PASS Parsing: <http://example.com/foo/./> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/%2e> against <about:blank> +FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/%2e%2" but got "http://example.com/foo/.%2" +FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/%2e.bar" but got "http://example.com/..bar" +PASS Parsing: <http://example.com////../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Parsing: <http://example.com/foo> against <about:blank> +PASS Parsing: <http://example.com/%20foo> against <about:blank> +PASS Parsing: <http://example.com/foo%> against <about:blank> +PASS Parsing: <http://example.com/foo%2> against <about:blank> +PASS Parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Parsing: <http://example.com/foo%2©zbar> against <about:blank> +FAIL Parsing: <http://example.com/foo%41%7a> against <about:blank> assert_equals: href expected "http://example.com/foo%41%7a" but got "http://example.com/fooAz" +PASS Parsing: <http://example.com/foo %91> against <about:blank> +FAIL Parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Parsing: <http://example.com/foo bar> against <about:blank> +PASS Parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Parsing: <http://example.com/你好你好> against <about:blank> +PASS Parsing: <http://example.com/‥/foo> against <about:blank> +PASS Parsing: <http://example.com//foo> against <about:blank> +PASS Parsing: <http://example.com//foo//bar> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected "data:test#%20%C2%BB" but got "data:test# %C2%BB" +PASS Parsing: <http://www.google.com> against <about:blank> +PASS Parsing: <http://192.0x00A80001> against <about:blank> +FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo%2Ehtml" but got "http://www/foo.html" +PASS Parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Parsing: <http://user:pass@/> against <about:blank> +PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Parsing: <http://foo:80/> against <about:blank> +PASS Parsing: <http://foo:81/> against <about:blank> +FAIL Parsing: <httpa://foo:80/> against <about:blank> assert_equals: host expected "foo:80" but got "" +PASS Parsing: <http://foo:-80/> against <about:blank> +PASS Parsing: <https://foo:443/> against <about:blank> +PASS Parsing: <https://foo:80/> against <about:blank> +PASS Parsing: <ftp://foo:21/> against <about:blank> +PASS Parsing: <ftp://foo:80/> against <about:blank> +FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got "" +FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got "" +PASS Parsing: <ws://foo:80/> against <about:blank> +PASS Parsing: <ws://foo:81/> against <about:blank> +PASS Parsing: <ws://foo:443/> against <about:blank> +PASS Parsing: <ws://foo:815/> against <about:blank> +PASS Parsing: <wss://foo:80/> against <about:blank> +PASS Parsing: <wss://foo:81/> against <about:blank> +PASS Parsing: <wss://foo:443/> against <about:blank> +PASS Parsing: <wss://foo:815/> against <about:blank> +PASS Parsing: <http:/example.com/> against <about:blank> +PASS Parsing: <ftp:/example.com/> against <about:blank> +PASS Parsing: <https:/example.com/> against <about:blank> +PASS Parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Parsing: <file:/example.com/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <about:blank> +PASS Parsing: <gopher:/example.com/> against <about:blank> +PASS Parsing: <ws:/example.com/> against <about:blank> +PASS Parsing: <wss:/example.com/> against <about:blank> +PASS Parsing: <data:/example.com/> against <about:blank> +PASS Parsing: <javascript:/example.com/> against <about:blank> +PASS Parsing: <mailto:/example.com/> against <about:blank> +PASS Parsing: <http:example.com/> against <about:blank> +PASS Parsing: <ftp:example.com/> against <about:blank> +PASS Parsing: <https:example.com/> against <about:blank> +PASS Parsing: <madeupscheme:example.com/> against <about:blank> +PASS Parsing: <ftps:example.com/> against <about:blank> +PASS Parsing: <gopher:example.com/> against <about:blank> +PASS Parsing: <ws:example.com/> against <about:blank> +PASS Parsing: <wss:example.com/> against <about:blank> +PASS Parsing: <data:example.com/> against <about:blank> +PASS Parsing: <javascript:example.com/> against <about:blank> +PASS Parsing: <mailto:example.com/> against <about:blank> +PASS Parsing: <http:@www.example.com> against <about:blank> +PASS Parsing: <http:/@www.example.com> against <about:blank> +PASS Parsing: <http://@www.example.com> against <about:blank> +PASS Parsing: <http:a:b@www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Parsing: <http://a:b@www.example.com> against <about:blank> +PASS Parsing: <http://@pple.com> against <about:blank> +PASS Parsing: <http::b@www.example.com> against <about:blank> +PASS Parsing: <http:/:b@www.example.com> against <about:blank> +PASS Parsing: <http://:b@www.example.com> against <about:blank> +PASS Parsing: <http:/:@/www.example.com> against <about:blank> +PASS Parsing: <http://user@/www.example.com> against <about:blank> +PASS Parsing: <http:@/www.example.com> against <about:blank> +PASS Parsing: <http:/@/www.example.com> against <about:blank> +PASS Parsing: <http://@/www.example.com> against <about:blank> +PASS Parsing: <https:@/www.example.com> against <about:blank> +PASS Parsing: <http:a:b@/www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@/www.example.com> against <about:blank> +PASS Parsing: <http://a:b@/www.example.com> against <about:blank> +PASS Parsing: <http::@/www.example.com> against <about:blank> +PASS Parsing: <http:a:@www.example.com> against <about:blank> +PASS Parsing: <http:/a:@www.example.com> against <about:blank> +PASS Parsing: <http://a:@www.example.com> against <about:blank> +PASS Parsing: <http://www.@pple.com> against <about:blank> +PASS Parsing: <http:@:www.example.com> against <about:blank> +PASS Parsing: <http:/@:www.example.com> against <about:blank> +PASS Parsing: <http://@:www.example.com> against <about:blank> +PASS Parsing: <http://:@www.example.com> against <about:blank> +PASS Parsing: </> against <http://www.example.com/test> +PASS Parsing: </test.txt> against <http://www.example.com/test> +PASS Parsing: <.> against <http://www.example.com/test> +PASS Parsing: <..> against <http://www.example.com/test> +PASS Parsing: <test.txt> against <http://www.example.com/test> +PASS Parsing: <./test.txt> against <http://www.example.com/test> +PASS Parsing: <../test.txt> against <http://www.example.com/test> +PASS Parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Parsing: <../../test.txt> against <http://www.example.com/test> +PASS Parsing: <中/test.txt> against <http://www.example.com/test> +PASS Parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Parsing: <file:...> against <http://www.example.com/test> +PASS Parsing: <file:..> against <http://www.example.com/test> +PASS Parsing: <file:a> against <http://www.example.com/test> +PASS Parsing: <http://ExAmPlE.CoM> against <http://other.com/> +FAIL Parsing: <http://example example.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://Goo%20 goo%7C|.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://[]> against <http://other.com/> +PASS Parsing: <http://[:]> against <http://other.com/> +FAIL Parsing: <http://GOO goo.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Parsing: <http://zyx.com> against <http://other.com/> +PASS Parsing: <http://%ef%b7%90zyx.com> against <http://other.com/> +PASS Parsing: <https://�> against <about:blank> +PASS Parsing: <https://%EF%BF%BD> against <about:blank> +PASS Parsing: <https://x/�?�#�> against <about:blank> +PASS Parsing: <http://Go.com> against <http://other.com/> +FAIL Parsing: <http://%41.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://%ef%bc%85%ef%bc%94%ef%bc%91.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://%00.com> against <http://other.com/> +PASS Parsing: <http://%ef%bc%85%ef%bc%90%ef%bc%90.com> against <http://other.com/> +PASS Parsing: <http://你好你好> against <http://other.com/> +FAIL Parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: href expected "https://xn--fa-hia.example/" but got "https://fass.example/" +FAIL Parsing: <sc://faß.ExAmPlE/> against <about:blank> assert_equals: host expected "fa%C3%9F.ExAmPlE" but got "" +PASS Parsing: <http://%zz%66%a.com> against <http://other.com/> +PASS Parsing: <http://%25> against <http://other.com/> +PASS Parsing: <http://hello%00> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Parsing: <http://192.168.0.257> against <http://other.com/> +PASS Parsing: <http://%3g%78%63%30%2e%30%32%35%30%2E.01> against <http://other.com/> +FAIL Parsing: <http://192.168.0.1 hello> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <https://x x:12> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Parsing: <http://./> against <about:blank> +PASS Parsing: <http://../> against <about:blank> +PASS Parsing: <http://0..0x300/> against <about:blank> +PASS Parsing: <http://[www.google.com]/> against <about:blank> +PASS Parsing: <http://[google.com]> against <http://other.com/> +PASS Parsing: <http://[::1.2.3.4x]> against <http://other.com/> +FAIL Parsing: <http://[::1.2.3.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.2.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Parsing: <#> against <test:test> +PASS Parsing: <#x> against <mailto:x@x.com> +PASS Parsing: <#x> against <data:,> +PASS Parsing: <#x> against <about:blank> +PASS Parsing: <#> against <test:test?test> +PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Parsing: <http://host/?'> against <about:blank> +FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got "" +PASS Parsing: </some/path> against <http://user@example.org/smth> +PASS Parsing: <> against <http://user:pass@example.org:21/smth> +PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Parsing: <i> against <sc:sd> +PASS Parsing: <i> against <sc:sd/sd> +PASS Parsing: <i> against <sc:/pa/pa> +FAIL Parsing: <i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/i" but got "///pa/i" +PASS Parsing: <../i> against <sc:sd> +PASS Parsing: <../i> against <sc:sd/sd> +PASS Parsing: <../i> against <sc:/pa/pa> +FAIL Parsing: <../i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <../i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: </i> against <sc:sd> +PASS Parsing: </i> against <sc:sd/sd> +PASS Parsing: </i> against <sc:/pa/pa> +FAIL Parsing: </i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: </i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: <?i> against <sc:sd> +PASS Parsing: <?i> against <sc:sd/sd> +PASS Parsing: <?i> against <sc:/pa/pa> +FAIL Parsing: <?i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <?i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +PASS Parsing: <#i> against <sc:sd> +PASS Parsing: <#i> against <sc:sd/sd> +PASS Parsing: <#i> against <sc:/pa/pa> +FAIL Parsing: <#i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <#i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +FAIL Parsing: <about:/../> against <about:blank> assert_equals: href expected "about:/" but got "about:/../" +FAIL Parsing: <data:/../> against <about:blank> assert_equals: href expected "data:/" but got "data:/../" +FAIL Parsing: <javascript:/../> against <about:blank> assert_equals: href expected "javascript:/" but got "javascript:/../" +FAIL Parsing: <mailto:/../> against <about:blank> assert_equals: href expected "mailto:/" but got "mailto:/../" +FAIL Parsing: <sc://ñ.test/> against <about:blank> assert_equals: host expected "%C3%B1.test" but got "" +FAIL Parsing: <sc://\0/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc:// /> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://%/> against <about:blank> assert_equals: host expected "%" but got "" +FAIL Parsing: <sc://@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://te@s:t@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:12/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://[/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://\/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://]/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Parsing: <sc:\../> against <about:blank> +PASS Parsing: <sc::a@example.net> against <about:blank> +PASS Parsing: <wow:%NBD> against <about:blank> +PASS Parsing: <wow:%1G> against <about:blank> +FAIL Parsing: <wow:> against <about:blank> assert_equals: href expected "wow:%EF%BF%BF" but got "wow:%EF%BF%BD" +FAIL Parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://a^b> against <about:blank> +FAIL Parsing: <non-special://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a^b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> assert_equals: host expected "%1F!\"$&'()*+,-.;=_`{|}~" but got "" +PASS Parsing: <ftp://example.com%80/> against <about:blank> +PASS Parsing: <ftp://example.com%A0/> against <about:blank> +PASS Parsing: <https://example.com%80/> against <about:blank> +PASS Parsing: <https://example.com%A0/> against <about:blank> +PASS Parsing: <ftp://%e2%98%83> against <about:blank> +PASS Parsing: <https://%e2%98%83> against <about:blank> +PASS Parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <https://example.org/foo/bar> +PASS Parsing: <sc:> against <https://example.org/foo/bar> +PASS Parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Parsing: <http://192.168.257> against <http://other.com/> +PASS Parsing: <http://192.168.257.com> against <http://other.com/> +PASS Parsing: <http://256> against <http://other.com/> +PASS Parsing: <http://256.com> against <http://other.com/> +PASS Parsing: <http://999999999> against <http://other.com/> +PASS Parsing: <http://999999999.com> against <http://other.com/> +PASS Parsing: <http://10000000000> against <http://other.com/> +PASS Parsing: <http://10000000000.com> against <http://other.com/> +PASS Parsing: <http://4294967295> against <http://other.com/> +PASS Parsing: <http://4294967296> against <http://other.com/> +PASS Parsing: <http://0xffffffff> against <http://other.com/> +PASS Parsing: <http://0xffffffff1> against <http://other.com/> +PASS Parsing: <http://256.256.256.256> against <http://other.com/> +PASS Parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Parsing: <https://0x.0x.0> against <about:blank> +PASS Parsing: <https://0x100000000/test> against <about:blank> +PASS Parsing: <https://256.0.0.1/test> against <about:blank> +PASS Parsing: <file:///C%3A/> against <about:blank> +PASS Parsing: <file:///C%7C/> against <about:blank> +PASS Parsing: <pix/submit.gif> against <file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html> +FAIL Parsing: <..> against <file:///C:/> assert_equals: href expected "file:///C:/" but got "file:///" +PASS Parsing: <..> against <file:///> +FAIL Parsing: </> against <file:///C:/a/b> assert_equals: href expected "file:///C:/" but got "file:///" +FAIL Parsing: </> against <file://h/C:/a/b> assert_equals: href expected "file://h/C:/" but got "file:///" +FAIL Parsing: </> against <file://h/a/b> assert_equals: href expected "file://h/" but got "file:///" +FAIL Parsing: <//d:> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <//d:/..> against <file:///C:/a/b> Failed to construct 'URL': Invalid URL +PASS Parsing: <..> against <file:///ab:/> +PASS Parsing: <..> against <file:///1:/> +PASS Parsing: <> against <file:///test?test#test> +PASS Parsing: <file:> against <file:///test?test#test> +PASS Parsing: <?x> against <file:///test?test#test> +PASS Parsing: <file:?x> against <file:///test?test#test> +PASS Parsing: <#x> against <file:///test?test#test> +PASS Parsing: <file:#x> against <file:///test?test#test> +FAIL Parsing: <file:\\//> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\?fox> against <about:blank> assert_equals: href expected "file:////?fox" but got "file:///?fox" +FAIL Parsing: <file:\\\\#guppy> against <about:blank> assert_equals: href expected "file:////#guppy" but got "file:///#guppy" +PASS Parsing: <file://spider///> against <about:blank> +FAIL Parsing: <file:\\localhost//> against <about:blank> assert_equals: href expected "file:////" but got "file://localhost//" +PASS Parsing: <file:///localhost//cat> against <about:blank> +FAIL Parsing: <file://\/localhost//cat> against <about:blank> assert_equals: href expected "file:////localhost//cat" but got "file:///localhost//cat" +FAIL Parsing: <file://localhost//a//../..//> against <about:blank> assert_equals: href expected "file://///" but got "file://localhost///" +FAIL Parsing: </////mouse> against <file:///elephant> assert_equals: href expected "file://///mouse" but got "file:///mouse" +PASS Parsing: <\//pig> against <file://lion/> +FAIL Parsing: <\/localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +FAIL Parsing: <//localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +PASS Parsing: </..//localhost//pig> against <file://lion/> +PASS Parsing: <file://> against <file://ape/> +PASS Parsing: </rooibos> against <file://tea/> +PASS Parsing: </?chai> against <file://tea/> +FAIL Parsing: <C|> against <file://host/dir/file> assert_equals: href expected "file://host/C:" but got "file://host/dir/C%7C" +FAIL Parsing: <C|> against <file://host/D:/dir1/dir2/file> assert_equals: href expected "file://host/C:" but got "file://host/D:/dir1/dir2/C%7C" +FAIL Parsing: <C|#> against <file://host/dir/file> assert_equals: href expected "file://host/C:#" but got "file://host/dir/C%7C#" +FAIL Parsing: <C|?> against <file://host/dir/file> assert_equals: href expected "file://host/C:?" but got "file://host/dir/C%7C?" +FAIL Parsing: <C|/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C| +/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +FAIL Parsing: <C|\> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file://host/dir/C%7C/" +PASS Parsing: <C> against <file://host/dir/file> +FAIL Parsing: <C|a> against <file://host/dir/file> assert_equals: href expected "file://host/dir/C|a" but got "file://host/dir/C%7Ca" +PASS Parsing: </c:/foo/bar> against <file:///c:/baz/qux> +FAIL Parsing: </c|/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///c%7C/foo/bar" +PASS Parsing: <file:\c:\foo\bar> against <file:///c:/baz/qux> +PASS Parsing: </c:/foo/bar> against <file://host/path> +PASS Parsing: <file://example.net/C:/> against <about:blank> +PASS Parsing: <file://1.2.3.4/C:/> against <about:blank> +PASS Parsing: <file://[1::8]/C:/> against <about:blank> +FAIL Parsing: <file:/C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file:///C%7C/" +FAIL Parsing: <file://C|/> against <about:blank> assert_equals: href expected "file:///C:/" but got "file://c%7C/" +PASS Parsing: <file:> against <about:blank> +PASS Parsing: <file:?q=v> against <about:blank> +PASS Parsing: <file:#frag> against <about:blank> +PASS Parsing: <file:///Y:> against <about:blank> +PASS Parsing: <file:///Y:/> against <about:blank> +PASS Parsing: <file:///./Y> against <about:blank> +PASS Parsing: <file:///./Y:> against <about:blank> +PASS Parsing: <\\\.\Y:> against <about:blank> +PASS Parsing: <file:///y:> against <about:blank> +PASS Parsing: <file:///y:/> against <about:blank> +PASS Parsing: <file:///./y> against <about:blank> +PASS Parsing: <file:///./y:> against <about:blank> +PASS Parsing: <\\\.\y:> against <about:blank> +FAIL Parsing: <file://localhost//a//../..//foo> against <about:blank> assert_equals: href expected "file://///foo" but got "file://localhost///foo" +FAIL Parsing: <file://localhost////foo> against <about:blank> assert_equals: href expected "file://////foo" but got "file://localhost////foo" +FAIL Parsing: <file:////foo> against <about:blank> assert_equals: href expected "file:////foo" but got "file:///foo" +PASS Parsing: <file:///one/two> against <file:///> +FAIL Parsing: <file:////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <//one/two> against <file:///> +PASS Parsing: <///one/two> against <file:///> +FAIL Parsing: <////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file:///one/two" +PASS Parsing: <file:///.//> against <file:////> +PASS Parsing: <file:.//p> against <about:blank> +PASS Parsing: <file:/.//p> against <about:blank> +PASS Parsing: <http://[1:0::]> against <http://example.net/> +PASS Parsing: <http://[0:1:2:3:4:5:6:7:8]> against <http://example.net/> +PASS Parsing: <https://[0::0::0]> against <about:blank> +PASS Parsing: <https://[0:.0]> against <about:blank> +PASS Parsing: <https://[0:0:]> against <about:blank> +PASS Parsing: <https://[0:1:2:3:4:5:6:7.0.0.0.1]> against <about:blank> +PASS Parsing: <https://[0:1.00.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.290.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.23.23]> against <about:blank> +PASS Parsing: <http://?> against <about:blank> +PASS Parsing: <http://#> against <about:blank> +PASS Parsing: <http://f:4294967377/c> against <http://example.org/> +PASS Parsing: <http://f:18446744073709551697/c> against <http://example.org/> +PASS Parsing: <http://f:340282366920938463463374607431768211537/c> against <http://example.org/> +FAIL Parsing: <sc://ñ> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ?x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ#x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://?> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <sc://#> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <///> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////x/> against <sc://x/> assert_equals: href expected "sc:////x/" but got "sc://x/" +FAIL Parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> assert_equals: host expected "foobar.com" but got "" +FAIL Parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> assert_equals: username expected "user" but got "" +FAIL Parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> assert_equals: host expected "10.10.10.10:7777" but got "" +FAIL Parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <rsync://foo@host:911/sup> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <git://github.com/foo/bar.git> against <about:blank> assert_equals: host expected "github.com" but got "" +FAIL Parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> assert_equals: host expected "myserver.com:6999" but got "" +FAIL Parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> assert_equals: host expected "fw.example.org:9999" but got "" +FAIL Parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> assert_equals: host expected "localhost:389" but got "" +FAIL Parsing: <git+https://github.com/foo/bar> against <about:blank> assert_equals: host expected "github.com" but got "" +PASS Parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +FAIL Parsing: <non-spec:/.//> against <about:blank> assert_equals: pathname expected "//" but got "/.//" +FAIL Parsing: <non-spec:/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/..//" +FAIL Parsing: <non-spec:/a/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/a/..//" +FAIL Parsing: <non-spec:/.//path> against <about:blank> assert_equals: pathname expected "//path" but got "/.//path" +FAIL Parsing: <non-spec:/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <non-spec:/a/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/a/..//path" +FAIL Parsing: </.//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: </..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <a/..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//p" but got "non-spec:/..//p" +FAIL Parsing: <path> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <../path> against <non-spec:/.//p> assert_equals: href expected "non-spec:/path" but got "non-spec:/./path" +FAIL Parsing: <non-special://%E2%80%A0/> against <about:blank> assert_equals: host expected "%E2%80%A0" but got "" +FAIL Parsing: <non-special://H%4fSt/path> against <about:blank> assert_equals: host expected "H%4fSt" but got "" +FAIL Parsing: <non-special://[1:2:0:0:5:0:0:0]/> against <about:blank> assert_equals: href expected "non-special://[1:2:0:0:5::]/" but got "non-special://[1:2:0:0:5:0:0:0]/" +FAIL Parsing: <non-special://[1:2:0:0:0:0:0:3]/> against <about:blank> assert_equals: href expected "non-special://[1:2::3]/" but got "non-special://[1:2:0:0:0:0:0:3]/" +FAIL Parsing: <non-special://[1:2::3]:80/> against <about:blank> assert_equals: host expected "[1:2::3]:80" but got "" +FAIL Parsing: <non-special://[:80/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <blob:https://example.com:443/> against <about:blank> +PASS Parsing: <blob:d3958f5c-0777-0845-9dcf-2cb28783acaf> against <about:blank> +PASS Parsing: <http://0177.0.0.0189> against <about:blank> +PASS Parsing: <http://0x7f.0.0.0x7g> against <about:blank> +PASS Parsing: <http://0X7F.0.0.0X7G> against <about:blank> +PASS Parsing: <http://[::127.0.0.0.1]> against <about:blank> +PASS Parsing: <http://[0:1:0:1:0:1:0:1]> against <about:blank> +PASS Parsing: <http://[1:0:1:0:1:0:1:0]> against <about:blank> +PASS Parsing: <http://example.org/test?"> against <about:blank> +PASS Parsing: <http://example.org/test?#> against <about:blank> +PASS Parsing: <http://example.org/test?<> against <about:blank> +PASS Parsing: <http://example.org/test?>> against <about:blank> +PASS Parsing: <http://example.org/test?⌣> against <about:blank> +PASS Parsing: <http://example.org/test?%23%23> against <about:blank> +PASS Parsing: <http://example.org/test?%GH> against <about:blank> +PASS Parsing: <http://example.org/test?a#%EF> against <about:blank> +PASS Parsing: <http://example.org/test?a#%GH> against <about:blank> +PASS Parsing: <a> against <about:blank> +PASS Parsing: <a/> against <about:blank> +PASS Parsing: <a//> against <about:blank> +PASS Parsing: <test-a-colon.html> against <a:> +PASS Parsing: <test-a-colon-b.html> against <a:b> +PASS Parsing: <test-a-colon-slash.html> against <a:/> +FAIL Parsing: <test-a-colon-slash-slash.html> against <a://> Failed to construct 'URL': Invalid URL +PASS Parsing: <test-a-colon-slash-b.html> against <a:/b> +FAIL Parsing: <test-a-colon-slash-slash-b.html> against <a://b> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://example.org/test?a#b\0c> against <about:blank> assert_equals: href expected "http://example.org/test?a#b%00c" but got "http://example.org/test?a#bc" +FAIL Parsing: <non-spec://example.org/test?a#b\0c> against <about:blank> assert_equals: host expected "example.org" but got "" +PASS Parsing: <non-spec:/test?a#b\0c> against <about:blank> +PASS Parsing: <10.0.0.7:8080/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a!@$*=/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a1234567890-+.:foo/bar> against <http://example.com/dir/file> +PASS Parsing: <file://ab/p> against <about:blank> +PASS Parsing: <file://a%C2%ADb/p> against <about:blank> +PASS Parsing: <file:///p> against <about:blank> +PASS Parsing: <file://%C2%AD/p> against <about:blank> +FAIL Parsing: <file://xn--/p> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <#link> against <https://example.org/##link> +PASS Parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin.any-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin.any-expected.txt new file mode 100644 index 0000000..e6b9139 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin.any-expected.txt
@@ -0,0 +1,322 @@ +This is a testharness.js-based test. +Found 309 tests; 302 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Origin parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Origin parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Origin parsing: <https://test:@test> against <about:blank> +PASS Origin parsing: <https://:@test> against <about:blank> +PASS Origin parsing: <non-special://test:@test/x> against <about:blank> +PASS Origin parsing: <non-special://:@test/x> against <about:blank> +PASS Origin parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Origin parsing: < foo.com > against <http://example.org/foo/bar> +PASS Origin parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Origin parsing: <> against <http://example.org/foo/bar> +PASS Origin parsing: < > against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <:> against <http://example.org/foo/bar> +PASS Origin parsing: <:a> against <http://example.org/foo/bar> +PASS Origin parsing: <:/> against <http://example.org/foo/bar> +PASS Origin parsing: <:\> against <http://example.org/foo/bar> +PASS Origin parsing: <:#> against <http://example.org/foo/bar> +PASS Origin parsing: <#> against <http://example.org/foo/bar> +PASS Origin parsing: <#/> against <http://example.org/foo/bar> +PASS Origin parsing: <#\> against <http://example.org/foo/bar> +PASS Origin parsing: <#;?> against <http://example.org/foo/bar> +PASS Origin parsing: <?> against <http://example.org/foo/bar> +PASS Origin parsing: </> against <http://example.org/foo/bar> +PASS Origin parsing: <:23> against <http://example.org/foo/bar> +PASS Origin parsing: </:23> against <http://example.org/foo/bar> +PASS Origin parsing: <::> against <http://example.org/foo/bar> +PASS Origin parsing: <::23> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://> against <http://example.org/foo/bar> +PASS Origin parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Origin parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Origin parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:////://///> against <http://example.org/foo/bar> +PASS Origin parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Origin parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Origin parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Origin parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Origin parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Origin parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Origin parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Origin parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Origin parsing: <#β> against <http://example.org/foo/bar> +PASS Origin parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Origin parsing: <tel:1234567890> against <http://example.org/foo/bar> +PASS Origin parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> +PASS Origin parsing: <http://example.com/././foo> against <about:blank> +PASS Origin parsing: <http://example.com/./.foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo/.> against <about:blank> +PASS Origin parsing: <http://example.com/foo/./> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Origin parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> +PASS Origin parsing: <http://example.com////../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Origin parsing: <http://example.com/foo> against <about:blank> +PASS Origin parsing: <http://example.com/%20foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo%> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2©zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%41%7a> against <about:blank> +PASS Origin parsing: <http://example.com/foo %91> against <about:blank> +FAIL Origin parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Origin parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Origin parsing: <http://example.com/foo bar> against <about:blank> +PASS Origin parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Origin parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Origin parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Origin parsing: <http://example.com/你好你好> against <about:blank> +PASS Origin parsing: <http://example.com/‥/foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo//bar> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +PASS Origin parsing: <data:test# »> against <about:blank> +PASS Origin parsing: <http://www.google.com> against <about:blank> +PASS Origin parsing: <http://192.0x00A80001> against <about:blank> +PASS Origin parsing: <http://www/foo%2Ehtml> against <about:blank> +PASS Origin parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Origin parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Origin parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Origin parsing: <http://foo:80/> against <about:blank> +PASS Origin parsing: <http://foo:81/> against <about:blank> +PASS Origin parsing: <httpa://foo:80/> against <about:blank> +PASS Origin parsing: <https://foo:443/> against <about:blank> +PASS Origin parsing: <https://foo:80/> against <about:blank> +PASS Origin parsing: <ftp://foo:21/> against <about:blank> +PASS Origin parsing: <ftp://foo:80/> against <about:blank> +PASS Origin parsing: <gopher://foo:70/> against <about:blank> +PASS Origin parsing: <gopher://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:80/> against <about:blank> +PASS Origin parsing: <ws://foo:81/> against <about:blank> +PASS Origin parsing: <ws://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:815/> against <about:blank> +PASS Origin parsing: <wss://foo:80/> against <about:blank> +PASS Origin parsing: <wss://foo:81/> against <about:blank> +PASS Origin parsing: <wss://foo:443/> against <about:blank> +PASS Origin parsing: <wss://foo:815/> against <about:blank> +PASS Origin parsing: <http:/example.com/> against <about:blank> +PASS Origin parsing: <ftp:/example.com/> against <about:blank> +PASS Origin parsing: <https:/example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Origin parsing: <ftps:/example.com/> against <about:blank> +PASS Origin parsing: <gopher:/example.com/> against <about:blank> +PASS Origin parsing: <ws:/example.com/> against <about:blank> +PASS Origin parsing: <wss:/example.com/> against <about:blank> +PASS Origin parsing: <data:/example.com/> against <about:blank> +PASS Origin parsing: <javascript:/example.com/> against <about:blank> +PASS Origin parsing: <mailto:/example.com/> against <about:blank> +PASS Origin parsing: <http:example.com/> against <about:blank> +PASS Origin parsing: <ftp:example.com/> against <about:blank> +PASS Origin parsing: <https:example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:example.com/> against <about:blank> +PASS Origin parsing: <ftps:example.com/> against <about:blank> +PASS Origin parsing: <gopher:example.com/> against <about:blank> +PASS Origin parsing: <ws:example.com/> against <about:blank> +PASS Origin parsing: <wss:example.com/> against <about:blank> +PASS Origin parsing: <data:example.com/> against <about:blank> +PASS Origin parsing: <javascript:example.com/> against <about:blank> +PASS Origin parsing: <mailto:example.com/> against <about:blank> +PASS Origin parsing: <http:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/@www.example.com> against <about:blank> +PASS Origin parsing: <http://@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://@pple.com> against <about:blank> +PASS Origin parsing: <http::b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://www.@pple.com> against <about:blank> +PASS Origin parsing: <http://:@www.example.com> against <about:blank> +PASS Origin parsing: </> against <http://www.example.com/test> +PASS Origin parsing: </test.txt> against <http://www.example.com/test> +PASS Origin parsing: <.> against <http://www.example.com/test> +PASS Origin parsing: <..> against <http://www.example.com/test> +PASS Origin parsing: <test.txt> against <http://www.example.com/test> +PASS Origin parsing: <./test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <中/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <http://ExAmPlE.CoM> against <http://other.com/> +PASS Origin parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Origin parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Origin parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Origin parsing: <https://x/�?�#�> against <about:blank> +PASS Origin parsing: <http://Go.com> against <http://other.com/> +PASS Origin parsing: <http://你好你好> against <http://other.com/> +FAIL Origin parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: origin expected "https://xn--fa-hia.example" but got "https://fass.example" +PASS Origin parsing: <sc://faß.ExAmPlE/> against <about:blank> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Origin parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Origin parsing: <http://./> against <about:blank> +PASS Origin parsing: <http://../> against <about:blank> +PASS Origin parsing: <http://0..0x300/> against <about:blank> +PASS Origin parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Origin parsing: <#> against <test:test> +PASS Origin parsing: <#x> against <mailto:x@x.com> +PASS Origin parsing: <#x> against <data:,> +PASS Origin parsing: <#x> against <about:blank> +PASS Origin parsing: <#> against <test:test?test> +PASS Origin parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Origin parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Origin parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Origin parsing: <http://host/?'> against <about:blank> +PASS Origin parsing: <notspecial://host/?'> against <about:blank> +PASS Origin parsing: </some/path> against <http://user@example.org/smth> +PASS Origin parsing: <> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: <i> against <sc:/pa/pa> +PASS Origin parsing: <i> against <sc://ho/pa> +PASS Origin parsing: <i> against <sc:///pa/pa> +PASS Origin parsing: <../i> against <sc:/pa/pa> +PASS Origin parsing: <../i> against <sc://ho/pa> +PASS Origin parsing: <../i> against <sc:///pa/pa> +PASS Origin parsing: </i> against <sc:/pa/pa> +PASS Origin parsing: </i> against <sc://ho/pa> +PASS Origin parsing: </i> against <sc:///pa/pa> +PASS Origin parsing: <?i> against <sc:/pa/pa> +PASS Origin parsing: <?i> against <sc://ho/pa> +PASS Origin parsing: <?i> against <sc:///pa/pa> +PASS Origin parsing: <#i> against <sc:sd> +PASS Origin parsing: <#i> against <sc:sd/sd> +PASS Origin parsing: <#i> against <sc:/pa/pa> +PASS Origin parsing: <#i> against <sc://ho/pa> +PASS Origin parsing: <#i> against <sc:///pa/pa> +PASS Origin parsing: <about:/../> against <about:blank> +PASS Origin parsing: <data:/../> against <about:blank> +PASS Origin parsing: <javascript:/../> against <about:blank> +PASS Origin parsing: <mailto:/../> against <about:blank> +PASS Origin parsing: <sc://ñ.test/> against <about:blank> +FAIL Origin parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc:\../> against <about:blank> +PASS Origin parsing: <sc::a@example.net> against <about:blank> +PASS Origin parsing: <wow:%NBD> against <about:blank> +PASS Origin parsing: <wow:%1G> against <about:blank> +PASS Origin parsing: <wow:> against <about:blank> +FAIL Origin parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> +PASS Origin parsing: <ftp://%e2%98%83> against <about:blank> +PASS Origin parsing: <https://%e2%98%83> against <about:blank> +PASS Origin parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Origin parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Origin parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Origin parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Origin parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <http:> against <http://example.org/foo/bar> +PASS Origin parsing: <sc:> against <https://example.org/foo/bar> +PASS Origin parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Origin parsing: <http://192.168.257> against <http://other.com/> +PASS Origin parsing: <http://192.168.257.com> against <http://other.com/> +PASS Origin parsing: <http://256> against <http://other.com/> +PASS Origin parsing: <http://256.com> against <http://other.com/> +PASS Origin parsing: <http://999999999> against <http://other.com/> +PASS Origin parsing: <http://999999999.com> against <http://other.com/> +PASS Origin parsing: <http://10000000000.com> against <http://other.com/> +PASS Origin parsing: <http://4294967295> against <http://other.com/> +PASS Origin parsing: <http://0xffffffff> against <http://other.com/> +PASS Origin parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Origin parsing: <https://0x.0x.0> against <about:blank> +PASS Origin parsing: <http://[1:0::]> against <http://example.net/> +PASS Origin parsing: <sc://ñ> against <about:blank> +PASS Origin parsing: <sc://ñ?x> against <about:blank> +PASS Origin parsing: <sc://ñ#x> against <about:blank> +FAIL Origin parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> +PASS Origin parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> +PASS Origin parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> +PASS Origin parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> +PASS Origin parsing: <rsync://foo@host:911/sup> against <about:blank> +PASS Origin parsing: <git://github.com/foo/bar.git> against <about:blank> +PASS Origin parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> +PASS Origin parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> +PASS Origin parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> +PASS Origin parsing: <git+https://github.com/foo/bar> against <about:blank> +PASS Origin parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Origin parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +PASS Origin parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Origin parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Origin parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin.any.worker-expected.txt new file mode 100644 index 0000000..e6b9139 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin.any.worker-expected.txt
@@ -0,0 +1,322 @@ +This is a testharness.js-based test. +Found 309 tests; 302 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Origin parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Origin parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Origin parsing: <https://test:@test> against <about:blank> +PASS Origin parsing: <https://:@test> against <about:blank> +PASS Origin parsing: <non-special://test:@test/x> against <about:blank> +PASS Origin parsing: <non-special://:@test/x> against <about:blank> +PASS Origin parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Origin parsing: < foo.com > against <http://example.org/foo/bar> +PASS Origin parsing: <a: foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Origin parsing: <> against <http://example.org/foo/bar> +PASS Origin parsing: < > against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <:> against <http://example.org/foo/bar> +PASS Origin parsing: <:a> against <http://example.org/foo/bar> +PASS Origin parsing: <:/> against <http://example.org/foo/bar> +PASS Origin parsing: <:\> against <http://example.org/foo/bar> +PASS Origin parsing: <:#> against <http://example.org/foo/bar> +PASS Origin parsing: <#> against <http://example.org/foo/bar> +PASS Origin parsing: <#/> against <http://example.org/foo/bar> +PASS Origin parsing: <#\> against <http://example.org/foo/bar> +PASS Origin parsing: <#;?> against <http://example.org/foo/bar> +PASS Origin parsing: <?> against <http://example.org/foo/bar> +PASS Origin parsing: </> against <http://example.org/foo/bar> +PASS Origin parsing: <:23> against <http://example.org/foo/bar> +PASS Origin parsing: </:23> against <http://example.org/foo/bar> +PASS Origin parsing: <::> against <http://example.org/foo/bar> +PASS Origin parsing: <::23> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://> against <http://example.org/foo/bar> +PASS Origin parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Origin parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Origin parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:////://///> against <http://example.org/foo/bar> +PASS Origin parsing: <c:/foo> against <http://example.org/foo/bar> +PASS Origin parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Origin parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Origin parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Origin parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Origin parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Origin parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Origin parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Origin parsing: <#β> against <http://example.org/foo/bar> +PASS Origin parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Origin parsing: <tel:1234567890> against <http://example.org/foo/bar> +PASS Origin parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> +PASS Origin parsing: <http://example.com/././foo> against <about:blank> +PASS Origin parsing: <http://example.com/./.foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo/.> against <about:blank> +PASS Origin parsing: <http://example.com/foo/./> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Origin parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> +PASS Origin parsing: <http://example.com////../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Origin parsing: <http://example.com/foo> against <about:blank> +PASS Origin parsing: <http://example.com/%20foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo%> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2©zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%41%7a> against <about:blank> +PASS Origin parsing: <http://example.com/foo %91> against <about:blank> +FAIL Origin parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Origin parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Origin parsing: <http://example.com/foo bar> against <about:blank> +PASS Origin parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Origin parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Origin parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Origin parsing: <http://example.com/你好你好> against <about:blank> +PASS Origin parsing: <http://example.com/‥/foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo//bar> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +PASS Origin parsing: <data:test# »> against <about:blank> +PASS Origin parsing: <http://www.google.com> against <about:blank> +PASS Origin parsing: <http://192.0x00A80001> against <about:blank> +PASS Origin parsing: <http://www/foo%2Ehtml> against <about:blank> +PASS Origin parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Origin parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Origin parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Origin parsing: <http://foo:80/> against <about:blank> +PASS Origin parsing: <http://foo:81/> against <about:blank> +PASS Origin parsing: <httpa://foo:80/> against <about:blank> +PASS Origin parsing: <https://foo:443/> against <about:blank> +PASS Origin parsing: <https://foo:80/> against <about:blank> +PASS Origin parsing: <ftp://foo:21/> against <about:blank> +PASS Origin parsing: <ftp://foo:80/> against <about:blank> +PASS Origin parsing: <gopher://foo:70/> against <about:blank> +PASS Origin parsing: <gopher://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:80/> against <about:blank> +PASS Origin parsing: <ws://foo:81/> against <about:blank> +PASS Origin parsing: <ws://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:815/> against <about:blank> +PASS Origin parsing: <wss://foo:80/> against <about:blank> +PASS Origin parsing: <wss://foo:81/> against <about:blank> +PASS Origin parsing: <wss://foo:443/> against <about:blank> +PASS Origin parsing: <wss://foo:815/> against <about:blank> +PASS Origin parsing: <http:/example.com/> against <about:blank> +PASS Origin parsing: <ftp:/example.com/> against <about:blank> +PASS Origin parsing: <https:/example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Origin parsing: <ftps:/example.com/> against <about:blank> +PASS Origin parsing: <gopher:/example.com/> against <about:blank> +PASS Origin parsing: <ws:/example.com/> against <about:blank> +PASS Origin parsing: <wss:/example.com/> against <about:blank> +PASS Origin parsing: <data:/example.com/> against <about:blank> +PASS Origin parsing: <javascript:/example.com/> against <about:blank> +PASS Origin parsing: <mailto:/example.com/> against <about:blank> +PASS Origin parsing: <http:example.com/> against <about:blank> +PASS Origin parsing: <ftp:example.com/> against <about:blank> +PASS Origin parsing: <https:example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:example.com/> against <about:blank> +PASS Origin parsing: <ftps:example.com/> against <about:blank> +PASS Origin parsing: <gopher:example.com/> against <about:blank> +PASS Origin parsing: <ws:example.com/> against <about:blank> +PASS Origin parsing: <wss:example.com/> against <about:blank> +PASS Origin parsing: <data:example.com/> against <about:blank> +PASS Origin parsing: <javascript:example.com/> against <about:blank> +PASS Origin parsing: <mailto:example.com/> against <about:blank> +PASS Origin parsing: <http:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/@www.example.com> against <about:blank> +PASS Origin parsing: <http://@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://@pple.com> against <about:blank> +PASS Origin parsing: <http::b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://www.@pple.com> against <about:blank> +PASS Origin parsing: <http://:@www.example.com> against <about:blank> +PASS Origin parsing: </> against <http://www.example.com/test> +PASS Origin parsing: </test.txt> against <http://www.example.com/test> +PASS Origin parsing: <.> against <http://www.example.com/test> +PASS Origin parsing: <..> against <http://www.example.com/test> +PASS Origin parsing: <test.txt> against <http://www.example.com/test> +PASS Origin parsing: <./test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <中/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <http://ExAmPlE.CoM> against <http://other.com/> +PASS Origin parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Origin parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Origin parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Origin parsing: <https://x/�?�#�> against <about:blank> +PASS Origin parsing: <http://Go.com> against <http://other.com/> +PASS Origin parsing: <http://你好你好> against <http://other.com/> +FAIL Origin parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: origin expected "https://xn--fa-hia.example" but got "https://fass.example" +PASS Origin parsing: <sc://faß.ExAmPlE/> against <about:blank> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Origin parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Origin parsing: <http://./> against <about:blank> +PASS Origin parsing: <http://../> against <about:blank> +PASS Origin parsing: <http://0..0x300/> against <about:blank> +PASS Origin parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Origin parsing: <#> against <test:test> +PASS Origin parsing: <#x> against <mailto:x@x.com> +PASS Origin parsing: <#x> against <data:,> +PASS Origin parsing: <#x> against <about:blank> +PASS Origin parsing: <#> against <test:test?test> +PASS Origin parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Origin parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Origin parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Origin parsing: <http://host/?'> against <about:blank> +PASS Origin parsing: <notspecial://host/?'> against <about:blank> +PASS Origin parsing: </some/path> against <http://user@example.org/smth> +PASS Origin parsing: <> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: <i> against <sc:/pa/pa> +PASS Origin parsing: <i> against <sc://ho/pa> +PASS Origin parsing: <i> against <sc:///pa/pa> +PASS Origin parsing: <../i> against <sc:/pa/pa> +PASS Origin parsing: <../i> against <sc://ho/pa> +PASS Origin parsing: <../i> against <sc:///pa/pa> +PASS Origin parsing: </i> against <sc:/pa/pa> +PASS Origin parsing: </i> against <sc://ho/pa> +PASS Origin parsing: </i> against <sc:///pa/pa> +PASS Origin parsing: <?i> against <sc:/pa/pa> +PASS Origin parsing: <?i> against <sc://ho/pa> +PASS Origin parsing: <?i> against <sc:///pa/pa> +PASS Origin parsing: <#i> against <sc:sd> +PASS Origin parsing: <#i> against <sc:sd/sd> +PASS Origin parsing: <#i> against <sc:/pa/pa> +PASS Origin parsing: <#i> against <sc://ho/pa> +PASS Origin parsing: <#i> against <sc:///pa/pa> +PASS Origin parsing: <about:/../> against <about:blank> +PASS Origin parsing: <data:/../> against <about:blank> +PASS Origin parsing: <javascript:/../> against <about:blank> +PASS Origin parsing: <mailto:/../> against <about:blank> +PASS Origin parsing: <sc://ñ.test/> against <about:blank> +FAIL Origin parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc:\../> against <about:blank> +PASS Origin parsing: <sc::a@example.net> against <about:blank> +PASS Origin parsing: <wow:%NBD> against <about:blank> +PASS Origin parsing: <wow:%1G> against <about:blank> +PASS Origin parsing: <wow:> against <about:blank> +FAIL Origin parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> +PASS Origin parsing: <ftp://%e2%98%83> against <about:blank> +PASS Origin parsing: <https://%e2%98%83> against <about:blank> +PASS Origin parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Origin parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Origin parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Origin parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Origin parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <http:> against <http://example.org/foo/bar> +PASS Origin parsing: <sc:> against <https://example.org/foo/bar> +PASS Origin parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Origin parsing: <http://192.168.257> against <http://other.com/> +PASS Origin parsing: <http://192.168.257.com> against <http://other.com/> +PASS Origin parsing: <http://256> against <http://other.com/> +PASS Origin parsing: <http://256.com> against <http://other.com/> +PASS Origin parsing: <http://999999999> against <http://other.com/> +PASS Origin parsing: <http://999999999.com> against <http://other.com/> +PASS Origin parsing: <http://10000000000.com> against <http://other.com/> +PASS Origin parsing: <http://4294967295> against <http://other.com/> +PASS Origin parsing: <http://0xffffffff> against <http://other.com/> +PASS Origin parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Origin parsing: <https://0x.0x.0> against <about:blank> +PASS Origin parsing: <http://[1:0::]> against <http://example.net/> +PASS Origin parsing: <sc://ñ> against <about:blank> +PASS Origin parsing: <sc://ñ?x> against <about:blank> +PASS Origin parsing: <sc://ñ#x> against <about:blank> +FAIL Origin parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> +PASS Origin parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> +PASS Origin parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> +PASS Origin parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> +PASS Origin parsing: <rsync://foo@host:911/sup> against <about:blank> +PASS Origin parsing: <git://github.com/foo/bar.git> against <about:blank> +PASS Origin parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> +PASS Origin parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> +PASS Origin parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> +PASS Origin parsing: <git+https://github.com/foo/bar> against <about:blank> +PASS Origin parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Origin parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +PASS Origin parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Origin parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Origin parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..b402580 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..3dbed0b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..74b79d6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png index 56e4004..2af6e0a4 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/mac/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..b402580 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor.any-expected.txt new file mode 100644 index 0000000..64ff6c8e2 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor.any-expected.txt
@@ -0,0 +1,652 @@ +This is a testharness.js-based test. +Found 576 tests; 409 PASS, 167 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Parsing: <https://test:@test> against <about:blank> +PASS Parsing: <https://:@test> against <about:blank> +FAIL Parsing: <non-special://test:@test/x> against <about:blank> assert_equals: href expected "non-special://test@test/x" but got "non-special://test:@test/x" +FAIL Parsing: <non-special://:@test/x> against <about:blank> assert_equals: href expected "non-special://test/x" but got "non-special://:@test/x" +PASS Parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Parsing: < foo.com > against <http://example.org/foo/bar> +FAIL Parsing: <a: foo.com> against <http://example.org/foo/bar> assert_equals: href expected "a: foo.com" but got "file:///A:/%20foo.com" +PASS Parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +FAIL Parsing: <lolscheme:x x#x x> against <about:blank> assert_equals: href expected "lolscheme:x x#x%20x" but got "lolscheme:x x#x x" +PASS Parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:b/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: /c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:fifty-two/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:999999/c> against <http://example.org/foo/bar> +FAIL Parsing: <non-special://f:999999/c> against <http://example.org/foo/bar> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://f: 21 / b ? d # e > against <http://example.org/foo/bar> +PASS Parsing: <> against <http://example.org/foo/bar> +PASS Parsing: < > against <http://example.org/foo/bar> +PASS Parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <:> against <http://example.org/foo/bar> +PASS Parsing: <:a> against <http://example.org/foo/bar> +PASS Parsing: <:/> against <http://example.org/foo/bar> +PASS Parsing: <:\> against <http://example.org/foo/bar> +PASS Parsing: <:#> against <http://example.org/foo/bar> +PASS Parsing: <#> against <http://example.org/foo/bar> +PASS Parsing: <#/> against <http://example.org/foo/bar> +PASS Parsing: <#\> against <http://example.org/foo/bar> +PASS Parsing: <#;?> against <http://example.org/foo/bar> +PASS Parsing: <?> against <http://example.org/foo/bar> +PASS Parsing: </> against <http://example.org/foo/bar> +PASS Parsing: <:23> against <http://example.org/foo/bar> +PASS Parsing: </:23> against <http://example.org/foo/bar> +PASS Parsing: <::> against <http://example.org/foo/bar> +PASS Parsing: <::23> against <http://example.org/foo/bar> +FAIL Parsing: <foo://> against <http://example.org/foo/bar> assert_equals: pathname expected "" but got "//" +PASS Parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <foo:/> against <http://example.org/foo/bar> +PASS Parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +FAIL Parsing: <foo://///////> against <http://example.org/foo/bar> assert_equals: pathname expected "///////" but got "/////////" +FAIL Parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> assert_equals: pathname expected "///////bar.com/" but got "/////////bar.com/" +FAIL Parsing: <foo:////://///> against <http://example.org/foo/bar> assert_equals: pathname expected "//://///" but got "////://///" +FAIL Parsing: <c:/foo> against <http://example.org/foo/bar> assert_equals: href expected "c:/foo" but got "file:///C:/foo" +PASS Parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Parsing: <http://[1::2]:3:4> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +FAIL Parsing: <file:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "file:///example.com/" but got "file://example.com/" +PASS Parsing: <file://example:1/> against <about:blank> +PASS Parsing: <file://example:test/> against <about:blank> +PASS Parsing: <file://example%/> against <about:blank> +PASS Parsing: <file://[example]/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Parsing: <#β> against <http://example.org/foo/bar> +PASS Parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Parsing: <tel:1234567890> against <http://example.org/foo/bar> +FAIL Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> assert_equals: host expected "example.com" but got "" +FAIL Parsing: <file:c:\foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:/foo/bar.html" but got "file:///C:/foo/bar.html" +FAIL Parsing: < File:c|////foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:////foo/bar.html" but got "file:///C:////foo/bar.html" +PASS Parsing: <C|/foo/bar> against <file:///tmp/mock/path> +PASS Parsing: </C|\foo\bar> against <file:///tmp/mock/path> +PASS Parsing: <//C|/foo/bar> against <file:///tmp/mock/path> +PASS Parsing: <//server/file> against <file:///tmp/mock/path> +PASS Parsing: <\\server\file> against <file:///tmp/mock/path> +PASS Parsing: </\server/file> against <file:///tmp/mock/path> +PASS Parsing: <file:///foo/bar.txt> against <file:///tmp/mock/path> +PASS Parsing: <file:///home/me> against <file:///tmp/mock/path> +PASS Parsing: <//> against <file:///tmp/mock/path> +PASS Parsing: <///> against <file:///tmp/mock/path> +PASS Parsing: <///test> against <file:///tmp/mock/path> +PASS Parsing: <file://test> against <file:///tmp/mock/path> +FAIL Parsing: <file://localhost> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/test> against <file:///tmp/mock/path> assert_equals: href expected "file:///test" but got "file://localhost/test" +PASS Parsing: <test> against <file:///tmp/mock/path> +PASS Parsing: <file:test> against <file:///tmp/mock/path> +PASS Parsing: <http://example.com/././foo> against <about:blank> +PASS Parsing: <http://example.com/./.foo> against <about:blank> +PASS Parsing: <http://example.com/foo/.> against <about:blank> +PASS Parsing: <http://example.com/foo/./> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/%2e> against <about:blank> +FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/%2e%2" but got "http://example.com/foo/.%2" +FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/%2e.bar" but got "http://example.com/..bar" +PASS Parsing: <http://example.com////../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Parsing: <http://example.com/foo> against <about:blank> +PASS Parsing: <http://example.com/%20foo> against <about:blank> +PASS Parsing: <http://example.com/foo%> against <about:blank> +PASS Parsing: <http://example.com/foo%2> against <about:blank> +PASS Parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Parsing: <http://example.com/foo%2©zbar> against <about:blank> +FAIL Parsing: <http://example.com/foo%41%7a> against <about:blank> assert_equals: href expected "http://example.com/foo%41%7a" but got "http://example.com/fooAz" +PASS Parsing: <http://example.com/foo %91> against <about:blank> +FAIL Parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Parsing: <http://example.com/foo bar> against <about:blank> +PASS Parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Parsing: <http://example.com/你好你好> against <about:blank> +PASS Parsing: <http://example.com/‥/foo> against <about:blank> +PASS Parsing: <http://example.com//foo> against <about:blank> +PASS Parsing: <http://example.com//foo//bar> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected "data:test#%20%C2%BB" but got "data:test# %C2%BB" +PASS Parsing: <http://www.google.com> against <about:blank> +PASS Parsing: <http://192.0x00A80001> against <about:blank> +FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo%2Ehtml" but got "http://www/foo.html" +PASS Parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Parsing: <http://user:pass@/> against <about:blank> +PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Parsing: <http://foo:80/> against <about:blank> +PASS Parsing: <http://foo:81/> against <about:blank> +FAIL Parsing: <httpa://foo:80/> against <about:blank> assert_equals: host expected "foo:80" but got "" +PASS Parsing: <http://foo:-80/> against <about:blank> +PASS Parsing: <https://foo:443/> against <about:blank> +PASS Parsing: <https://foo:80/> against <about:blank> +PASS Parsing: <ftp://foo:21/> against <about:blank> +PASS Parsing: <ftp://foo:80/> against <about:blank> +FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got "" +FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got "" +PASS Parsing: <ws://foo:80/> against <about:blank> +PASS Parsing: <ws://foo:81/> against <about:blank> +PASS Parsing: <ws://foo:443/> against <about:blank> +PASS Parsing: <ws://foo:815/> against <about:blank> +PASS Parsing: <wss://foo:80/> against <about:blank> +PASS Parsing: <wss://foo:81/> against <about:blank> +PASS Parsing: <wss://foo:443/> against <about:blank> +PASS Parsing: <wss://foo:815/> against <about:blank> +PASS Parsing: <http:/example.com/> against <about:blank> +PASS Parsing: <ftp:/example.com/> against <about:blank> +PASS Parsing: <https:/example.com/> against <about:blank> +PASS Parsing: <madeupscheme:/example.com/> against <about:blank> +FAIL Parsing: <file:/example.com/> against <about:blank> assert_equals: href expected "file:///example.com/" but got "file://example.com/" +PASS Parsing: <ftps:/example.com/> against <about:blank> +PASS Parsing: <gopher:/example.com/> against <about:blank> +PASS Parsing: <ws:/example.com/> against <about:blank> +PASS Parsing: <wss:/example.com/> against <about:blank> +PASS Parsing: <data:/example.com/> against <about:blank> +PASS Parsing: <javascript:/example.com/> against <about:blank> +PASS Parsing: <mailto:/example.com/> against <about:blank> +PASS Parsing: <http:example.com/> against <about:blank> +PASS Parsing: <ftp:example.com/> against <about:blank> +PASS Parsing: <https:example.com/> against <about:blank> +PASS Parsing: <madeupscheme:example.com/> against <about:blank> +PASS Parsing: <ftps:example.com/> against <about:blank> +PASS Parsing: <gopher:example.com/> against <about:blank> +PASS Parsing: <ws:example.com/> against <about:blank> +PASS Parsing: <wss:example.com/> against <about:blank> +PASS Parsing: <data:example.com/> against <about:blank> +PASS Parsing: <javascript:example.com/> against <about:blank> +PASS Parsing: <mailto:example.com/> against <about:blank> +PASS Parsing: <http:@www.example.com> against <about:blank> +PASS Parsing: <http:/@www.example.com> against <about:blank> +PASS Parsing: <http://@www.example.com> against <about:blank> +PASS Parsing: <http:a:b@www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Parsing: <http://a:b@www.example.com> against <about:blank> +PASS Parsing: <http://@pple.com> against <about:blank> +PASS Parsing: <http::b@www.example.com> against <about:blank> +PASS Parsing: <http:/:b@www.example.com> against <about:blank> +PASS Parsing: <http://:b@www.example.com> against <about:blank> +PASS Parsing: <http:/:@/www.example.com> against <about:blank> +PASS Parsing: <http://user@/www.example.com> against <about:blank> +PASS Parsing: <http:@/www.example.com> against <about:blank> +PASS Parsing: <http:/@/www.example.com> against <about:blank> +PASS Parsing: <http://@/www.example.com> against <about:blank> +PASS Parsing: <https:@/www.example.com> against <about:blank> +PASS Parsing: <http:a:b@/www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@/www.example.com> against <about:blank> +PASS Parsing: <http://a:b@/www.example.com> against <about:blank> +PASS Parsing: <http::@/www.example.com> against <about:blank> +PASS Parsing: <http:a:@www.example.com> against <about:blank> +PASS Parsing: <http:/a:@www.example.com> against <about:blank> +PASS Parsing: <http://a:@www.example.com> against <about:blank> +PASS Parsing: <http://www.@pple.com> against <about:blank> +PASS Parsing: <http:@:www.example.com> against <about:blank> +PASS Parsing: <http:/@:www.example.com> against <about:blank> +PASS Parsing: <http://@:www.example.com> against <about:blank> +PASS Parsing: <http://:@www.example.com> against <about:blank> +PASS Parsing: </> against <http://www.example.com/test> +PASS Parsing: </test.txt> against <http://www.example.com/test> +PASS Parsing: <.> against <http://www.example.com/test> +PASS Parsing: <..> against <http://www.example.com/test> +PASS Parsing: <test.txt> against <http://www.example.com/test> +PASS Parsing: <./test.txt> against <http://www.example.com/test> +PASS Parsing: <../test.txt> against <http://www.example.com/test> +PASS Parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Parsing: <../../test.txt> against <http://www.example.com/test> +PASS Parsing: <中/test.txt> against <http://www.example.com/test> +PASS Parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Parsing: <//www.example2.com> against <http://www.example.com/test> +FAIL Parsing: <file:...> against <http://www.example.com/test> assert_equals: href expected "file:///..." but got "file://.../" +FAIL Parsing: <file:..> against <http://www.example.com/test> assert_equals: href expected "file:///" but got "file://../" +FAIL Parsing: <file:a> against <http://www.example.com/test> assert_equals: href expected "file:///a" but got "file://a/" +PASS Parsing: <http://ExAmPlE.CoM> against <http://other.com/> +FAIL Parsing: <http://example example.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://Goo%20 goo%7C|.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://[]> against <http://other.com/> +PASS Parsing: <http://[:]> against <http://other.com/> +FAIL Parsing: <http://GOO goo.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Parsing: <http://zyx.com> against <http://other.com/> +PASS Parsing: <http://%ef%b7%90zyx.com> against <http://other.com/> +PASS Parsing: <https://�> against <about:blank> +PASS Parsing: <https://%EF%BF%BD> against <about:blank> +PASS Parsing: <https://x/�?�#�> against <about:blank> +PASS Parsing: <http://Go.com> against <http://other.com/> +FAIL Parsing: <http://%41.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://%ef%bc%85%ef%bc%94%ef%bc%91.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://%00.com> against <http://other.com/> +PASS Parsing: <http://%ef%bc%85%ef%bc%90%ef%bc%90.com> against <http://other.com/> +PASS Parsing: <http://你好你好> against <http://other.com/> +FAIL Parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: href expected "https://xn--fa-hia.example/" but got "https://fass.example/" +FAIL Parsing: <sc://faß.ExAmPlE/> against <about:blank> assert_equals: host expected "fa%C3%9F.ExAmPlE" but got "" +PASS Parsing: <http://%zz%66%a.com> against <http://other.com/> +PASS Parsing: <http://%25> against <http://other.com/> +PASS Parsing: <http://hello%00> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Parsing: <http://192.168.0.257> against <http://other.com/> +PASS Parsing: <http://%3g%78%63%30%2e%30%32%35%30%2E.01> against <http://other.com/> +FAIL Parsing: <http://192.168.0.1 hello> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <https://x x:12> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Parsing: <http://./> against <about:blank> +PASS Parsing: <http://../> against <about:blank> +PASS Parsing: <http://0..0x300/> against <about:blank> +PASS Parsing: <http://[www.google.com]/> against <about:blank> +PASS Parsing: <http://[google.com]> against <http://other.com/> +PASS Parsing: <http://[::1.2.3.4x]> against <http://other.com/> +FAIL Parsing: <http://[::1.2.3.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.2.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Parsing: <#> against <test:test> +PASS Parsing: <#x> against <mailto:x@x.com> +PASS Parsing: <#x> against <data:,> +PASS Parsing: <#x> against <about:blank> +PASS Parsing: <#> against <test:test?test> +PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Parsing: <http://host/?'> against <about:blank> +FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got "" +PASS Parsing: </some/path> against <http://user@example.org/smth> +PASS Parsing: <> against <http://user:pass@example.org:21/smth> +PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Parsing: <i> against <sc:sd> +PASS Parsing: <i> against <sc:sd/sd> +PASS Parsing: <i> against <sc:/pa/pa> +FAIL Parsing: <i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/i" but got "///pa/i" +PASS Parsing: <../i> against <sc:sd> +PASS Parsing: <../i> against <sc:sd/sd> +PASS Parsing: <../i> against <sc:/pa/pa> +FAIL Parsing: <../i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <../i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: </i> against <sc:sd> +PASS Parsing: </i> against <sc:sd/sd> +PASS Parsing: </i> against <sc:/pa/pa> +FAIL Parsing: </i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: </i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: <?i> against <sc:sd> +PASS Parsing: <?i> against <sc:sd/sd> +PASS Parsing: <?i> against <sc:/pa/pa> +FAIL Parsing: <?i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <?i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +PASS Parsing: <#i> against <sc:sd> +PASS Parsing: <#i> against <sc:sd/sd> +PASS Parsing: <#i> against <sc:/pa/pa> +FAIL Parsing: <#i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <#i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +FAIL Parsing: <about:/../> against <about:blank> assert_equals: href expected "about:/" but got "about:/../" +FAIL Parsing: <data:/../> against <about:blank> assert_equals: href expected "data:/" but got "data:/../" +FAIL Parsing: <javascript:/../> against <about:blank> assert_equals: href expected "javascript:/" but got "javascript:/../" +FAIL Parsing: <mailto:/../> against <about:blank> assert_equals: href expected "mailto:/" but got "mailto:/../" +FAIL Parsing: <sc://ñ.test/> against <about:blank> assert_equals: host expected "%C3%B1.test" but got "" +FAIL Parsing: <sc://\0/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc:// /> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://%/> against <about:blank> assert_equals: host expected "%" but got "" +FAIL Parsing: <sc://@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://te@s:t@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:12/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://[/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://\/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://]/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Parsing: <sc:\../> against <about:blank> +PASS Parsing: <sc::a@example.net> against <about:blank> +PASS Parsing: <wow:%NBD> against <about:blank> +PASS Parsing: <wow:%1G> against <about:blank> +FAIL Parsing: <wow:> against <about:blank> assert_equals: href expected "wow:%EF%BF%BF" but got "wow:%EF%BF%BD" +FAIL Parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://a^b> against <about:blank> +FAIL Parsing: <non-special://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a^b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> assert_equals: host expected "%1F!\"$&'()*+,-.;=_`{|}~" but got "" +PASS Parsing: <ftp://example.com%80/> against <about:blank> +PASS Parsing: <ftp://example.com%A0/> against <about:blank> +PASS Parsing: <https://example.com%80/> against <about:blank> +PASS Parsing: <https://example.com%A0/> against <about:blank> +PASS Parsing: <ftp://%e2%98%83> against <about:blank> +PASS Parsing: <https://%e2%98%83> against <about:blank> +PASS Parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <https://example.org/foo/bar> +PASS Parsing: <sc:> against <https://example.org/foo/bar> +PASS Parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Parsing: <http://192.168.257> against <http://other.com/> +PASS Parsing: <http://192.168.257.com> against <http://other.com/> +PASS Parsing: <http://256> against <http://other.com/> +PASS Parsing: <http://256.com> against <http://other.com/> +PASS Parsing: <http://999999999> against <http://other.com/> +PASS Parsing: <http://999999999.com> against <http://other.com/> +PASS Parsing: <http://10000000000> against <http://other.com/> +PASS Parsing: <http://10000000000.com> against <http://other.com/> +PASS Parsing: <http://4294967295> against <http://other.com/> +PASS Parsing: <http://4294967296> against <http://other.com/> +PASS Parsing: <http://0xffffffff> against <http://other.com/> +PASS Parsing: <http://0xffffffff1> against <http://other.com/> +PASS Parsing: <http://256.256.256.256> against <http://other.com/> +PASS Parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Parsing: <https://0x.0x.0> against <about:blank> +PASS Parsing: <https://0x100000000/test> against <about:blank> +PASS Parsing: <https://256.0.0.1/test> against <about:blank> +PASS Parsing: <file:///C%3A/> against <about:blank> +PASS Parsing: <file:///C%7C/> against <about:blank> +PASS Parsing: <pix/submit.gif> against <file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html> +PASS Parsing: <..> against <file:///C:/> +PASS Parsing: <..> against <file:///> +PASS Parsing: </> against <file:///C:/a/b> +FAIL Parsing: </> against <file://h/C:/a/b> assert_equals: href expected "file://h/C:/" but got "file:///C:/" +PASS Parsing: </> against <file://h/a/b> +FAIL Parsing: <//d:> against <file:///C:/a/b> assert_equals: href expected "file:///d:" but got "file:///D:" +FAIL Parsing: <//d:/..> against <file:///C:/a/b> assert_equals: href expected "file:///d:/" but got "file:///D:/" +PASS Parsing: <..> against <file:///ab:/> +PASS Parsing: <..> against <file:///1:/> +PASS Parsing: <> against <file:///test?test#test> +PASS Parsing: <file:> against <file:///test?test#test> +PASS Parsing: <?x> against <file:///test?test#test> +PASS Parsing: <file:?x> against <file:///test?test#test> +PASS Parsing: <#x> against <file:///test?test#test> +PASS Parsing: <file:#x> against <file:///test?test#test> +FAIL Parsing: <file:\\//> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\?fox> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <file:\\\\#guppy> against <about:blank> assert_equals: href expected "file:////#guppy" but got "file://%23guppy/" +PASS Parsing: <file://spider///> against <about:blank> +FAIL Parsing: <file:\\localhost//> against <about:blank> assert_equals: href expected "file:////" but got "file://localhost//" +PASS Parsing: <file:///localhost//cat> against <about:blank> +FAIL Parsing: <file://\/localhost//cat> against <about:blank> assert_equals: href expected "file:////localhost//cat" but got "file://localhost//cat" +FAIL Parsing: <file://localhost//a//../..//> against <about:blank> assert_equals: href expected "file://///" but got "file://localhost///" +FAIL Parsing: </////mouse> against <file:///elephant> assert_equals: href expected "file://///mouse" but got "file://mouse/" +PASS Parsing: <\//pig> against <file://lion/> +FAIL Parsing: <\/localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +FAIL Parsing: <//localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +PASS Parsing: </..//localhost//pig> against <file://lion/> +PASS Parsing: <file://> against <file://ape/> +PASS Parsing: </rooibos> against <file://tea/> +PASS Parsing: </?chai> against <file://tea/> +FAIL Parsing: <C|> against <file://host/dir/file> assert_equals: href expected "file://host/C:" but got "file:///C:" +FAIL Parsing: <C|> against <file://host/D:/dir1/dir2/file> assert_equals: href expected "file://host/C:" but got "file:///C:" +FAIL Parsing: <C|#> against <file://host/dir/file> assert_equals: href expected "file://host/C:#" but got "file:///C:#" +FAIL Parsing: <C|?> against <file://host/dir/file> assert_equals: href expected "file://host/C:?" but got "file:///C:?" +FAIL Parsing: <C|/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file:///C:/" +FAIL Parsing: <C| +/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file:///C:/" +FAIL Parsing: <C|\> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file:///C:/" +PASS Parsing: <C> against <file://host/dir/file> +FAIL Parsing: <C|a> against <file://host/dir/file> assert_equals: href expected "file://host/dir/C|a" but got "file:///C:/a" +FAIL Parsing: </c:/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: </c|/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: <file:\c:\foo\bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: </c:/foo/bar> against <file://host/path> assert_equals: href expected "file://host/c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: <file://example.net/C:/> against <about:blank> assert_equals: href expected "file://example.net/C:/" but got "file:///C:/" +FAIL Parsing: <file://1.2.3.4/C:/> against <about:blank> assert_equals: href expected "file://1.2.3.4/C:/" but got "file:///C:/" +FAIL Parsing: <file://[1::8]/C:/> against <about:blank> assert_equals: href expected "file://[1::8]/C:/" but got "file:///C:/" +PASS Parsing: <file:/C|/> against <about:blank> +PASS Parsing: <file://C|/> against <about:blank> +PASS Parsing: <file:> against <about:blank> +FAIL Parsing: <file:?q=v> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <file:#frag> against <about:blank> assert_equals: href expected "file:///#frag" but got "file://%23frag/" +PASS Parsing: <file:///Y:> against <about:blank> +PASS Parsing: <file:///Y:/> against <about:blank> +PASS Parsing: <file:///./Y> against <about:blank> +PASS Parsing: <file:///./Y:> against <about:blank> +FAIL Parsing: <\\\.\Y:> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <file:///y:> against <about:blank> assert_equals: href expected "file:///y:" but got "file:///Y:" +FAIL Parsing: <file:///y:/> against <about:blank> assert_equals: href expected "file:///y:/" but got "file:///Y:/" +PASS Parsing: <file:///./y> against <about:blank> +PASS Parsing: <file:///./y:> against <about:blank> +FAIL Parsing: <\\\.\y:> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <file://localhost//a//../..//foo> against <about:blank> assert_equals: href expected "file://///foo" but got "file://localhost///foo" +FAIL Parsing: <file://localhost////foo> against <about:blank> assert_equals: href expected "file://////foo" but got "file://localhost////foo" +FAIL Parsing: <file:////foo> against <about:blank> assert_equals: href expected "file:////foo" but got "file://foo/" +PASS Parsing: <file:///one/two> against <file:///> +FAIL Parsing: <file:////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file://one/two" +PASS Parsing: <//one/two> against <file:///> +PASS Parsing: <///one/two> against <file:///> +FAIL Parsing: <////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file://one/two" +PASS Parsing: <file:///.//> against <file:////> +FAIL Parsing: <file:.//p> against <about:blank> assert_equals: href expected "file:////p" but got "file://.//p" +FAIL Parsing: <file:/.//p> against <about:blank> assert_equals: href expected "file:////p" but got "file://.//p" +PASS Parsing: <http://[1:0::]> against <http://example.net/> +PASS Parsing: <http://[0:1:2:3:4:5:6:7:8]> against <http://example.net/> +PASS Parsing: <https://[0::0::0]> against <about:blank> +PASS Parsing: <https://[0:.0]> against <about:blank> +PASS Parsing: <https://[0:0:]> against <about:blank> +PASS Parsing: <https://[0:1:2:3:4:5:6:7.0.0.0.1]> against <about:blank> +PASS Parsing: <https://[0:1.00.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.290.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.23.23]> against <about:blank> +PASS Parsing: <http://?> against <about:blank> +PASS Parsing: <http://#> against <about:blank> +PASS Parsing: <http://f:4294967377/c> against <http://example.org/> +PASS Parsing: <http://f:18446744073709551697/c> against <http://example.org/> +PASS Parsing: <http://f:340282366920938463463374607431768211537/c> against <http://example.org/> +FAIL Parsing: <sc://ñ> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ?x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ#x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://?> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <sc://#> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <///> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////x/> against <sc://x/> assert_equals: href expected "sc:////x/" but got "sc://x/" +FAIL Parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> assert_equals: host expected "foobar.com" but got "" +FAIL Parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> assert_equals: username expected "user" but got "" +FAIL Parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> assert_equals: host expected "10.10.10.10:7777" but got "" +FAIL Parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <rsync://foo@host:911/sup> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <git://github.com/foo/bar.git> against <about:blank> assert_equals: host expected "github.com" but got "" +FAIL Parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> assert_equals: host expected "myserver.com:6999" but got "" +FAIL Parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> assert_equals: host expected "fw.example.org:9999" but got "" +FAIL Parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> assert_equals: host expected "localhost:389" but got "" +FAIL Parsing: <git+https://github.com/foo/bar> against <about:blank> assert_equals: host expected "github.com" but got "" +PASS Parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +FAIL Parsing: <non-spec:/.//> against <about:blank> assert_equals: pathname expected "//" but got "/.//" +FAIL Parsing: <non-spec:/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/..//" +FAIL Parsing: <non-spec:/a/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/a/..//" +FAIL Parsing: <non-spec:/.//path> against <about:blank> assert_equals: pathname expected "//path" but got "/.//path" +FAIL Parsing: <non-spec:/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <non-spec:/a/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/a/..//path" +FAIL Parsing: </.//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: </..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <a/..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//p" but got "non-spec:/..//p" +FAIL Parsing: <path> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <../path> against <non-spec:/.//p> assert_equals: href expected "non-spec:/path" but got "non-spec:/./path" +FAIL Parsing: <non-special://%E2%80%A0/> against <about:blank> assert_equals: host expected "%E2%80%A0" but got "" +FAIL Parsing: <non-special://H%4fSt/path> against <about:blank> assert_equals: host expected "H%4fSt" but got "" +FAIL Parsing: <non-special://[1:2:0:0:5:0:0:0]/> against <about:blank> assert_equals: href expected "non-special://[1:2:0:0:5::]/" but got "non-special://[1:2:0:0:5:0:0:0]/" +FAIL Parsing: <non-special://[1:2:0:0:0:0:0:3]/> against <about:blank> assert_equals: href expected "non-special://[1:2::3]/" but got "non-special://[1:2:0:0:0:0:0:3]/" +FAIL Parsing: <non-special://[1:2::3]:80/> against <about:blank> assert_equals: host expected "[1:2::3]:80" but got "" +FAIL Parsing: <non-special://[:80/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <blob:https://example.com:443/> against <about:blank> +PASS Parsing: <blob:d3958f5c-0777-0845-9dcf-2cb28783acaf> against <about:blank> +PASS Parsing: <http://0177.0.0.0189> against <about:blank> +PASS Parsing: <http://0x7f.0.0.0x7g> against <about:blank> +PASS Parsing: <http://0X7F.0.0.0X7G> against <about:blank> +PASS Parsing: <http://[::127.0.0.0.1]> against <about:blank> +PASS Parsing: <http://[0:1:0:1:0:1:0:1]> against <about:blank> +PASS Parsing: <http://[1:0:1:0:1:0:1:0]> against <about:blank> +PASS Parsing: <http://example.org/test?"> against <about:blank> +PASS Parsing: <http://example.org/test?#> against <about:blank> +PASS Parsing: <http://example.org/test?<> against <about:blank> +PASS Parsing: <http://example.org/test?>> against <about:blank> +PASS Parsing: <http://example.org/test?⌣> against <about:blank> +PASS Parsing: <http://example.org/test?%23%23> against <about:blank> +PASS Parsing: <http://example.org/test?%GH> against <about:blank> +PASS Parsing: <http://example.org/test?a#%EF> against <about:blank> +PASS Parsing: <http://example.org/test?a#%GH> against <about:blank> +PASS Parsing: <a> against <about:blank> +PASS Parsing: <a/> against <about:blank> +PASS Parsing: <a//> against <about:blank> +FAIL Parsing: <test-a-colon.html> against <a:> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <test-a-colon-b.html> against <a:b> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <test-a-colon-slash.html> against <a:/> assert_equals: href expected "a:/test-a-colon-slash.html" but got "file:///A:/test-a-colon-slash.html" +FAIL Parsing: <test-a-colon-slash-slash.html> against <a://> assert_equals: href expected "a:///test-a-colon-slash-slash.html" but got "file:///A://test-a-colon-slash-slash.html" +FAIL Parsing: <test-a-colon-slash-b.html> against <a:/b> assert_equals: href expected "a:/test-a-colon-slash-b.html" but got "file:///A:/test-a-colon-slash-b.html" +FAIL Parsing: <test-a-colon-slash-slash-b.html> against <a://b> assert_equals: href expected "a://b/test-a-colon-slash-slash-b.html" but got "file:///A://test-a-colon-slash-slash-b.html" +FAIL Parsing: <http://example.org/test?a#b\0c> against <about:blank> assert_equals: href expected "http://example.org/test?a#b%00c" but got "http://example.org/test?a#bc" +FAIL Parsing: <non-spec://example.org/test?a#b\0c> against <about:blank> assert_equals: host expected "example.org" but got "" +PASS Parsing: <non-spec:/test?a#b\0c> against <about:blank> +PASS Parsing: <10.0.0.7:8080/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a!@$*=/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a1234567890-+.:foo/bar> against <http://example.com/dir/file> +PASS Parsing: <file://ab/p> against <about:blank> +PASS Parsing: <file://a%C2%ADb/p> against <about:blank> +PASS Parsing: <file:///p> against <about:blank> +PASS Parsing: <file://%C2%AD/p> against <about:blank> +FAIL Parsing: <file://xn--/p> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <#link> against <https://example.org/##link> +PASS Parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor.any.worker-expected.txt new file mode 100644 index 0000000..64ff6c8e2 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor.any.worker-expected.txt
@@ -0,0 +1,652 @@ +This is a testharness.js-based test. +Found 576 tests; 409 PASS, 167 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Parsing: <https://test:@test> against <about:blank> +PASS Parsing: <https://:@test> against <about:blank> +FAIL Parsing: <non-special://test:@test/x> against <about:blank> assert_equals: href expected "non-special://test@test/x" but got "non-special://test:@test/x" +FAIL Parsing: <non-special://:@test/x> against <about:blank> assert_equals: href expected "non-special://test/x" but got "non-special://:@test/x" +PASS Parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Parsing: < foo.com > against <http://example.org/foo/bar> +FAIL Parsing: <a: foo.com> against <http://example.org/foo/bar> assert_equals: href expected "a: foo.com" but got "file:///A:/%20foo.com" +PASS Parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +FAIL Parsing: <lolscheme:x x#x x> against <about:blank> assert_equals: href expected "lolscheme:x x#x%20x" but got "lolscheme:x x#x x" +PASS Parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:b/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: /c> against <http://example.org/foo/bar> +PASS Parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:fifty-two/c> against <http://example.org/foo/bar> +PASS Parsing: <http://f:999999/c> against <http://example.org/foo/bar> +FAIL Parsing: <non-special://f:999999/c> against <http://example.org/foo/bar> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://f: 21 / b ? d # e > against <http://example.org/foo/bar> +PASS Parsing: <> against <http://example.org/foo/bar> +PASS Parsing: < > against <http://example.org/foo/bar> +PASS Parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <:> against <http://example.org/foo/bar> +PASS Parsing: <:a> against <http://example.org/foo/bar> +PASS Parsing: <:/> against <http://example.org/foo/bar> +PASS Parsing: <:\> against <http://example.org/foo/bar> +PASS Parsing: <:#> against <http://example.org/foo/bar> +PASS Parsing: <#> against <http://example.org/foo/bar> +PASS Parsing: <#/> against <http://example.org/foo/bar> +PASS Parsing: <#\> against <http://example.org/foo/bar> +PASS Parsing: <#;?> against <http://example.org/foo/bar> +PASS Parsing: <?> against <http://example.org/foo/bar> +PASS Parsing: </> against <http://example.org/foo/bar> +PASS Parsing: <:23> against <http://example.org/foo/bar> +PASS Parsing: </:23> against <http://example.org/foo/bar> +PASS Parsing: <::> against <http://example.org/foo/bar> +PASS Parsing: <::23> against <http://example.org/foo/bar> +FAIL Parsing: <foo://> against <http://example.org/foo/bar> assert_equals: pathname expected "" but got "//" +PASS Parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Parsing: <foo:/> against <http://example.org/foo/bar> +PASS Parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +FAIL Parsing: <foo://///////> against <http://example.org/foo/bar> assert_equals: pathname expected "///////" but got "/////////" +FAIL Parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> assert_equals: pathname expected "///////bar.com/" but got "/////////bar.com/" +FAIL Parsing: <foo:////://///> against <http://example.org/foo/bar> assert_equals: pathname expected "//://///" but got "////://///" +FAIL Parsing: <c:/foo> against <http://example.org/foo/bar> assert_equals: href expected "c:/foo" but got "file:///C:/foo" +PASS Parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Parsing: <http://[1::2]:3:4> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +FAIL Parsing: <file:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "file:///example.com/" but got "file://example.com/" +PASS Parsing: <file://example:1/> against <about:blank> +PASS Parsing: <file://example:test/> against <about:blank> +PASS Parsing: <file://example%/> against <about:blank> +PASS Parsing: <file://[example]/> against <about:blank> +PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Parsing: <#β> against <http://example.org/foo/bar> +PASS Parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Parsing: <tel:1234567890> against <http://example.org/foo/bar> +FAIL Parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> assert_equals: host expected "example.com" but got "" +FAIL Parsing: <file:c:\foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:/foo/bar.html" but got "file:///C:/foo/bar.html" +FAIL Parsing: < File:c|////foo\bar.html> against <file:///tmp/mock/path> assert_equals: href expected "file:///c:////foo/bar.html" but got "file:///C:////foo/bar.html" +PASS Parsing: <C|/foo/bar> against <file:///tmp/mock/path> +PASS Parsing: </C|\foo\bar> against <file:///tmp/mock/path> +PASS Parsing: <//C|/foo/bar> against <file:///tmp/mock/path> +PASS Parsing: <//server/file> against <file:///tmp/mock/path> +PASS Parsing: <\\server\file> against <file:///tmp/mock/path> +PASS Parsing: </\server/file> against <file:///tmp/mock/path> +PASS Parsing: <file:///foo/bar.txt> against <file:///tmp/mock/path> +PASS Parsing: <file:///home/me> against <file:///tmp/mock/path> +PASS Parsing: <//> against <file:///tmp/mock/path> +PASS Parsing: <///> against <file:///tmp/mock/path> +PASS Parsing: <///test> against <file:///tmp/mock/path> +PASS Parsing: <file://test> against <file:///tmp/mock/path> +FAIL Parsing: <file://localhost> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/> against <file:///tmp/mock/path> assert_equals: href expected "file:///" but got "file://localhost/" +FAIL Parsing: <file://localhost/test> against <file:///tmp/mock/path> assert_equals: href expected "file:///test" but got "file://localhost/test" +PASS Parsing: <test> against <file:///tmp/mock/path> +PASS Parsing: <file:test> against <file:///tmp/mock/path> +PASS Parsing: <http://example.com/././foo> against <about:blank> +PASS Parsing: <http://example.com/./.foo> against <about:blank> +PASS Parsing: <http://example.com/foo/.> against <about:blank> +PASS Parsing: <http://example.com/foo/./> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Parsing: <http://example.com/foo/%2e> against <about:blank> +FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/%2e%2" but got "http://example.com/foo/.%2" +FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/%2e.bar" but got "http://example.com/..bar" +PASS Parsing: <http://example.com////../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Parsing: <http://example.com/foo> against <about:blank> +PASS Parsing: <http://example.com/%20foo> against <about:blank> +PASS Parsing: <http://example.com/foo%> against <about:blank> +PASS Parsing: <http://example.com/foo%2> against <about:blank> +PASS Parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Parsing: <http://example.com/foo%2©zbar> against <about:blank> +FAIL Parsing: <http://example.com/foo%41%7a> against <about:blank> assert_equals: href expected "http://example.com/foo%41%7a" but got "http://example.com/fooAz" +PASS Parsing: <http://example.com/foo %91> against <about:blank> +FAIL Parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Parsing: <http://example.com/foo bar> against <about:blank> +PASS Parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Parsing: <http://example.com/你好你好> against <about:blank> +PASS Parsing: <http://example.com/‥/foo> against <about:blank> +PASS Parsing: <http://example.com//foo> against <about:blank> +PASS Parsing: <http://example.com//foo//bar> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected "data:test#%20%C2%BB" but got "data:test# %C2%BB" +PASS Parsing: <http://www.google.com> against <about:blank> +PASS Parsing: <http://192.0x00A80001> against <about:blank> +FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo%2Ehtml" but got "http://www/foo.html" +PASS Parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Parsing: <http://user:pass@/> against <about:blank> +PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Parsing: <http://foo:80/> against <about:blank> +PASS Parsing: <http://foo:81/> against <about:blank> +FAIL Parsing: <httpa://foo:80/> against <about:blank> assert_equals: host expected "foo:80" but got "" +PASS Parsing: <http://foo:-80/> against <about:blank> +PASS Parsing: <https://foo:443/> against <about:blank> +PASS Parsing: <https://foo:80/> against <about:blank> +PASS Parsing: <ftp://foo:21/> against <about:blank> +PASS Parsing: <ftp://foo:80/> against <about:blank> +FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got "" +FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got "" +PASS Parsing: <ws://foo:80/> against <about:blank> +PASS Parsing: <ws://foo:81/> against <about:blank> +PASS Parsing: <ws://foo:443/> against <about:blank> +PASS Parsing: <ws://foo:815/> against <about:blank> +PASS Parsing: <wss://foo:80/> against <about:blank> +PASS Parsing: <wss://foo:81/> against <about:blank> +PASS Parsing: <wss://foo:443/> against <about:blank> +PASS Parsing: <wss://foo:815/> against <about:blank> +PASS Parsing: <http:/example.com/> against <about:blank> +PASS Parsing: <ftp:/example.com/> against <about:blank> +PASS Parsing: <https:/example.com/> against <about:blank> +PASS Parsing: <madeupscheme:/example.com/> against <about:blank> +FAIL Parsing: <file:/example.com/> against <about:blank> assert_equals: href expected "file:///example.com/" but got "file://example.com/" +PASS Parsing: <ftps:/example.com/> against <about:blank> +PASS Parsing: <gopher:/example.com/> against <about:blank> +PASS Parsing: <ws:/example.com/> against <about:blank> +PASS Parsing: <wss:/example.com/> against <about:blank> +PASS Parsing: <data:/example.com/> against <about:blank> +PASS Parsing: <javascript:/example.com/> against <about:blank> +PASS Parsing: <mailto:/example.com/> against <about:blank> +PASS Parsing: <http:example.com/> against <about:blank> +PASS Parsing: <ftp:example.com/> against <about:blank> +PASS Parsing: <https:example.com/> against <about:blank> +PASS Parsing: <madeupscheme:example.com/> against <about:blank> +PASS Parsing: <ftps:example.com/> against <about:blank> +PASS Parsing: <gopher:example.com/> against <about:blank> +PASS Parsing: <ws:example.com/> against <about:blank> +PASS Parsing: <wss:example.com/> against <about:blank> +PASS Parsing: <data:example.com/> against <about:blank> +PASS Parsing: <javascript:example.com/> against <about:blank> +PASS Parsing: <mailto:example.com/> against <about:blank> +PASS Parsing: <http:@www.example.com> against <about:blank> +PASS Parsing: <http:/@www.example.com> against <about:blank> +PASS Parsing: <http://@www.example.com> against <about:blank> +PASS Parsing: <http:a:b@www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Parsing: <http://a:b@www.example.com> against <about:blank> +PASS Parsing: <http://@pple.com> against <about:blank> +PASS Parsing: <http::b@www.example.com> against <about:blank> +PASS Parsing: <http:/:b@www.example.com> against <about:blank> +PASS Parsing: <http://:b@www.example.com> against <about:blank> +PASS Parsing: <http:/:@/www.example.com> against <about:blank> +PASS Parsing: <http://user@/www.example.com> against <about:blank> +PASS Parsing: <http:@/www.example.com> against <about:blank> +PASS Parsing: <http:/@/www.example.com> against <about:blank> +PASS Parsing: <http://@/www.example.com> against <about:blank> +PASS Parsing: <https:@/www.example.com> against <about:blank> +PASS Parsing: <http:a:b@/www.example.com> against <about:blank> +PASS Parsing: <http:/a:b@/www.example.com> against <about:blank> +PASS Parsing: <http://a:b@/www.example.com> against <about:blank> +PASS Parsing: <http::@/www.example.com> against <about:blank> +PASS Parsing: <http:a:@www.example.com> against <about:blank> +PASS Parsing: <http:/a:@www.example.com> against <about:blank> +PASS Parsing: <http://a:@www.example.com> against <about:blank> +PASS Parsing: <http://www.@pple.com> against <about:blank> +PASS Parsing: <http:@:www.example.com> against <about:blank> +PASS Parsing: <http:/@:www.example.com> against <about:blank> +PASS Parsing: <http://@:www.example.com> against <about:blank> +PASS Parsing: <http://:@www.example.com> against <about:blank> +PASS Parsing: </> against <http://www.example.com/test> +PASS Parsing: </test.txt> against <http://www.example.com/test> +PASS Parsing: <.> against <http://www.example.com/test> +PASS Parsing: <..> against <http://www.example.com/test> +PASS Parsing: <test.txt> against <http://www.example.com/test> +PASS Parsing: <./test.txt> against <http://www.example.com/test> +PASS Parsing: <../test.txt> against <http://www.example.com/test> +PASS Parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Parsing: <../../test.txt> against <http://www.example.com/test> +PASS Parsing: <中/test.txt> against <http://www.example.com/test> +PASS Parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Parsing: <//www.example2.com> against <http://www.example.com/test> +FAIL Parsing: <file:...> against <http://www.example.com/test> assert_equals: href expected "file:///..." but got "file://.../" +FAIL Parsing: <file:..> against <http://www.example.com/test> assert_equals: href expected "file:///" but got "file://../" +FAIL Parsing: <file:a> against <http://www.example.com/test> assert_equals: href expected "file:///a" but got "file://a/" +PASS Parsing: <http://ExAmPlE.CoM> against <http://other.com/> +FAIL Parsing: <http://example example.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://Goo%20 goo%7C|.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://[]> against <http://other.com/> +PASS Parsing: <http://[:]> against <http://other.com/> +FAIL Parsing: <http://GOO goo.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Parsing: <http://zyx.com> against <http://other.com/> +PASS Parsing: <http://%ef%b7%90zyx.com> against <http://other.com/> +PASS Parsing: <https://�> against <about:blank> +PASS Parsing: <https://%EF%BF%BD> against <about:blank> +PASS Parsing: <https://x/�?�#�> against <about:blank> +PASS Parsing: <http://Go.com> against <http://other.com/> +FAIL Parsing: <http://%41.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://%ef%bc%85%ef%bc%94%ef%bc%91.com> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://%00.com> against <http://other.com/> +PASS Parsing: <http://%ef%bc%85%ef%bc%90%ef%bc%90.com> against <http://other.com/> +PASS Parsing: <http://你好你好> against <http://other.com/> +FAIL Parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: href expected "https://xn--fa-hia.example/" but got "https://fass.example/" +FAIL Parsing: <sc://faß.ExAmPlE/> against <about:blank> assert_equals: host expected "fa%C3%9F.ExAmPlE" but got "" +PASS Parsing: <http://%zz%66%a.com> against <http://other.com/> +PASS Parsing: <http://%25> against <http://other.com/> +PASS Parsing: <http://hello%00> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Parsing: <http://192.168.0.257> against <http://other.com/> +PASS Parsing: <http://%3g%78%63%30%2e%30%32%35%30%2E.01> against <http://other.com/> +FAIL Parsing: <http://192.168.0.1 hello> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <https://x x:12> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Parsing: <http://./> against <about:blank> +PASS Parsing: <http://../> against <about:blank> +PASS Parsing: <http://0..0x300/> against <about:blank> +PASS Parsing: <http://[www.google.com]/> against <about:blank> +PASS Parsing: <http://[google.com]> against <http://other.com/> +PASS Parsing: <http://[::1.2.3.4x]> against <http://other.com/> +FAIL Parsing: <http://[::1.2.3.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.2.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://[::1.]> against <http://other.com/> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Parsing: <#> against <test:test> +PASS Parsing: <#x> against <mailto:x@x.com> +PASS Parsing: <#x> against <data:,> +PASS Parsing: <#x> against <about:blank> +PASS Parsing: <#> against <test:test?test> +PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Parsing: <http://host/?'> against <about:blank> +FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got "" +PASS Parsing: </some/path> against <http://user@example.org/smth> +PASS Parsing: <> against <http://user:pass@example.org:21/smth> +PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Parsing: <i> against <sc:sd> +PASS Parsing: <i> against <sc:sd/sd> +PASS Parsing: <i> against <sc:/pa/pa> +FAIL Parsing: <i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/i" but got "///pa/i" +PASS Parsing: <../i> against <sc:sd> +PASS Parsing: <../i> against <sc:sd/sd> +PASS Parsing: <../i> against <sc:/pa/pa> +FAIL Parsing: <../i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <../i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: </i> against <sc:sd> +PASS Parsing: </i> against <sc:sd/sd> +PASS Parsing: </i> against <sc:/pa/pa> +FAIL Parsing: </i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: </i> against <sc:///pa/pa> assert_equals: href expected "sc:///i" but got "sc:///pa/i" +PASS Parsing: <?i> against <sc:sd> +PASS Parsing: <?i> against <sc:sd/sd> +PASS Parsing: <?i> against <sc:/pa/pa> +FAIL Parsing: <?i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <?i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +PASS Parsing: <#i> against <sc:sd> +PASS Parsing: <#i> against <sc:sd/sd> +PASS Parsing: <#i> against <sc:/pa/pa> +FAIL Parsing: <#i> against <sc://ho/pa> assert_equals: host expected "ho" but got "" +FAIL Parsing: <#i> against <sc:///pa/pa> assert_equals: pathname expected "/pa/pa" but got "///pa/pa" +FAIL Parsing: <about:/../> against <about:blank> assert_equals: href expected "about:/" but got "about:/../" +FAIL Parsing: <data:/../> against <about:blank> assert_equals: href expected "data:/" but got "data:/../" +FAIL Parsing: <javascript:/../> against <about:blank> assert_equals: href expected "javascript:/" but got "javascript:/../" +FAIL Parsing: <mailto:/../> against <about:blank> assert_equals: href expected "mailto:/" but got "mailto:/../" +FAIL Parsing: <sc://ñ.test/> against <about:blank> assert_equals: host expected "%C3%B1.test" but got "" +FAIL Parsing: <sc://\0/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc:// /> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://%/> against <about:blank> assert_equals: host expected "%" but got "" +FAIL Parsing: <sc://@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://te@s:t@/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://:12/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://[/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://\/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <sc://]/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Parsing: <sc:\../> against <about:blank> +PASS Parsing: <sc::a@example.net> against <about:blank> +PASS Parsing: <wow:%NBD> against <about:blank> +PASS Parsing: <wow:%1G> against <about:blank> +FAIL Parsing: <wow:> against <about:blank> assert_equals: href expected "wow:%EF%BF%BF" but got "wow:%EF%BF%BD" +FAIL Parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <http://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <http://a^b> against <about:blank> +FAIL Parsing: <non-special://a<b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a>b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <non-special://a^b> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> assert_equals: host expected "%1F!\"$&'()*+,-.;=_`{|}~" but got "" +PASS Parsing: <ftp://example.com%80/> against <about:blank> +PASS Parsing: <ftp://example.com%A0/> against <about:blank> +PASS Parsing: <https://example.com%80/> against <about:blank> +PASS Parsing: <https://example.com%A0/> against <about:blank> +PASS Parsing: <ftp://%e2%98%83> against <about:blank> +PASS Parsing: <https://%e2%98%83> against <about:blank> +PASS Parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <http://example.org/foo/bar> +PASS Parsing: <http:> against <https://example.org/foo/bar> +PASS Parsing: <sc:> against <https://example.org/foo/bar> +PASS Parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Parsing: <http://192.168.257> against <http://other.com/> +PASS Parsing: <http://192.168.257.com> against <http://other.com/> +PASS Parsing: <http://256> against <http://other.com/> +PASS Parsing: <http://256.com> against <http://other.com/> +PASS Parsing: <http://999999999> against <http://other.com/> +PASS Parsing: <http://999999999.com> against <http://other.com/> +PASS Parsing: <http://10000000000> against <http://other.com/> +PASS Parsing: <http://10000000000.com> against <http://other.com/> +PASS Parsing: <http://4294967295> against <http://other.com/> +PASS Parsing: <http://4294967296> against <http://other.com/> +PASS Parsing: <http://0xffffffff> against <http://other.com/> +PASS Parsing: <http://0xffffffff1> against <http://other.com/> +PASS Parsing: <http://256.256.256.256> against <http://other.com/> +PASS Parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Parsing: <https://0x.0x.0> against <about:blank> +PASS Parsing: <https://0x100000000/test> against <about:blank> +PASS Parsing: <https://256.0.0.1/test> against <about:blank> +PASS Parsing: <file:///C%3A/> against <about:blank> +PASS Parsing: <file:///C%7C/> against <about:blank> +PASS Parsing: <pix/submit.gif> against <file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html> +PASS Parsing: <..> against <file:///C:/> +PASS Parsing: <..> against <file:///> +PASS Parsing: </> against <file:///C:/a/b> +FAIL Parsing: </> against <file://h/C:/a/b> assert_equals: href expected "file://h/C:/" but got "file:///C:/" +PASS Parsing: </> against <file://h/a/b> +FAIL Parsing: <//d:> against <file:///C:/a/b> assert_equals: href expected "file:///d:" but got "file:///D:" +FAIL Parsing: <//d:/..> against <file:///C:/a/b> assert_equals: href expected "file:///d:/" but got "file:///D:/" +PASS Parsing: <..> against <file:///ab:/> +PASS Parsing: <..> against <file:///1:/> +PASS Parsing: <> against <file:///test?test#test> +PASS Parsing: <file:> against <file:///test?test#test> +PASS Parsing: <?x> against <file:///test?test#test> +PASS Parsing: <file:?x> against <file:///test?test#test> +PASS Parsing: <#x> against <file:///test?test#test> +PASS Parsing: <file:#x> against <file:///test?test#test> +FAIL Parsing: <file:\\//> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\> against <about:blank> assert_equals: href expected "file:////" but got "file:///" +FAIL Parsing: <file:\\\\?fox> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <file:\\\\#guppy> against <about:blank> assert_equals: href expected "file:////#guppy" but got "file://%23guppy/" +PASS Parsing: <file://spider///> against <about:blank> +FAIL Parsing: <file:\\localhost//> against <about:blank> assert_equals: href expected "file:////" but got "file://localhost//" +PASS Parsing: <file:///localhost//cat> against <about:blank> +FAIL Parsing: <file://\/localhost//cat> against <about:blank> assert_equals: href expected "file:////localhost//cat" but got "file://localhost//cat" +FAIL Parsing: <file://localhost//a//../..//> against <about:blank> assert_equals: href expected "file://///" but got "file://localhost///" +FAIL Parsing: </////mouse> against <file:///elephant> assert_equals: href expected "file://///mouse" but got "file://mouse/" +PASS Parsing: <\//pig> against <file://lion/> +FAIL Parsing: <\/localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +FAIL Parsing: <//localhost//pig> against <file://lion/> assert_equals: href expected "file:////pig" but got "file://localhost//pig" +PASS Parsing: </..//localhost//pig> against <file://lion/> +PASS Parsing: <file://> against <file://ape/> +PASS Parsing: </rooibos> against <file://tea/> +PASS Parsing: </?chai> against <file://tea/> +FAIL Parsing: <C|> against <file://host/dir/file> assert_equals: href expected "file://host/C:" but got "file:///C:" +FAIL Parsing: <C|> against <file://host/D:/dir1/dir2/file> assert_equals: href expected "file://host/C:" but got "file:///C:" +FAIL Parsing: <C|#> against <file://host/dir/file> assert_equals: href expected "file://host/C:#" but got "file:///C:#" +FAIL Parsing: <C|?> against <file://host/dir/file> assert_equals: href expected "file://host/C:?" but got "file:///C:?" +FAIL Parsing: <C|/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file:///C:/" +FAIL Parsing: <C| +/> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file:///C:/" +FAIL Parsing: <C|\> against <file://host/dir/file> assert_equals: href expected "file://host/C:/" but got "file:///C:/" +PASS Parsing: <C> against <file://host/dir/file> +FAIL Parsing: <C|a> against <file://host/dir/file> assert_equals: href expected "file://host/dir/C|a" but got "file:///C:/a" +FAIL Parsing: </c:/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: </c|/foo/bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: <file:\c:\foo\bar> against <file:///c:/baz/qux> assert_equals: href expected "file:///c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: </c:/foo/bar> against <file://host/path> assert_equals: href expected "file://host/c:/foo/bar" but got "file:///C:/foo/bar" +FAIL Parsing: <file://example.net/C:/> against <about:blank> assert_equals: href expected "file://example.net/C:/" but got "file:///C:/" +FAIL Parsing: <file://1.2.3.4/C:/> against <about:blank> assert_equals: href expected "file://1.2.3.4/C:/" but got "file:///C:/" +FAIL Parsing: <file://[1::8]/C:/> against <about:blank> assert_equals: href expected "file://[1::8]/C:/" but got "file:///C:/" +PASS Parsing: <file:/C|/> against <about:blank> +PASS Parsing: <file://C|/> against <about:blank> +PASS Parsing: <file:> against <about:blank> +FAIL Parsing: <file:?q=v> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Parsing: <file:#frag> against <about:blank> assert_equals: href expected "file:///#frag" but got "file://%23frag/" +PASS Parsing: <file:///Y:> against <about:blank> +PASS Parsing: <file:///Y:/> against <about:blank> +PASS Parsing: <file:///./Y> against <about:blank> +PASS Parsing: <file:///./Y:> against <about:blank> +FAIL Parsing: <\\\.\Y:> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <file:///y:> against <about:blank> assert_equals: href expected "file:///y:" but got "file:///Y:" +FAIL Parsing: <file:///y:/> against <about:blank> assert_equals: href expected "file:///y:/" but got "file:///Y:/" +PASS Parsing: <file:///./y> against <about:blank> +PASS Parsing: <file:///./y:> against <about:blank> +FAIL Parsing: <\\\.\y:> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <file://localhost//a//../..//foo> against <about:blank> assert_equals: href expected "file://///foo" but got "file://localhost///foo" +FAIL Parsing: <file://localhost////foo> against <about:blank> assert_equals: href expected "file://////foo" but got "file://localhost////foo" +FAIL Parsing: <file:////foo> against <about:blank> assert_equals: href expected "file:////foo" but got "file://foo/" +PASS Parsing: <file:///one/two> against <file:///> +FAIL Parsing: <file:////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file://one/two" +PASS Parsing: <//one/two> against <file:///> +PASS Parsing: <///one/two> against <file:///> +FAIL Parsing: <////one/two> against <file:///> assert_equals: href expected "file:////one/two" but got "file://one/two" +PASS Parsing: <file:///.//> against <file:////> +FAIL Parsing: <file:.//p> against <about:blank> assert_equals: href expected "file:////p" but got "file://.//p" +FAIL Parsing: <file:/.//p> against <about:blank> assert_equals: href expected "file:////p" but got "file://.//p" +PASS Parsing: <http://[1:0::]> against <http://example.net/> +PASS Parsing: <http://[0:1:2:3:4:5:6:7:8]> against <http://example.net/> +PASS Parsing: <https://[0::0::0]> against <about:blank> +PASS Parsing: <https://[0:.0]> against <about:blank> +PASS Parsing: <https://[0:0:]> against <about:blank> +PASS Parsing: <https://[0:1:2:3:4:5:6:7.0.0.0.1]> against <about:blank> +PASS Parsing: <https://[0:1.00.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.290.0.0.0]> against <about:blank> +PASS Parsing: <https://[0:1.23.23]> against <about:blank> +PASS Parsing: <http://?> against <about:blank> +PASS Parsing: <http://#> against <about:blank> +PASS Parsing: <http://f:4294967377/c> against <http://example.org/> +PASS Parsing: <http://f:18446744073709551697/c> against <http://example.org/> +PASS Parsing: <http://f:340282366920938463463374607431768211537/c> against <http://example.org/> +FAIL Parsing: <sc://ñ> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ?x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <sc://ñ#x> against <about:blank> assert_equals: host expected "%C3%B1" but got "" +FAIL Parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Parsing: <sc://?> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <sc://#> against <about:blank> assert_equals: pathname expected "" but got "//" +FAIL Parsing: <///> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////> against <sc://x/> Failed to construct 'URL': Invalid URL +FAIL Parsing: <////x/> against <sc://x/> assert_equals: href expected "sc:////x/" but got "sc://x/" +FAIL Parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> assert_equals: host expected "foobar.com" but got "" +FAIL Parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> assert_equals: username expected "user" but got "" +FAIL Parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> assert_equals: host expected "10.10.10.10:7777" but got "" +FAIL Parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <rsync://foo@host:911/sup> against <about:blank> assert_equals: username expected "foo" but got "" +FAIL Parsing: <git://github.com/foo/bar.git> against <about:blank> assert_equals: host expected "github.com" but got "" +FAIL Parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> assert_equals: host expected "myserver.com:6999" but got "" +FAIL Parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> assert_equals: host expected "fw.example.org:9999" but got "" +FAIL Parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> assert_equals: host expected "localhost:389" but got "" +FAIL Parsing: <git+https://github.com/foo/bar> against <about:blank> assert_equals: host expected "github.com" but got "" +PASS Parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +FAIL Parsing: <non-spec:/.//> against <about:blank> assert_equals: pathname expected "//" but got "/.//" +FAIL Parsing: <non-spec:/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/..//" +FAIL Parsing: <non-spec:/a/..//> against <about:blank> assert_equals: href expected "non-spec:/.//" but got "non-spec:/a/..//" +FAIL Parsing: <non-spec:/.//path> against <about:blank> assert_equals: pathname expected "//path" but got "/.//path" +FAIL Parsing: <non-spec:/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <non-spec:/a/..//path> against <about:blank> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/a/..//path" +FAIL Parsing: </.//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: </..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <a/..//path> against <non-spec:/p> assert_equals: href expected "non-spec:/.//path" but got "non-spec://path" +FAIL Parsing: <> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//p" but got "non-spec:/..//p" +FAIL Parsing: <path> against <non-spec:/..//p> assert_equals: href expected "non-spec:/.//path" but got "non-spec:/..//path" +FAIL Parsing: <../path> against <non-spec:/.//p> assert_equals: href expected "non-spec:/path" but got "non-spec:/./path" +FAIL Parsing: <non-special://%E2%80%A0/> against <about:blank> assert_equals: host expected "%E2%80%A0" but got "" +FAIL Parsing: <non-special://H%4fSt/path> against <about:blank> assert_equals: host expected "H%4fSt" but got "" +FAIL Parsing: <non-special://[1:2:0:0:5:0:0:0]/> against <about:blank> assert_equals: href expected "non-special://[1:2:0:0:5::]/" but got "non-special://[1:2:0:0:5:0:0:0]/" +FAIL Parsing: <non-special://[1:2:0:0:0:0:0:3]/> against <about:blank> assert_equals: href expected "non-special://[1:2::3]/" but got "non-special://[1:2:0:0:0:0:0:3]/" +FAIL Parsing: <non-special://[1:2::3]:80/> against <about:blank> assert_equals: host expected "[1:2::3]:80" but got "" +FAIL Parsing: <non-special://[:80/> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <blob:https://example.com:443/> against <about:blank> +PASS Parsing: <blob:d3958f5c-0777-0845-9dcf-2cb28783acaf> against <about:blank> +PASS Parsing: <http://0177.0.0.0189> against <about:blank> +PASS Parsing: <http://0x7f.0.0.0x7g> against <about:blank> +PASS Parsing: <http://0X7F.0.0.0X7G> against <about:blank> +PASS Parsing: <http://[::127.0.0.0.1]> against <about:blank> +PASS Parsing: <http://[0:1:0:1:0:1:0:1]> against <about:blank> +PASS Parsing: <http://[1:0:1:0:1:0:1:0]> against <about:blank> +PASS Parsing: <http://example.org/test?"> against <about:blank> +PASS Parsing: <http://example.org/test?#> against <about:blank> +PASS Parsing: <http://example.org/test?<> against <about:blank> +PASS Parsing: <http://example.org/test?>> against <about:blank> +PASS Parsing: <http://example.org/test?⌣> against <about:blank> +PASS Parsing: <http://example.org/test?%23%23> against <about:blank> +PASS Parsing: <http://example.org/test?%GH> against <about:blank> +PASS Parsing: <http://example.org/test?a#%EF> against <about:blank> +PASS Parsing: <http://example.org/test?a#%GH> against <about:blank> +PASS Parsing: <a> against <about:blank> +PASS Parsing: <a/> against <about:blank> +PASS Parsing: <a//> against <about:blank> +FAIL Parsing: <test-a-colon.html> against <a:> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <test-a-colon-b.html> against <a:b> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +FAIL Parsing: <test-a-colon-slash.html> against <a:/> assert_equals: href expected "a:/test-a-colon-slash.html" but got "file:///A:/test-a-colon-slash.html" +FAIL Parsing: <test-a-colon-slash-slash.html> against <a://> assert_equals: href expected "a:///test-a-colon-slash-slash.html" but got "file:///A://test-a-colon-slash-slash.html" +FAIL Parsing: <test-a-colon-slash-b.html> against <a:/b> assert_equals: href expected "a:/test-a-colon-slash-b.html" but got "file:///A:/test-a-colon-slash-b.html" +FAIL Parsing: <test-a-colon-slash-slash-b.html> against <a://b> assert_equals: href expected "a://b/test-a-colon-slash-slash-b.html" but got "file:///A://test-a-colon-slash-slash-b.html" +FAIL Parsing: <http://example.org/test?a#b\0c> against <about:blank> assert_equals: href expected "http://example.org/test?a#b%00c" but got "http://example.org/test?a#bc" +FAIL Parsing: <non-spec://example.org/test?a#b\0c> against <about:blank> assert_equals: host expected "example.org" but got "" +PASS Parsing: <non-spec:/test?a#b\0c> against <about:blank> +PASS Parsing: <10.0.0.7:8080/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a!@$*=/foo.html> against <file:///some/dir/bar.html> +PASS Parsing: <a1234567890-+.:foo/bar> against <http://example.com/dir/file> +PASS Parsing: <file://ab/p> against <about:blank> +PASS Parsing: <file://a%C2%ADb/p> against <about:blank> +PASS Parsing: <file:///p> against <about:blank> +PASS Parsing: <file://%C2%AD/p> against <about:blank> +FAIL Parsing: <file://xn--/p> against <about:blank> assert_throws_js: function "function() { + bURL(expected.input, expected.base) + }" did not throw +PASS Parsing: <#link> against <https://example.org/##link> +PASS Parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin.any-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin.any-expected.txt new file mode 100644 index 0000000..e1d5a678 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin.any-expected.txt
@@ -0,0 +1,322 @@ +This is a testharness.js-based test. +Found 309 tests; 300 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Origin parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Origin parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Origin parsing: <https://test:@test> against <about:blank> +PASS Origin parsing: <https://:@test> against <about:blank> +PASS Origin parsing: <non-special://test:@test/x> against <about:blank> +PASS Origin parsing: <non-special://:@test/x> against <about:blank> +PASS Origin parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Origin parsing: < foo.com > against <http://example.org/foo/bar> +FAIL Origin parsing: <a: foo.com> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "file://" +PASS Origin parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Origin parsing: <> against <http://example.org/foo/bar> +PASS Origin parsing: < > against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <:> against <http://example.org/foo/bar> +PASS Origin parsing: <:a> against <http://example.org/foo/bar> +PASS Origin parsing: <:/> against <http://example.org/foo/bar> +PASS Origin parsing: <:\> against <http://example.org/foo/bar> +PASS Origin parsing: <:#> against <http://example.org/foo/bar> +PASS Origin parsing: <#> against <http://example.org/foo/bar> +PASS Origin parsing: <#/> against <http://example.org/foo/bar> +PASS Origin parsing: <#\> against <http://example.org/foo/bar> +PASS Origin parsing: <#;?> against <http://example.org/foo/bar> +PASS Origin parsing: <?> against <http://example.org/foo/bar> +PASS Origin parsing: </> against <http://example.org/foo/bar> +PASS Origin parsing: <:23> against <http://example.org/foo/bar> +PASS Origin parsing: </:23> against <http://example.org/foo/bar> +PASS Origin parsing: <::> against <http://example.org/foo/bar> +PASS Origin parsing: <::23> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://> against <http://example.org/foo/bar> +PASS Origin parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Origin parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Origin parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:////://///> against <http://example.org/foo/bar> +FAIL Origin parsing: <c:/foo> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "file://" +PASS Origin parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Origin parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Origin parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Origin parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Origin parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Origin parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Origin parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Origin parsing: <#β> against <http://example.org/foo/bar> +PASS Origin parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Origin parsing: <tel:1234567890> against <http://example.org/foo/bar> +PASS Origin parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> +PASS Origin parsing: <http://example.com/././foo> against <about:blank> +PASS Origin parsing: <http://example.com/./.foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo/.> against <about:blank> +PASS Origin parsing: <http://example.com/foo/./> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Origin parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> +PASS Origin parsing: <http://example.com////../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Origin parsing: <http://example.com/foo> against <about:blank> +PASS Origin parsing: <http://example.com/%20foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo%> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2©zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%41%7a> against <about:blank> +PASS Origin parsing: <http://example.com/foo %91> against <about:blank> +FAIL Origin parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Origin parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Origin parsing: <http://example.com/foo bar> against <about:blank> +PASS Origin parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Origin parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Origin parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Origin parsing: <http://example.com/你好你好> against <about:blank> +PASS Origin parsing: <http://example.com/‥/foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo//bar> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +PASS Origin parsing: <data:test# »> against <about:blank> +PASS Origin parsing: <http://www.google.com> against <about:blank> +PASS Origin parsing: <http://192.0x00A80001> against <about:blank> +PASS Origin parsing: <http://www/foo%2Ehtml> against <about:blank> +PASS Origin parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Origin parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Origin parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Origin parsing: <http://foo:80/> against <about:blank> +PASS Origin parsing: <http://foo:81/> against <about:blank> +PASS Origin parsing: <httpa://foo:80/> against <about:blank> +PASS Origin parsing: <https://foo:443/> against <about:blank> +PASS Origin parsing: <https://foo:80/> against <about:blank> +PASS Origin parsing: <ftp://foo:21/> against <about:blank> +PASS Origin parsing: <ftp://foo:80/> against <about:blank> +PASS Origin parsing: <gopher://foo:70/> against <about:blank> +PASS Origin parsing: <gopher://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:80/> against <about:blank> +PASS Origin parsing: <ws://foo:81/> against <about:blank> +PASS Origin parsing: <ws://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:815/> against <about:blank> +PASS Origin parsing: <wss://foo:80/> against <about:blank> +PASS Origin parsing: <wss://foo:81/> against <about:blank> +PASS Origin parsing: <wss://foo:443/> against <about:blank> +PASS Origin parsing: <wss://foo:815/> against <about:blank> +PASS Origin parsing: <http:/example.com/> against <about:blank> +PASS Origin parsing: <ftp:/example.com/> against <about:blank> +PASS Origin parsing: <https:/example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Origin parsing: <ftps:/example.com/> against <about:blank> +PASS Origin parsing: <gopher:/example.com/> against <about:blank> +PASS Origin parsing: <ws:/example.com/> against <about:blank> +PASS Origin parsing: <wss:/example.com/> against <about:blank> +PASS Origin parsing: <data:/example.com/> against <about:blank> +PASS Origin parsing: <javascript:/example.com/> against <about:blank> +PASS Origin parsing: <mailto:/example.com/> against <about:blank> +PASS Origin parsing: <http:example.com/> against <about:blank> +PASS Origin parsing: <ftp:example.com/> against <about:blank> +PASS Origin parsing: <https:example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:example.com/> against <about:blank> +PASS Origin parsing: <ftps:example.com/> against <about:blank> +PASS Origin parsing: <gopher:example.com/> against <about:blank> +PASS Origin parsing: <ws:example.com/> against <about:blank> +PASS Origin parsing: <wss:example.com/> against <about:blank> +PASS Origin parsing: <data:example.com/> against <about:blank> +PASS Origin parsing: <javascript:example.com/> against <about:blank> +PASS Origin parsing: <mailto:example.com/> against <about:blank> +PASS Origin parsing: <http:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/@www.example.com> against <about:blank> +PASS Origin parsing: <http://@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://@pple.com> against <about:blank> +PASS Origin parsing: <http::b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://www.@pple.com> against <about:blank> +PASS Origin parsing: <http://:@www.example.com> against <about:blank> +PASS Origin parsing: </> against <http://www.example.com/test> +PASS Origin parsing: </test.txt> against <http://www.example.com/test> +PASS Origin parsing: <.> against <http://www.example.com/test> +PASS Origin parsing: <..> against <http://www.example.com/test> +PASS Origin parsing: <test.txt> against <http://www.example.com/test> +PASS Origin parsing: <./test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <中/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <http://ExAmPlE.CoM> against <http://other.com/> +PASS Origin parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Origin parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Origin parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Origin parsing: <https://x/�?�#�> against <about:blank> +PASS Origin parsing: <http://Go.com> against <http://other.com/> +PASS Origin parsing: <http://你好你好> against <http://other.com/> +FAIL Origin parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: origin expected "https://xn--fa-hia.example" but got "https://fass.example" +PASS Origin parsing: <sc://faß.ExAmPlE/> against <about:blank> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Origin parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Origin parsing: <http://./> against <about:blank> +PASS Origin parsing: <http://../> against <about:blank> +PASS Origin parsing: <http://0..0x300/> against <about:blank> +PASS Origin parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Origin parsing: <#> against <test:test> +PASS Origin parsing: <#x> against <mailto:x@x.com> +PASS Origin parsing: <#x> against <data:,> +PASS Origin parsing: <#x> against <about:blank> +PASS Origin parsing: <#> against <test:test?test> +PASS Origin parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Origin parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Origin parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Origin parsing: <http://host/?'> against <about:blank> +PASS Origin parsing: <notspecial://host/?'> against <about:blank> +PASS Origin parsing: </some/path> against <http://user@example.org/smth> +PASS Origin parsing: <> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: <i> against <sc:/pa/pa> +PASS Origin parsing: <i> against <sc://ho/pa> +PASS Origin parsing: <i> against <sc:///pa/pa> +PASS Origin parsing: <../i> against <sc:/pa/pa> +PASS Origin parsing: <../i> against <sc://ho/pa> +PASS Origin parsing: <../i> against <sc:///pa/pa> +PASS Origin parsing: </i> against <sc:/pa/pa> +PASS Origin parsing: </i> against <sc://ho/pa> +PASS Origin parsing: </i> against <sc:///pa/pa> +PASS Origin parsing: <?i> against <sc:/pa/pa> +PASS Origin parsing: <?i> against <sc://ho/pa> +PASS Origin parsing: <?i> against <sc:///pa/pa> +PASS Origin parsing: <#i> against <sc:sd> +PASS Origin parsing: <#i> against <sc:sd/sd> +PASS Origin parsing: <#i> against <sc:/pa/pa> +PASS Origin parsing: <#i> against <sc://ho/pa> +PASS Origin parsing: <#i> against <sc:///pa/pa> +PASS Origin parsing: <about:/../> against <about:blank> +PASS Origin parsing: <data:/../> against <about:blank> +PASS Origin parsing: <javascript:/../> against <about:blank> +PASS Origin parsing: <mailto:/../> against <about:blank> +PASS Origin parsing: <sc://ñ.test/> against <about:blank> +FAIL Origin parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc:\../> against <about:blank> +PASS Origin parsing: <sc::a@example.net> against <about:blank> +PASS Origin parsing: <wow:%NBD> against <about:blank> +PASS Origin parsing: <wow:%1G> against <about:blank> +PASS Origin parsing: <wow:> against <about:blank> +FAIL Origin parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> +PASS Origin parsing: <ftp://%e2%98%83> against <about:blank> +PASS Origin parsing: <https://%e2%98%83> against <about:blank> +PASS Origin parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Origin parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Origin parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Origin parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Origin parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <http:> against <http://example.org/foo/bar> +PASS Origin parsing: <sc:> against <https://example.org/foo/bar> +PASS Origin parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Origin parsing: <http://192.168.257> against <http://other.com/> +PASS Origin parsing: <http://192.168.257.com> against <http://other.com/> +PASS Origin parsing: <http://256> against <http://other.com/> +PASS Origin parsing: <http://256.com> against <http://other.com/> +PASS Origin parsing: <http://999999999> against <http://other.com/> +PASS Origin parsing: <http://999999999.com> against <http://other.com/> +PASS Origin parsing: <http://10000000000.com> against <http://other.com/> +PASS Origin parsing: <http://4294967295> against <http://other.com/> +PASS Origin parsing: <http://0xffffffff> against <http://other.com/> +PASS Origin parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Origin parsing: <https://0x.0x.0> against <about:blank> +PASS Origin parsing: <http://[1:0::]> against <http://example.net/> +PASS Origin parsing: <sc://ñ> against <about:blank> +PASS Origin parsing: <sc://ñ?x> against <about:blank> +PASS Origin parsing: <sc://ñ#x> against <about:blank> +FAIL Origin parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> +PASS Origin parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> +PASS Origin parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> +PASS Origin parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> +PASS Origin parsing: <rsync://foo@host:911/sup> against <about:blank> +PASS Origin parsing: <git://github.com/foo/bar.git> against <about:blank> +PASS Origin parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> +PASS Origin parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> +PASS Origin parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> +PASS Origin parsing: <git+https://github.com/foo/bar> against <about:blank> +PASS Origin parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Origin parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +PASS Origin parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Origin parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Origin parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin.any.worker-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin.any.worker-expected.txt new file mode 100644 index 0000000..e1d5a678 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin.any.worker-expected.txt
@@ -0,0 +1,322 @@ +This is a testharness.js-based test. +Found 309 tests; 300 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Loading data… +PASS Origin parsing: <http://example . +org> against <http://example.org/foo/bar> +PASS Origin parsing: <http://user:pass@foo:21/bar;par?b#c> against <http://example.org/foo/bar> +PASS Origin parsing: <https://test:@test> against <about:blank> +PASS Origin parsing: <https://:@test> against <about:blank> +PASS Origin parsing: <non-special://test:@test/x> against <about:blank> +PASS Origin parsing: <non-special://:@test/x> against <about:blank> +PASS Origin parsing: <http:foo.com> against <http://example.org/foo/bar> +PASS Origin parsing: < :foo.com +> against <http://example.org/foo/bar> +PASS Origin parsing: < foo.com > against <http://example.org/foo/bar> +FAIL Origin parsing: <a: foo.com> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "file://" +PASS Origin parsing: <http://f:21/ b ? d # e > against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:0/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f:00000000000000000000080/c> against <http://example.org/foo/bar> +PASS Origin parsing: <http://f: +/c> against <http://example.org/foo/bar> +PASS Origin parsing: <> against <http://example.org/foo/bar> +PASS Origin parsing: < > against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <:foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <:> against <http://example.org/foo/bar> +PASS Origin parsing: <:a> against <http://example.org/foo/bar> +PASS Origin parsing: <:/> against <http://example.org/foo/bar> +PASS Origin parsing: <:\> against <http://example.org/foo/bar> +PASS Origin parsing: <:#> against <http://example.org/foo/bar> +PASS Origin parsing: <#> against <http://example.org/foo/bar> +PASS Origin parsing: <#/> against <http://example.org/foo/bar> +PASS Origin parsing: <#\> against <http://example.org/foo/bar> +PASS Origin parsing: <#;?> against <http://example.org/foo/bar> +PASS Origin parsing: <?> against <http://example.org/foo/bar> +PASS Origin parsing: </> against <http://example.org/foo/bar> +PASS Origin parsing: <:23> against <http://example.org/foo/bar> +PASS Origin parsing: </:23> against <http://example.org/foo/bar> +PASS Origin parsing: <::> against <http://example.org/foo/bar> +PASS Origin parsing: <::23> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://> against <http://example.org/foo/bar> +PASS Origin parsing: <http://a:b@c:29/d> against <http://example.org/foo/bar> +PASS Origin parsing: <http::@c:29> against <http://example.org/foo/bar> +PASS Origin parsing: <http://&a:foo(b]c@d:2/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://::@c@d:2> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com:b@d/> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo.com/\@> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <http:\\a\b:c\d@foo.com\> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:/bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////> against <http://example.org/foo/bar> +PASS Origin parsing: <foo://///////bar.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <foo:////://///> against <http://example.org/foo/bar> +FAIL Origin parsing: <c:/foo> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "file://" +PASS Origin parsing: <//foo/bar> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/path;a??e#f#g> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd?efgh?ijkl> against <http://example.org/foo/bar> +PASS Origin parsing: <http://foo/abcd#foo?bar> against <http://example.org/foo/bar> +PASS Origin parsing: <[61:24:74]:98> against <http://example.org/foo/bar> +PASS Origin parsing: <http:[61:27]/:foo> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[::127.0.0.1]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[0:0:0:0:0:0:13.1.68.3]> against <http://example.org/foo/bar> +PASS Origin parsing: <http://[2001::1]:80> against <http://example.org/foo/bar> +PASS Origin parsing: <http:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:/example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <http:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftp:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <javascript:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: <mailto:example.com/> against <http://example.org/foo/bar> +PASS Origin parsing: </a/b/c> against <http://example.org/foo/bar> +PASS Origin parsing: </a/ /c> against <http://example.org/foo/bar> +PASS Origin parsing: </a%2fc> against <http://example.org/foo/bar> +PASS Origin parsing: </a/%2f/c> against <http://example.org/foo/bar> +PASS Origin parsing: <#β> against <http://example.org/foo/bar> +PASS Origin parsing: <data:text/html,test#test> against <http://example.org/foo/bar> +PASS Origin parsing: <tel:1234567890> against <http://example.org/foo/bar> +PASS Origin parsing: <ssh://example.com/foo/bar.git> against <http://example.org/> +PASS Origin parsing: <http://example.com/././foo> against <about:blank> +PASS Origin parsing: <http://example.com/./.foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo/.> against <about:blank> +PASS Origin parsing: <http://example.com/foo/./> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../> against <about:blank> +PASS Origin parsing: <http://example.com/foo/..bar> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/../../../ton> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> +PASS Origin parsing: <http://example.com////../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//../..> against <about:blank> +PASS Origin parsing: <http://example.com/foo/bar//..> against <about:blank> +PASS Origin parsing: <http://example.com/foo> against <about:blank> +PASS Origin parsing: <http://example.com/%20foo> against <about:blank> +PASS Origin parsing: <http://example.com/foo%> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%2©zbar> against <about:blank> +PASS Origin parsing: <http://example.com/foo%41%7a> against <about:blank> +PASS Origin parsing: <http://example.com/foo %91> against <about:blank> +FAIL Origin parsing: <http://example.com/foo%00%51> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <http://example.com/(%28:%3A%29)> against <about:blank> +PASS Origin parsing: <http://example.com/%3A%3a%3C%3c> against <about:blank> +PASS Origin parsing: <http://example.com/foo bar> against <about:blank> +PASS Origin parsing: <http://example.com\\foo\\bar> against <about:blank> +PASS Origin parsing: <http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd> against <about:blank> +PASS Origin parsing: <http://example.com/@asdf%40> against <about:blank> +PASS Origin parsing: <http://example.com/你好你好> against <about:blank> +PASS Origin parsing: <http://example.com/‥/foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo> against <about:blank> +PASS Origin parsing: <http://example.com//foo//bar> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz#> against <about:blank> +PASS Origin parsing: <http://www.google.com/foo?bar=baz# »> against <about:blank> +PASS Origin parsing: <data:test# »> against <about:blank> +PASS Origin parsing: <http://www.google.com> against <about:blank> +PASS Origin parsing: <http://192.0x00A80001> against <about:blank> +PASS Origin parsing: <http://www/foo%2Ehtml> against <about:blank> +PASS Origin parsing: <http://www/foo/%2E/html> against <about:blank> +PASS Origin parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> +PASS Origin parsing: <http:\\www.google.com\foo> against <about:blank> +PASS Origin parsing: <http://foo:80/> against <about:blank> +PASS Origin parsing: <http://foo:81/> against <about:blank> +PASS Origin parsing: <httpa://foo:80/> against <about:blank> +PASS Origin parsing: <https://foo:443/> against <about:blank> +PASS Origin parsing: <https://foo:80/> against <about:blank> +PASS Origin parsing: <ftp://foo:21/> against <about:blank> +PASS Origin parsing: <ftp://foo:80/> against <about:blank> +PASS Origin parsing: <gopher://foo:70/> against <about:blank> +PASS Origin parsing: <gopher://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:80/> against <about:blank> +PASS Origin parsing: <ws://foo:81/> against <about:blank> +PASS Origin parsing: <ws://foo:443/> against <about:blank> +PASS Origin parsing: <ws://foo:815/> against <about:blank> +PASS Origin parsing: <wss://foo:80/> against <about:blank> +PASS Origin parsing: <wss://foo:81/> against <about:blank> +PASS Origin parsing: <wss://foo:443/> against <about:blank> +PASS Origin parsing: <wss://foo:815/> against <about:blank> +PASS Origin parsing: <http:/example.com/> against <about:blank> +PASS Origin parsing: <ftp:/example.com/> against <about:blank> +PASS Origin parsing: <https:/example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank> +PASS Origin parsing: <ftps:/example.com/> against <about:blank> +PASS Origin parsing: <gopher:/example.com/> against <about:blank> +PASS Origin parsing: <ws:/example.com/> against <about:blank> +PASS Origin parsing: <wss:/example.com/> against <about:blank> +PASS Origin parsing: <data:/example.com/> against <about:blank> +PASS Origin parsing: <javascript:/example.com/> against <about:blank> +PASS Origin parsing: <mailto:/example.com/> against <about:blank> +PASS Origin parsing: <http:example.com/> against <about:blank> +PASS Origin parsing: <ftp:example.com/> against <about:blank> +PASS Origin parsing: <https:example.com/> against <about:blank> +PASS Origin parsing: <madeupscheme:example.com/> against <about:blank> +PASS Origin parsing: <ftps:example.com/> against <about:blank> +PASS Origin parsing: <gopher:example.com/> against <about:blank> +PASS Origin parsing: <ws:example.com/> against <about:blank> +PASS Origin parsing: <wss:example.com/> against <about:blank> +PASS Origin parsing: <data:example.com/> against <about:blank> +PASS Origin parsing: <javascript:example.com/> against <about:blank> +PASS Origin parsing: <mailto:example.com/> against <about:blank> +PASS Origin parsing: <http:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/@www.example.com> against <about:blank> +PASS Origin parsing: <http://@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://@pple.com> against <about:blank> +PASS Origin parsing: <http::b@www.example.com> against <about:blank> +PASS Origin parsing: <http:/:b@www.example.com> against <about:blank> +PASS Origin parsing: <http://:b@www.example.com> against <about:blank> +PASS Origin parsing: <http:a:@www.example.com> against <about:blank> +PASS Origin parsing: <http:/a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://a:@www.example.com> against <about:blank> +PASS Origin parsing: <http://www.@pple.com> against <about:blank> +PASS Origin parsing: <http://:@www.example.com> against <about:blank> +PASS Origin parsing: </> against <http://www.example.com/test> +PASS Origin parsing: </test.txt> against <http://www.example.com/test> +PASS Origin parsing: <.> against <http://www.example.com/test> +PASS Origin parsing: <..> against <http://www.example.com/test> +PASS Origin parsing: <test.txt> against <http://www.example.com/test> +PASS Origin parsing: <./test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../aaa/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <../../test.txt> against <http://www.example.com/test> +PASS Origin parsing: <中/test.txt> against <http://www.example.com/test> +PASS Origin parsing: <http://www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <//www.example2.com> against <http://www.example.com/test> +PASS Origin parsing: <http://ExAmPlE.CoM> against <http://other.com/> +PASS Origin parsing: <http://GOOgoo.com> against <http://other.com/> +PASS Origin parsing: <\0 http://example.com/ \r > against <about:blank> +PASS Origin parsing: <http://www.foo。bar.com> against <http://other.com/> +PASS Origin parsing: <https://x/�?�#�> against <about:blank> +PASS Origin parsing: <http://Go.com> against <http://other.com/> +PASS Origin parsing: <http://你好你好> against <http://other.com/> +FAIL Origin parsing: <https://faß.ExAmPlE/> against <about:blank> assert_equals: origin expected "https://xn--fa-hia.example" but got "https://fass.example" +PASS Origin parsing: <sc://faß.ExAmPlE/> against <about:blank> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01> against <http://other.com/> +PASS Origin parsing: <http://%30%78%63%30%2e%30%32%35%30.01%2e> against <http://other.com/> +PASS Origin parsing: <http://0Xc0.0250.01> against <http://other.com/> +PASS Origin parsing: <http://./> against <about:blank> +PASS Origin parsing: <http://../> against <about:blank> +PASS Origin parsing: <http://0..0x300/> against <about:blank> +PASS Origin parsing: <http://foo:💩@example.com/bar> against <http://other.com/> +PASS Origin parsing: <#> against <test:test> +PASS Origin parsing: <#x> against <mailto:x@x.com> +PASS Origin parsing: <#x> against <data:,> +PASS Origin parsing: <#x> against <about:blank> +PASS Origin parsing: <#> against <test:test?test> +PASS Origin parsing: <https://@test@test@example:800/> against <http://doesnotmatter/> +PASS Origin parsing: <https://@@@example> against <http://doesnotmatter/> +PASS Origin parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/> +PASS Origin parsing: <http://host/?'> against <about:blank> +PASS Origin parsing: <notspecial://host/?'> against <about:blank> +PASS Origin parsing: </some/path> against <http://user@example.org/smth> +PASS Origin parsing: <> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: </some/path> against <http://user:pass@example.org:21/smth> +PASS Origin parsing: <i> against <sc:/pa/pa> +PASS Origin parsing: <i> against <sc://ho/pa> +PASS Origin parsing: <i> against <sc:///pa/pa> +PASS Origin parsing: <../i> against <sc:/pa/pa> +PASS Origin parsing: <../i> against <sc://ho/pa> +PASS Origin parsing: <../i> against <sc:///pa/pa> +PASS Origin parsing: </i> against <sc:/pa/pa> +PASS Origin parsing: </i> against <sc://ho/pa> +PASS Origin parsing: </i> against <sc:///pa/pa> +PASS Origin parsing: <?i> against <sc:/pa/pa> +PASS Origin parsing: <?i> against <sc://ho/pa> +PASS Origin parsing: <?i> against <sc:///pa/pa> +PASS Origin parsing: <#i> against <sc:sd> +PASS Origin parsing: <#i> against <sc:sd/sd> +PASS Origin parsing: <#i> against <sc:/pa/pa> +PASS Origin parsing: <#i> against <sc://ho/pa> +PASS Origin parsing: <#i> against <sc:///pa/pa> +PASS Origin parsing: <about:/../> against <about:blank> +PASS Origin parsing: <data:/../> against <about:blank> +PASS Origin parsing: <javascript:/../> against <about:blank> +PASS Origin parsing: <mailto:/../> against <about:blank> +PASS Origin parsing: <sc://ñ.test/> against <about:blank> +FAIL Origin parsing: <x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc:\../> against <about:blank> +PASS Origin parsing: <sc::a@example.net> against <about:blank> +PASS Origin parsing: <wow:%NBD> against <about:blank> +PASS Origin parsing: <wow:%1G> against <about:blank> +PASS Origin parsing: <wow:> against <about:blank> +FAIL Origin parsing: <http://example.com/U+d800U+dfff﷏ﷰ?U+d800U+dfff﷏ﷰ> against <about:blank> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <http://!"$&'()*+,-.;=_`{|}~/> against <about:blank> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <sc://!"$&'()*+,-.;=_`{|}~/> against <about:blank> +PASS Origin parsing: <ftp://%e2%98%83> against <about:blank> +PASS Origin parsing: <https://%e2%98%83> against <about:blank> +PASS Origin parsing: <http://127.0.0.1:10100/relative_import.html> against <about:blank> +PASS Origin parsing: <http://facebook.com/?foo=%7B%22abc%22> against <about:blank> +PASS Origin parsing: <https://localhost:3000/jqueryui@1.2.3> against <about:blank> +PASS Origin parsing: <h t +t\rp://h o +s\rt:9 0 +0\r0/p a +t\rh?q u +e\rry#f r +a\rg> against <about:blank> +PASS Origin parsing: <?a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <??a=b&c=d> against <http://example.org/foo/bar> +PASS Origin parsing: <http:> against <http://example.org/foo/bar> +PASS Origin parsing: <sc:> against <https://example.org/foo/bar> +PASS Origin parsing: <http://foo.bar/baz?qux#foobar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo"bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo<bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo>bar> against <about:blank> +PASS Origin parsing: <http://foo.bar/baz?qux#foo`bar> against <about:blank> +PASS Origin parsing: <http://192.168.257> against <http://other.com/> +PASS Origin parsing: <http://192.168.257.com> against <http://other.com/> +PASS Origin parsing: <http://256> against <http://other.com/> +PASS Origin parsing: <http://256.com> against <http://other.com/> +PASS Origin parsing: <http://999999999> against <http://other.com/> +PASS Origin parsing: <http://999999999.com> against <http://other.com/> +PASS Origin parsing: <http://10000000000.com> against <http://other.com/> +PASS Origin parsing: <http://4294967295> against <http://other.com/> +PASS Origin parsing: <http://0xffffffff> against <http://other.com/> +PASS Origin parsing: <http://256.256.256.256.256> against <http://other.com/> +PASS Origin parsing: <https://0x.0x.0> against <about:blank> +PASS Origin parsing: <http://[1:0::]> against <http://example.net/> +PASS Origin parsing: <sc://ñ> against <about:blank> +PASS Origin parsing: <sc://ñ?x> against <about:blank> +PASS Origin parsing: <sc://ñ#x> against <about:blank> +FAIL Origin parsing: <#x> against <sc://ñ> Failed to construct 'URL': Invalid URL +FAIL Origin parsing: <?x> against <sc://ñ> Failed to construct 'URL': Invalid URL +PASS Origin parsing: <tftp://foobar.com/someconfig;mode=netascii> against <about:blank> +PASS Origin parsing: <telnet://user:pass@foobar.com:23/> against <about:blank> +PASS Origin parsing: <ut2004://10.10.10.10:7777/Index.ut2> against <about:blank> +PASS Origin parsing: <redis://foo:bar@somehost:6379/0?baz=bam&qux=baz> against <about:blank> +PASS Origin parsing: <rsync://foo@host:911/sup> against <about:blank> +PASS Origin parsing: <git://github.com/foo/bar.git> against <about:blank> +PASS Origin parsing: <irc://myserver.com:6999/channel?passwd> against <about:blank> +PASS Origin parsing: <dns://fw.example.org:9999/foo.bar.org?type=TXT> against <about:blank> +PASS Origin parsing: <ldap://localhost:389/ou=People,o=JNDITutorial> against <about:blank> +PASS Origin parsing: <git+https://github.com/foo/bar> against <about:blank> +PASS Origin parsing: <urn:ietf:rfc:2648> against <about:blank> +PASS Origin parsing: <tag:joe@example.org,2001:foo/bar> against <about:blank> +PASS Origin parsing: <non-special:cannot-be-a-base-url-\0~> against <about:blank> +PASS Origin parsing: <https://www.example.com/path{path.html?query'=query#fragment<fragment> against <about:blank> +PASS Origin parsing: <https://user:pass[@foo/bar> against <http://example.org> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..1f4f9799 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..d7c0604 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..5f3df3e --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png deleted file mode 100644 index 761616a..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/layout_ng_block_frag/fast/multicol/multicol-with-child-renderLayer-for-input-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png b/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png index 35fdd92..487a936 100644 --- a/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces-with-rotation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..1f4f9799 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..d7c0604 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..5f3df3e --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png b/third_party/blink/web_tests/platform/win7/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png new file mode 100644 index 0000000..1f4f9799 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/use-common-select-popup/fast/forms/color-scheme/select/select-disabled-multiple-hover-focused-unselected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt index d7c52ed2..0b96c8de 100644 --- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -35,8 +35,6 @@ PASS window.cached_navigator.webdriver is false PASS window.cached_navigator_connection.onchange is null PASS window.cached_navigator_connection.saveData is false -PASS window.cached_navigator_hid.onconnect is null -PASS window.cached_navigator_hid.ondisconnect is null PASS window.cached_navigator_mediaDevices.ondevicechange is null PASS window.cached_navigator_mediaSession.metadata is null PASS window.cached_navigator_mediaSession.playbackState is 'none'
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt index 463e454..b17bd1f5 100644 --- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -35,8 +35,6 @@ PASS window.cached_navigator.webdriver is false PASS window.cached_navigator_connection.onchange is null PASS window.cached_navigator_connection.saveData is false -PASS window.cached_navigator_hid.onconnect is null -PASS window.cached_navigator_hid.ondisconnect is null PASS window.cached_navigator_mediaDevices.ondevicechange is null PASS window.cached_navigator_mediaSession.metadata is null PASS window.cached_navigator_mediaSession.playbackState is 'none'
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt index 350b91e..3530916 100644 --- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -35,8 +35,6 @@ PASS window.cached_navigator.webdriver is false PASS window.cached_navigator_connection.onchange is null PASS window.cached_navigator_connection.saveData is false -PASS window.cached_navigator_hid.onconnect is null -PASS window.cached_navigator_hid.ondisconnect is null PASS window.cached_navigator_mediaDevices.ondevicechange is null PASS window.cached_navigator_mediaSession.metadata is null PASS window.cached_navigator_mediaSession.playbackState is 'none'
diff --git a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt index e8c74642..d62632e5 100644 --- a/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -35,8 +35,6 @@ PASS oldChildWindow.navigator.deviceMemory is newChildWindow.navigator.deviceMemory PASS oldChildWindow.navigator.doNotTrack is newChildWindow.navigator.doNotTrack PASS oldChildWindow.navigator.hardwareConcurrency is newChildWindow.navigator.hardwareConcurrency -PASS oldChildWindow.navigator.hid.onconnect is newChildWindow.navigator.hid.onconnect -PASS oldChildWindow.navigator.hid.ondisconnect is newChildWindow.navigator.hid.ondisconnect PASS oldChildWindow.navigator.language is newChildWindow.navigator.language PASS oldChildWindow.navigator.maxTouchPoints is newChildWindow.navigator.maxTouchPoints PASS oldChildWindow.navigator.mediaDevices.ondevicechange is newChildWindow.navigator.mediaDevices.ondevicechange
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt index c0da977..4c4046d1 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/feature-policy-features-expected.txt
@@ -27,7 +27,6 @@ fullscreen geolocation gyroscope -hid magnetometer microphone midi
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt index 31af8656..75d90f4 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -2183,40 +2183,6 @@ getter y getter z method constructor -interface HID : EventTarget - attribute @@toStringTag - getter onconnect - getter ondisconnect - method constructor - method getDevices - method requestDevice - setter onconnect - setter ondisconnect -interface HIDConnectionEvent : Event - attribute @@toStringTag - getter device - method constructor -interface HIDDevice : EventTarget - attribute @@toStringTag - getter collections - getter oninputreport - getter opened - getter productId - getter productName - getter vendorId - method close - method constructor - method open - method receiveFeatureReport - method sendFeatureReport - method sendReport - setter oninputreport -interface HIDInputReportEvent : Event - attribute @@toStringTag - getter data - getter device - getter reportId - method constructor interface HTMLAllCollection attribute @@toStringTag getter length @@ -4581,7 +4547,6 @@ getter doNotTrack getter geolocation getter hardwareConcurrency - getter hid getter keyboard getter language getter languages
diff --git a/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/README.md b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/README.md new file mode 100644 index 0000000..91dba719 --- /dev/null +++ b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/README.md
@@ -0,0 +1 @@ +# This suite runs tests with --enable-features=WebAppWindowControlsOverlay \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/README.txt b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/README.txt new file mode 100644 index 0000000..ecd0a50 --- /dev/null +++ b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/README.txt
@@ -0,0 +1,6 @@ +# This suite runs tests with --enable-features=WebAppWindowControlsOverlay + +We added a empty expected file so that when the virtual test suite runs, it'll use this empty expected +file for the test run instead of the normal expected test file here: + +third_party/blink/web_tests/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt \ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt new file mode 100644 index 0000000..40dfc17 --- /dev/null +++ b/third_party/blink/web_tests/virtual/web-app-window-controls-overlay/external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-window-controls-overlay-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +PASS the windowControlsOverlay object should exist on the navigator object +PASS visible should be a member of the windowControlsOverlay object +PASS visible should be false +PASS getBoundingClientRect should be a method of the windowControlsOverlay object +PASS getBoundingClientRect return type should be DOMRect +PASS getBoundingClientRect should return a empty DOMRect +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt b/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt index 7339289..483bec2 100644 --- a/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt +++ b/third_party/blink/web_tests/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCRtpTransceiver-stop-expected.txt
@@ -1,5 +1,6 @@ This is a testharness.js-based test. FAIL A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." +FAIL A transceiver added and stopped should not crash when getting receiver's transport promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." FAIL During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." FAIL A stopped sendonly transceiver should generate an inactive m-section in the offer promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'." FAIL A stopped inactive transceiver should generate an inactive m-section in the offer promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'."
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/README.md b/third_party/blink/web_tests/wpt_internal/origin-isolation/README.md deleted file mode 100644 index 5b54cceda..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/README.md +++ /dev/null
@@ -1,15 +0,0 @@ -# Origin Isolation Origin Trial Tests - -These tests are for the [Origin Isolation][1] feature, and supplement those in -`external/wpt` to specifically test Chromium origin trial mechanisms. - -The abbreviation `oiot` means "first the `Origin-Trial` header, then the -`Origin-Isolation` header". Conversely, `otoi` means "first the -`Origin-Isolation` header, then the `Origin-Trial` header. - -The tokens for the `Origin-Trial` header are generated using the commands - - python tools/origin_trials/generate_token.py https://web-platform.test:8444 OriginIsolationHeader --expire-timestamp=2000000000 - python tools/origin_trials/generate_token.py https://www.web-platform.test:8444 OriginIsolationHeader --expire-timestamp=2000000000 - -[1]: https://github.com/WICG/origin-isolation
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-oiot.sub.https.html b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-oiot.sub.https.html deleted file mode 100644 index 2a288c7..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-oiot.sub.https.html +++ /dev/null
@@ -1,37 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Origin-Trial header before Origin-Isolation header in parent; OT after OI in child</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<!-- This file is a modification of parent-yes-child-yes-subdomain.sub.https.html from the external WPT suite. --> - -<div id="log"></div> - -<script type="module"> -import { sendWasmModule, setBothDocumentDomains } from "/origin-isolation/resources/helpers.mjs"; -import { insertIframe } from "./resources/helpers.mjs"; - -let frameWindow; -promise_setup(async () => { - frameWindow = await insertIframe("{{hosts[][www]}}", "oiot"); -}); - -// Both request isolation, so the parent ends up in one origin-keyed agent -// cluster (the base domain's origin), and the child ends up in a different -// origin-keyed agent cluster (the www subdomain's origin). - -promise_test(async () => { - const whatHappened = await sendWasmModule(frameWindow); - - assert_equals(whatHappened, "messageerror"); -}, "messageerror event must occur"); - -promise_test(async () => { - await setBothDocumentDomains(frameWindow); - - assert_throws_dom("SecurityError", DOMException, () => { - frameWindow.document; - }); -}, "setting document.domain must not give sync access"); -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-oiot.sub.https.html.headers b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-oiot.sub.https.html.headers deleted file mode 100644 index 6265aa69..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-oiot.sub.https.html.headers +++ /dev/null
@@ -1,2 +0,0 @@ -Origin-Agent-Cluster: ?1 -Origin-Trial: AkwBfk9Djiu2sKAuVhMLUQ3ldCM8nF0QD6eQpx7wWSnmhMs7udZelhv2iJfIjYuj5j77L3htLCv/dAuv/ttfUQEAAABmeyJvcmlnaW4iOiAiaHR0cHM6Ly93ZWItcGxhdGZvcm0udGVzdDo4NDQ0IiwgImZlYXR1cmUiOiAiT3JpZ2luSXNvbGF0aW9uSGVhZGVyIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-otoi.sub.https.html b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-otoi.sub.https.html deleted file mode 100644 index a691dc8..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-otoi.sub.https.html +++ /dev/null
@@ -1,37 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Origin-Trial header before Origin-Isolation header in parent; OT after OI in child</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<!-- This file is a modification of parent-yes-child-yes-subdomain.sub.https.html from the external WPT suite. --> - -<div id="log"></div> - -<script type="module"> -import { sendWasmModule, setBothDocumentDomains } from "/origin-isolation/resources/helpers.mjs"; -import { insertIframe } from "./resources/helpers.mjs"; - -let frameWindow; -promise_setup(async () => { - frameWindow = await insertIframe("{{hosts[][www]}}", "otoi"); -}); - -// Both request isolation, so the parent ends up in one origin-keyed agent -// cluster (the base domain's origin), and the child ends up in a different -// origin-keyed agent cluster (the www subdomain's origin). - -promise_test(async () => { - const whatHappened = await sendWasmModule(frameWindow); - - assert_equals(whatHappened, "messageerror"); -}, "messageerror event must occur"); - -promise_test(async () => { - await setBothDocumentDomains(frameWindow); - - assert_throws_dom("SecurityError", DOMException, () => { - frameWindow.document; - }); -}, "setting document.domain must not give sync access"); -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-otoi.sub.https.html.headers b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-otoi.sub.https.html.headers deleted file mode 100644 index 6265aa69..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-oiot-child-otoi.sub.https.html.headers +++ /dev/null
@@ -1,2 +0,0 @@ -Origin-Agent-Cluster: ?1 -Origin-Trial: AkwBfk9Djiu2sKAuVhMLUQ3ldCM8nF0QD6eQpx7wWSnmhMs7udZelhv2iJfIjYuj5j77L3htLCv/dAuv/ttfUQEAAABmeyJvcmlnaW4iOiAiaHR0cHM6Ly93ZWItcGxhdGZvcm0udGVzdDo4NDQ0IiwgImZlYXR1cmUiOiAiT3JpZ2luSXNvbGF0aW9uSGVhZGVyIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-oiot.sub.https.html b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-oiot.sub.https.html deleted file mode 100644 index 2a288c7..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-oiot.sub.https.html +++ /dev/null
@@ -1,37 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Origin-Trial header before Origin-Isolation header in parent; OT after OI in child</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<!-- This file is a modification of parent-yes-child-yes-subdomain.sub.https.html from the external WPT suite. --> - -<div id="log"></div> - -<script type="module"> -import { sendWasmModule, setBothDocumentDomains } from "/origin-isolation/resources/helpers.mjs"; -import { insertIframe } from "./resources/helpers.mjs"; - -let frameWindow; -promise_setup(async () => { - frameWindow = await insertIframe("{{hosts[][www]}}", "oiot"); -}); - -// Both request isolation, so the parent ends up in one origin-keyed agent -// cluster (the base domain's origin), and the child ends up in a different -// origin-keyed agent cluster (the www subdomain's origin). - -promise_test(async () => { - const whatHappened = await sendWasmModule(frameWindow); - - assert_equals(whatHappened, "messageerror"); -}, "messageerror event must occur"); - -promise_test(async () => { - await setBothDocumentDomains(frameWindow); - - assert_throws_dom("SecurityError", DOMException, () => { - frameWindow.document; - }); -}, "setting document.domain must not give sync access"); -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-oiot.sub.https.html.headers b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-oiot.sub.https.html.headers deleted file mode 100644 index 468d0f2..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-oiot.sub.https.html.headers +++ /dev/null
@@ -1,2 +0,0 @@ -Origin-Trial: AkwBfk9Djiu2sKAuVhMLUQ3ldCM8nF0QD6eQpx7wWSnmhMs7udZelhv2iJfIjYuj5j77L3htLCv/dAuv/ttfUQEAAABmeyJvcmlnaW4iOiAiaHR0cHM6Ly93ZWItcGxhdGZvcm0udGVzdDo4NDQ0IiwgImZlYXR1cmUiOiAiT3JpZ2luSXNvbGF0aW9uSGVhZGVyIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9 -Origin-Agent-Cluster: ?1
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-otoi.sub.https.html b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-otoi.sub.https.html deleted file mode 100644 index a691dc8..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-otoi.sub.https.html +++ /dev/null
@@ -1,37 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<title>Origin-Trial header before Origin-Isolation header in parent; OT after OI in child</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<!-- This file is a modification of parent-yes-child-yes-subdomain.sub.https.html from the external WPT suite. --> - -<div id="log"></div> - -<script type="module"> -import { sendWasmModule, setBothDocumentDomains } from "/origin-isolation/resources/helpers.mjs"; -import { insertIframe } from "./resources/helpers.mjs"; - -let frameWindow; -promise_setup(async () => { - frameWindow = await insertIframe("{{hosts[][www]}}", "otoi"); -}); - -// Both request isolation, so the parent ends up in one origin-keyed agent -// cluster (the base domain's origin), and the child ends up in a different -// origin-keyed agent cluster (the www subdomain's origin). - -promise_test(async () => { - const whatHappened = await sendWasmModule(frameWindow); - - assert_equals(whatHappened, "messageerror"); -}, "messageerror event must occur"); - -promise_test(async () => { - await setBothDocumentDomains(frameWindow); - - assert_throws_dom("SecurityError", DOMException, () => { - frameWindow.document; - }); -}, "setting document.domain must not give sync access"); -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-otoi.sub.https.html.headers b/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-otoi.sub.https.html.headers deleted file mode 100644 index 468d0f2..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/parent-otoi-child-otoi.sub.https.html.headers +++ /dev/null
@@ -1,2 +0,0 @@ -Origin-Trial: AkwBfk9Djiu2sKAuVhMLUQ3ldCM8nF0QD6eQpx7wWSnmhMs7udZelhv2iJfIjYuj5j77L3htLCv/dAuv/ttfUQEAAABmeyJvcmlnaW4iOiAiaHR0cHM6Ly93ZWItcGxhdGZvcm0udGVzdDo4NDQ0IiwgImZlYXR1cmUiOiAiT3JpZ2luSXNvbGF0aW9uSGVhZGVyIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9 -Origin-Agent-Cluster: ?1
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/resources/helpers.mjs b/third_party/blink/web_tests/wpt_internal/origin-isolation/resources/helpers.mjs deleted file mode 100644 index d82137f..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/resources/helpers.mjs +++ /dev/null
@@ -1,14 +0,0 @@ -export function insertIframe(hostname, headerOrder) { - const url = new URL("send-headers.py", import.meta.url); - url.hostname = hostname; - url.searchParams.set("headerOrder", headerOrder); - - const iframe = document.createElement("iframe"); - iframe.src = url.href; - - return new Promise((resolve, reject) => { - iframe.onload = () => resolve(iframe.contentWindow); - iframe.onerror = () => reject(new Error(`Could not load ${iframe.src}`)); - document.body.append(iframe); - }); -}
diff --git a/third_party/blink/web_tests/wpt_internal/origin-isolation/resources/send-headers.py b/third_party/blink/web_tests/wpt_internal/origin-isolation/resources/send-headers.py deleted file mode 100644 index 87a7514..0000000 --- a/third_party/blink/web_tests/wpt_internal/origin-isolation/resources/send-headers.py +++ /dev/null
@@ -1,44 +0,0 @@ -def main(request, response): - """Send a response with the Origin-Agent-Cluster and Origin-Trial headers, in - the order specified by the "headerOrder" query parameter, which can be - either "oiot" or "otoi" (see ../README.md). - - The response will listen for message and messageerror events and echo them - back to the parent. See external/wpt's - /origin-isolation/resources/helpers.mjs for how these handlers are used. - """ - - token = "ArQvBL/jhDJ62HaUm/ak0dIUYDjZAfeCQTXwa92cOrHZbL7R+bhb3qrVO2pHWkgJPgvIzvLX5m3wfaUJfOKY0Q4AAABqeyJvcmlnaW4iOiAiaHR0cHM6Ly93d3cud2ViLXBsYXRmb3JtLnRlc3Q6ODQ0NCIsICJmZWF0dXJlIjogIk9yaWdpbklzb2xhdGlvbkhlYWRlciIsICJleHBpcnkiOiAyMDAwMDAwMDAwfQ==" - - header_order = request.GET.first(b"headerOrder") - if header_order == b"otoi": - response.headers.set(b"Origin-Trial", token) - response.headers.set(b"Origin-Agent-Cluster", b"?1") - elif header_order == b"oiot": - response.headers.set(b"Origin-Agent-Cluster", b"?1") - response.headers.set(b"Origin-Trial", token) - else: - raise AssertionError("Invalid headerOrder") - - response.headers.set(b"Content-Type", b"text/html") - - return """ - <!DOCTYPE html> - <meta charset="utf-8"> - <title>Helper page for origin isolation tests</title> - - <script type="module"> - window.onmessage = e => { - if (e.data.constructor === WebAssembly.Module) { - parent.postMessage("WebAssembly.Module message received", "*"); - } else if (e.data.command === "set document.domain") { - document.domain = e.data.newDocumentDomain; - parent.postMessage("document.domain is set", "*"); - } - }; - - window.onmessageerror = () => { - parent.postMessage("messageerror", "*"); - }; - </script> - """
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index c90af48..665364b0 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-10-4-101-gcbc14b10e -Revision: cbc14b10e623a5d08c89a1323ae9c420c8492118 +Version: VER-2-10-4-105-g343155383 +Revision: 34315538364b2e1ab7fb17d70dd59bb451982c80 CPEPrefix: cpe:/a:freetype:freetype:2.10.4 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/third_party/usrsctp/BUILD.gn b/third_party/usrsctp/BUILD.gn index 0e5e0f6..b869852 100644 --- a/third_party/usrsctp/BUILD.gn +++ b/third_party/usrsctp/BUILD.gn
@@ -105,7 +105,6 @@ "SCTP_PROCESS_LEVEL_LOCKS", "SCTP_SIMPLE_ALLOCATOR", "SCTP_USE_OPENSSL_SHA1", - "SCTP_USE_OPENSSL_RAND", "__Userspace__", # "SCTP_DEBUG", # Uncomment for SCTP debugging. @@ -129,13 +128,26 @@ ] if (is_linux || is_chromeos || is_android) { - defines += [ "_GNU_SOURCE" ] + defines += [ + "__Userspace_os_Linux", + "_GNU_SOURCE", + ] } else if (is_apple) { defines += [ "HAVE_SA_LEN", "__APPLE_USE_RFC_2292", + "__Userspace_os_Darwin", ] } + if (is_win) { + defines += [ "__Userspace_os_Windows" ] + } else { + defines += [ "NON_WINDOWS_DEFINE" ] + } + + if (is_fuchsia) { + defines += [ "__Userspace_os_Fuchsia" ] + } deps = [ "//third_party/boringssl" ] }
diff --git a/third_party/usrsctp/README.chromium b/third_party/usrsctp/README.chromium index e30db20..bfc3852 100644 --- a/third_party/usrsctp/README.chromium +++ b/third_party/usrsctp/README.chromium
@@ -2,8 +2,8 @@ URL: http://github.com/sctplab/usrsctp Version: 0 CPEPrefix: cpe:/a:usrsctp_project:usrsctp:2019-12-20 -Date: Jan 5, 2021 -Revision: 4191ca1784d8774dbf62d48ab9426c7311a91bc5 +Date: Aug 28, 2020 +Revision: 995c0b84414466d77d52011e5b572cbe213b770a License: New BSD License File: LICENSE Security Critical: yes @@ -19,3 +19,9 @@ draft-stewart-prsctp-00.txt draft-stewart-tsvwg-sctpipv6-00.txt draft-iyengar-sctp-cacc-00.txt + +Local Modifications: +Cherry picked: +d844a690d30ace22de75e8b80d9bb08ae7283795 +355fb576b1a9dfef70fc0e158d66692662baaddc +7dab23aa0d8db86fedd222a308067439b03fad0f
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py index b2fa709..01e17756 100644 --- a/tools/binary_size/libsupersize/archive.py +++ b/tools/binary_size/libsupersize/archive.py
@@ -8,6 +8,7 @@ import bisect import calendar import collections +import copy import datetime import gzip import itertools @@ -52,7 +53,6 @@ _OWNERS_FILE_PATH_REGEX = re.compile(r'^\s*file://(\S+)', re.MULTILINE) _UNCOMPRESSED_COMPRESSION_RATIO_THRESHOLD = 0.9 -_APKS_MAIN_APK = 'splits/base-master.apk' # Holds computation state that is live only when an output directory exists. _OutputDirectoryContext = collections.namedtuple('_OutputDirectoryContext', [ @@ -748,8 +748,8 @@ return before_size_info, after_size_info -def _CollectModuleSizes(minimal_apks_path): - sizes_by_module = collections.defaultdict(int) +def _GetModuleInfoList(minimal_apks_path): + module_info_list = [] with zipfile.ZipFile(minimal_apks_path) as z: for info in z.infolist(): # E.g.: @@ -760,7 +760,14 @@ # TODO(agrieve): Might be worth measuring a non-en locale as well. m = re.match(r'splits/(.*)-master\.apk', info.filename) if m: - sizes_by_module[m.group(1)] += info.file_size + module_info_list.append((m.group(1), info.file_size)) + return sorted(module_info_list) + + +def _CollectModuleSizes(minimal_apks_path): + sizes_by_module = collections.defaultdict(int) + for module_name, file_size in _GetModuleInfoList(minimal_apks_path): + sizes_by_module[module_name] += file_size return sizes_by_module @@ -834,14 +841,18 @@ metadata[models.METADATA_MAP_FILENAME] = shorten_path(args.map_file) if args.minimal_apks_file: - sizes_by_module = _CollectModuleSizes(args.minimal_apks_file) metadata[models.METADATA_APK_FILENAME] = shorten_path( args.minimal_apks_file) - for name, size in sizes_by_module.items(): - key = models.METADATA_APK_SIZE - if name != 'base': - key += '-' + name - metadata[key] = size + if args.split_name and args.split_name != 'base': + metadata[models.METADATA_APK_SPLIT_NAME] = args.split_name + metadata[models.METADATA_APK_SIZE] = os.path.getsize(args.apk_file) + else: + sizes_by_module = _CollectModuleSizes(args.minimal_apks_file) + for name, size in sizes_by_module.items(): + key = models.METADATA_APK_SIZE + if name != 'base': + key += '-' + name + metadata[key] = size elif args.apk_file: metadata[models.METADATA_APK_FILENAME] = shorten_path(args.apk_file) metadata[models.METADATA_APK_SIZE] = os.path.getsize(args.apk_file) @@ -1882,6 +1893,9 @@ help='Include a padding field for each symbol, instead of rederiving ' 'from consecutive symbols on file load.') + # The split_name arg is used for bundles to identify DFMs. + parser.set_defaults(split_name=None) + def AddArguments(parser): parser.add_argument('size_file', help='Path to output .size file.') @@ -2076,14 +2090,7 @@ on_config_error) -def _ProcessContainerArgs(top_args, sub_args, main_file, on_config_error): - if hasattr(sub_args, 'name'): - container_name = sub_args.name - else: - container_name = os.path.basename(main_file) - if set(container_name) & set('<>'): - parser.error('Container name cannot have characters in "<>"') - +def _ProcessContainerArgs(top_args, sub_args, container_name, on_config_error): # Copy output_directory, tool_prefix, etc. into sub_args. for k, v in top_args.__dict__.items(): sub_args.__dict__.setdefault(k, v) @@ -2132,6 +2139,28 @@ linker_name, size_info_prefix) +def _IsOnDemand(apk_path): + # Check if the manifest specifies whether or not to extract native libs. + output = subprocess.check_output([ + path_util.GetAapt2Path(), 'dump', 'xmltree', '--file', + 'AndroidManifest.xml', apk_path + ]).decode('ascii') + + def parse_attr(name): + # http://schemas.android.com/apk/res/android:isFeatureSplit(0x0101055b)=true + # http://schemas.android.com/apk/distribution:onDemand=true + m = re.search(name + r'(?:\(.*?\))?=(\w+)', output) + return m and m.group(1) == 'true' + + is_feature_split = parse_attr('android:isFeatureSplit') + # Can use <dist:on-demand>, or <module dist:onDemand="true">. + on_demand = parse_attr( + 'distribution:onDemand') or 'distribution:on-demand' in output + on_demand = bool(on_demand and is_feature_split) + + return on_demand + + def _IterSubArgs(top_args, on_config_error): """Generates main paths (may be deduced) for each containers given by input. @@ -2167,16 +2196,33 @@ # Each element in |sub_args_list| specifies a container. for sub_args in sub_args_list: main_file = _IdentifyInputFile(sub_args, on_config_error) + if hasattr(sub_args, 'name'): + container_name = sub_args.name + else: + container_name = os.path.basename(main_file) + if set(container_name) & set('<>'): + parser.error('Container name cannot have characters in "<>"') + # If needed, extract .apk file to a temp file and process that instead. if sub_args.minimal_apks_file: - with zip_util.UnzipToTemp(sub_args.minimal_apks_file, - _APKS_MAIN_APK) as temp: - sub_args.apk_file = temp - yield _ProcessContainerArgs(top_args, sub_args, main_file, - on_config_error) + for module_name, _ in _GetModuleInfoList(sub_args.minimal_apks_file): + with zip_util.UnzipToTemp( + sub_args.minimal_apks_file, + 'splits/{}-master.apk'.format(module_name)) as temp: + if _IsOnDemand(temp): + continue + module_sub_args = copy.copy(sub_args) + module_sub_args.apk_file = temp + module_sub_args.split_name = module_name + module_sub_args.name = '{}/{}.apk'.format(container_name, module_name) + if module_name != 'base': + # TODO(crbug.com/1143690): Fix native analysis for split APKs. + module_sub_args.map_file = None + yield _ProcessContainerArgs(top_args, module_sub_args, + module_sub_args.name, on_config_error) else: - yield _ProcessContainerArgs(top_args, sub_args, main_file, + yield _ProcessContainerArgs(top_args, sub_args, container_name, on_config_error)
diff --git a/tools/binary_size/libsupersize/integration_test.py b/tools/binary_size/libsupersize/integration_test.py index 4f4b871f..a24fe5f 100755 --- a/tools/binary_size/libsupersize/integration_test.py +++ b/tools/binary_size/libsupersize/integration_test.py
@@ -40,10 +40,15 @@ _TEST_ELF_FILE_BEGIN = os.path.join(_TEST_OUTPUT_DIR, 'elf.begin') _TEST_APK_LOCALE_PAK_PATH = os.path.join(_TEST_APK_ROOT_DIR, 'assets/en-US.pak') _TEST_APK_PAK_PATH = os.path.join(_TEST_APK_ROOT_DIR, 'assets/resources.pak') +_TEST_ON_DEMAND_MANIFEST_PATH = os.path.join(_TEST_DATA_DIR, + 'AndroidManifest_OnDemand.xml') +_TEST_ALWAYS_INSTALLED_MANIFEST_PATH = os.path.join( + _TEST_DATA_DIR, 'AndroidManifest_AlwaysInstalled.xml') # The following files are dynamically created. _TEST_ELF_PATH = os.path.join(_TEST_OUTPUT_DIR, 'elf') _TEST_APK_PATH = os.path.join(_TEST_OUTPUT_DIR, 'test.apk') +_TEST_OTHER_SPLIT_APK_PATH = os.path.join(_TEST_OUTPUT_DIR, 'other.apk') _TEST_MINIMAL_APKS_PATH = os.path.join(_TEST_OUTPUT_DIR, 'Bundle.minimal.apks') _TEST_SSARGS_PATH = os.path.join(_TEST_OUTPUT_DIR, 'test.ssargs') @@ -80,11 +85,13 @@ os.environ['PATH'] = _TEST_TOOL_PREFIX[:-1] + os.path.pathsep + prev_path os.environ['APK_ANALYZER'] = os.path.join(_TEST_SDK_DIR, 'tools', 'bin', 'apkanalyzer') + os.environ['AAPT2'] = os.path.join(_TEST_SDK_DIR, 'tools', 'bin', 'aapt2') try: yield finally: os.environ['PATH'] = prev_path del os.environ['APK_ANALYZER'] + del os.environ['AAPT2'] def _RunApp(name, args, debug_measures=False): @@ -145,19 +152,30 @@ apk_file.writestr( _TEST_APK_DEX_PATH, IntegrationTest._CreateBlankData(23)) + with zipfile.ZipFile(_TEST_OTHER_SPLIT_APK_PATH, 'w') as other_apk_zip: + other_apk_zip.write(_TEST_ALWAYS_INSTALLED_MANIFEST_PATH, + 'AndroidManifest.xml') + with zipfile.ZipFile(_TEST_MINIMAL_APKS_PATH, 'w') as apk_file: apk_file.write(_TEST_APK_PATH, 'splits/base-master.apk') apk_file.writestr('splits/base-en.apk', 'x' * 10) - apk_file.writestr('splits/vr-master.apk', 'x' * 20) + + with tempfile.NamedTemporaryFile(suffix='.apk') as vr_apk_file: + with zipfile.ZipFile(vr_apk_file.name, 'w') as vr_apk_zip: + vr_apk_zip.write(_TEST_ON_DEMAND_MANIFEST_PATH, 'AndroidManifest.xml') + apk_file.write(vr_apk_file.name, 'splits/vr-master.apk') apk_file.writestr('splits/vr-en.apk', 'x' * 40) + + apk_file.write(_TEST_OTHER_SPLIT_APK_PATH, 'splits/other-master.apk') apk_file.writestr('toc.pb', 'x' * 80) @classmethod def tearDownClass(cls): IntegrationTest._SafeRemoveFiles([ - _TEST_ELF_PATH, - _TEST_APK_PATH, - _TEST_MINIMAL_APKS_PATH, + _TEST_ELF_PATH, + _TEST_APK_PATH, + _TEST_OTHER_SPLIT_APK_PATH, + _TEST_MINIMAL_APKS_PATH, ]) def _CreateTestArgs(self): @@ -192,11 +210,13 @@ apk_so_path = None size_info_prefix = None extracted_minimal_apk_path = None + container_name = '' if use_apk: args.apk_file = _TEST_APK_PATH elif use_minimal_apks: args.minimal_apks_file = _TEST_MINIMAL_APKS_PATH extracted_minimal_apk_path = _TEST_APK_PATH + container_name = 'Bundle.minimal.apks' if use_apk or use_minimal_apks: apk_so_path = _TEST_APK_SO_PATH if args.output_directory: @@ -219,10 +239,13 @@ with _AddMocksToPath(): build_config = {} metadata = archive.CreateMetadata(args, linker_name, build_config) + container_list = [] + raw_symbols_list = [] container, raw_symbols = archive.CreateContainerAndSymbols( knobs=knobs, opts=opts, - container_name='', + container_name='{}/base.apk'.format(container_name) + if container_name else '', metadata=metadata, map_path=args.map_file, tool_prefix=args.tool_prefix, @@ -235,8 +258,29 @@ pak_info_file=pak_info_file, linker_name=linker_name, size_info_prefix=size_info_prefix) + container_list.append(container) + raw_symbols_list.append(raw_symbols) + if use_minimal_apks: + opts.analyze_native = False + args.split_name = 'other' + args.apk_file = _TEST_OTHER_SPLIT_APK_PATH + args.elf_file = None + args.map_file = None + metadata = archive.CreateMetadata(args, None, build_config) + container, raw_symbols = archive.CreateContainerAndSymbols( + knobs=knobs, + opts=opts, + container_name='{}/other.apk'.format(container_name), + metadata=metadata, + tool_prefix=args.tool_prefix, + output_directory=args.output_directory, + source_directory=args.source_directory, + apk_path=_TEST_OTHER_SPLIT_APK_PATH, + size_info_prefix=size_info_prefix) + container_list.append(container) + raw_symbols_list.append(raw_symbols) IntegrationTest.cached_size_info[cache_key] = archive.CreateSizeInfo( - build_config, [container], [raw_symbols]) + build_config, container_list, raw_symbols_list) return copy.deepcopy(IntegrationTest.cached_size_info[cache_key]) def _DoArchive(self, @@ -321,9 +365,13 @@ sym_strs = (repr(sym) for sym in size_info.symbols) stats = describe.DescribeSizeInfoCoverage(size_info) - assert len(size_info.containers) == 1 - # If there's only one container, merge the its metadata into build_config. - merged_data_desc = describe.DescribeDict(size_info.metadata_legacy) + if len(size_info.containers) == 1: + # If there's only one container, merge the its metadata into build_config. + merged_data_desc = describe.DescribeDict(size_info.metadata_legacy) + else: + merged_data_desc = describe.DescribeDict(size_info.build_config) + for m in size_info.metadata: + merged_data_desc.extend(describe.DescribeDict(m)) return itertools.chain(merged_data_desc, stats, sym_strs) @_CompareWithGolden()
diff --git a/tools/binary_size/libsupersize/models.py b/tools/binary_size/libsupersize/models.py index dbaa383b..a1c78ee 100644 --- a/tools/binary_size/libsupersize/models.py +++ b/tools/binary_size/libsupersize/models.py
@@ -54,6 +54,7 @@ METADATA_APK_FILENAME = 'apk_file_name' # Path relative to output_directory. METADATA_APK_SIZE = 'apk_size' # File size of apk in bytes. +METADATA_APK_SPLIT_NAME = 'apk_split_name' # Name of the split if applicable. METADATA_ZIPALIGN_OVERHEAD = 'zipalign_padding' # Overhead from zipalign. METADATA_SIGNING_BLOCK_SIZE = 'apk_signature_block_size' # Size in bytes. METADATA_MAP_FILENAME = 'map_file_name' # Path relative to output_directory.
diff --git a/tools/binary_size/libsupersize/path_util.py b/tools/binary_size/libsupersize/path_util.py index e8e5e2f..da33b46 100644 --- a/tools/binary_size/libsupersize/path_util.py +++ b/tools/binary_size/libsupersize/path_util.py
@@ -217,6 +217,12 @@ return os.environ.get('APK_ANALYZER', default_path) +def GetAapt2Path(): + default_path = FromToolsSrcRootRelative( + os.path.join('third_party', 'android_build_tools', 'aapt2', 'aapt2')) + return os.environ.get('AAPT2', default_path) + + def GetJavaHome(): return FromToolsSrcRootRelative(os.path.join('third_party', 'jdk', 'current'))
diff --git a/tools/binary_size/libsupersize/testdata/AndroidManifest_AlwaysInstalled.xml b/tools/binary_size/libsupersize/testdata/AndroidManifest_AlwaysInstalled.xml new file mode 100644 index 0000000..9b2be40 --- /dev/null +++ b/tools/binary_size/libsupersize/testdata/AndroidManifest_AlwaysInstalled.xml
@@ -0,0 +1,9 @@ +N: android=http://schemas.android.com/apk/res/android (line=2) + N: dist=http://schemas.android.com/apk/distribution (line=2) + E: manifest (line=2) + A: http://schemas.android.com/apk/res/android:isFeatureSplit(0x0101055b)=true + E: http://schemas.android.com/apk/distribution:module (line=8) + A: http://schemas.android.com/apk/distribution:onDemand=false + E: http://schemas.android.com/apk/distribution:fusing (line=9) + A: http://schemas.android.com/apk/distribution:include=true + E: application (line=12)
diff --git a/tools/binary_size/libsupersize/testdata/AndroidManifest_OnDemand.xml b/tools/binary_size/libsupersize/testdata/AndroidManifest_OnDemand.xml new file mode 100644 index 0000000..4b617360 --- /dev/null +++ b/tools/binary_size/libsupersize/testdata/AndroidManifest_OnDemand.xml
@@ -0,0 +1,9 @@ +N: android=http://schemas.android.com/apk/res/android (line=2) + N: dist=http://schemas.android.com/apk/distribution (line=2) + E: manifest (line=2) + A: http://schemas.android.com/apk/res/android:isFeatureSplit(0x0101055b)=true + E: http://schemas.android.com/apk/distribution:module (line=8) + A: http://schemas.android.com/apk/distribution:onDemand=true + E: http://schemas.android.com/apk/distribution:fusing (line=9) + A: http://schemas.android.com/apk/distribution:include=true + E: application (line=12)
diff --git a/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden b/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden index 84ac568..def1dba1d 100644 --- a/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden +++ b/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden
@@ -1,18 +1,25 @@ +git_revision=abc123 +gn_args=var1=true var2="foo" +linker_name=gold +tool_prefix=tools/binary_size/libsupersize/testdata/mock_toolchain/ apk_file_name=Bundle.minimal.apks apk_signature_block_size=0 -apk_size-vr=20 +apk_size-other=696 +apk_size-vr=695 apk_size=147858911 elf_arch=arm elf_build_id=WhatAnAmazingBuildId elf_file_name=elf elf_mtime={redacted} elf_relocations_count=394087 -git_revision=abc123 -gn_args=var1=true var2="foo" -linker_name=gold map_file_name=../../../test.map -tool_prefix=tools/binary_size/libsupersize/testdata/mock_toolchain/ zipalign_padding=32 +apk_file_name=Bundle.minimal.apks +apk_signature_block_size=0 +apk_size=696 +apk_split_name=other +zipalign_padding=0 +Container <Bundle.minimal.apks/base.apk> Section .text: has 100.0% of 35982248 bytes accounted for from 22 symbols. 0 bytes are unaccounted for. * Padding accounts for 13808 bytes (0.0%) * 16 have source paths. Accounts for 73986 bytes (0.2%). @@ -34,8 +41,8 @@ * 0 symbols have shared ownership. * 2 symbols are from generated sources. Accounts for 21 bytes (0.0%). Large padding of 675992 between: - A) .rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) - B) .rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1,component=Internal>Android) + A) <Bundle.minimal.apks/base.apk>.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) + B) <Bundle.minimal.apks/base.apk>.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1,component=Internal>Android) Section .data.rel.ro: has 100.0% of 1065224 bytes accounted for from 4 symbols. 0 bytes are unaccounted for. * Padding accounts for 0 bytes (0.0%) * 3 have source paths. Accounts for 92 bytes (0.0%). @@ -84,499 +91,555 @@ * 22 placeholders exist (symbols that start with **). Accounts for 56448494 bytes (59.0%). * 0 symbols have shared ownership. * 1 symbols are from generated sources. Accounts for 4194304 bytes (4.4%). -.text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1,component=Blink>Internal) -.text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1,component=Blink>Internal) -.text@28d948(size_without_padding=28,padding=0,full_name=_GLOBAL__sub_I_pacing_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1,component=Blink>Internal) -.text@28d964(size_without_padding=38,padding=0,full_name=extFromUUseMapping(signed char, unsigned int, int),object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.text@28d98a(size_without_padding=32,padding=0,full_name=extFromUUseMapping(aj, int),object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.text@28f000(size_without_padding=0,padding=5718,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1,component=) -.text@28f000(size_without_padding=448,padding=0,full_name=ucnv_extMatchFromU(int const*, int, unsigned short const*, int, unsigned short const*, int, unsigned int*, signed char, signed char),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.text@28f1c8(size_without_padding=20,padding=8,full_name=_GLOBAL__sub_I_SkDeviceProfile.cpp,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={startup,gen},num_aliases=1,component=Internal>Android) -.text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={unlikely,gen},num_aliases=1,component=Internal>Android) -.text@2a0000(size_without_padding=16,padding=32,full_name=BazAlias(bool),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2,component=Internal>Android) -.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2,component=) -.text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4,component=Internal>Android) -.text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4,component=Internal>Android) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4,component=Internal>Android) -.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4,component=Internal>Android) -.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) -.text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1,component=) -.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={anon,clone},num_aliases=1,component=UI>Browser) -.text@2a2000(size_without_padding=32,padding=4002,full_name=** outlined function,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) -.text@2a2020(size_without_padding=48,padding=0,full_name=aliasedWithOutlinedFunction(),object_path=,source_path=,flags={},num_aliases=2,component=) -.text@2a2020(size_without_padding=48,padding=0,full_name=** outlined function * 2,object_path=,source_path=,flags={},num_aliases=2,component=) -.text@2a2050(size_without_padding=35898456,padding=0,full_name=** .text (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) -.rodata@266e600(size_without_padding=5,padding=0,full_name="Str1",object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=2,component=Blink>Internal) -.rodata@266e600(size_without_padding=5,padding=0,full_name="Str1",object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2,component=Internal>Android) -.rodata@266e605(size_without_padding=16,padding=0,full_name="String literal2",object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.rodata@266e630(size_without_padding=16,padding=27,full_name=** merge strings,object_path=,source_path=,flags={},num_aliases=1,component=) -.rodata@284d600(size_without_padding=3425,padding=1961920,full_name=** merge constants,object_path=,source_path=,flags={},num_aliases=1,component=) -.rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1,component=) -.rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) -.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1,component=Internal>Android) -.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1,component=Internal>Android) -.rodata@28f3484(size_without_padding=3286096,padding=0,full_name=** .rodata (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) -.data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) -.data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1,component=) -.data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1,component=) -.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1,component=Internal>Android) -.data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.data.rel.ro@2cd855c(size_without_padding=1065132,padding=0,full_name=** .data.rel.ro (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) -.data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) -.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) -.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={rel},num_aliases=1,component=UI>Browser) -.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={anon},num_aliases=1,component=UI>Browser) -.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={anon,rel.loc},num_aliases=1,component=UI>Browser) -.data@2de70a8(size_without_padding=101600,padding=0,full_name=** .data (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) -.bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1,component=Internal>Android) -.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1,component=Internal>Android) -.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_65536,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1,component=Internal>Android) -.bss@2dffda0(size_without_padding=28,padding=0,full_name=g_chrome_content_browser_client,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.bss@2dffe80(size_without_padding=4,padding=196,full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.bss@2dffe84(size_without_padding=4,padding=0,full_name=g_AnimationFrameTimeHistogram_clazz,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={anon,gen},num_aliases=1,component=Internal>Android) -.dex@0(size_without_padding=1792,padding=0,full_name=org,object_path=$APK/org,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=975347,padding=0,full_name=org.chromium,object_path=$APK/org/chromium,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=44714,padding=0,full_name=org.chromium.chrome,object_path=$APK/org/chromium/chrome,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=2522400,padding=0,full_name=org.chromium.chrome.browser,object_path=$APK/org/chromium/chrome/browser,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=111986,padding=0,full_name=org.chromium.chrome.browser.compositor,object_path=$APK/org/chromium/chrome/browser/compositor,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=58449,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts,object_path=$APK/org/chromium/chrome/browser/compositor/layouts,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=23896,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=7566,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mViewAnimations: android.animation.Animator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mViewAnimatorListener: android.animation.AnimatorListenerAdapter,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollAngleInterpolator: android.view.animation.Interpolator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverscrollSlideInterpolator: android.view.animation.Interpolator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mUnderScrollAngleInterpolator: android.view.animation.Interpolator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=12,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#$assertionsDisabled: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mInSwipe: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mIsDying: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mIsStackForCurrentTabList: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mRecomputePosition: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeCanScroll: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeIsCancelable: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderLeftPadding: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderTopPadding: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderTransparentSide: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderTransparentTop: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mCurrentScrollDirection: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mDiscardDirection: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mEvenOutProgress: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mEvenOutRate: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLastPinch0Offset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLastPinch1Offset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxOverScroll: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxOverScrollAngle: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxOverScrollSlide: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxUnderScroll: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMinScrollMotion: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMinSpacing: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollOffsetForDyingTabs: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollTarget: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeBoundedScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeUnboundScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mWarpSize: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation.DRAG_ANGLE_THRESHOLD: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mCurrentMode: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mDragLock$7be2905e: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLongPressSelected: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollCounter: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollDerivative: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverviewAnimationType$5d025a5c: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mPinch0TabIndex: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mPinch1TabIndex: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mReferenceOrderIndex: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSpacing: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLastScrollUpdate: long,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mTabAnimations: org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLayout: org.chromium.chrome.browser.compositor.layouts.phone.StackLayout,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mAnimationFactory: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScroller: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mDiscardingTab: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollingTab: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mStackTabs: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mViewAnimationFactory: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackViewAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mTabList: org.chromium.chrome.browser.tabmodel.TabList,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mBorderTopHeight: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mBorderTopOpaqueHeight: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mHeight: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mHeightMinusBrowserControls: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mWidth: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mStack: org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$$Lambda$0,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$$Lambda$0#$instance: Object,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$0,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$0#$instance: Object,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=220,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$1,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzkB/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested2$$Lambda$0,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested2$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested2$$Lambda$0#$instance: Object,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested2$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=104,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mFinished: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#DECELERATION_RATE: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mCurrVelocity: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mDeceleration: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mFlingFriction: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mPhysicalCoeff: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#SPLINE_POSITION: float[],object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#SPLINE_TIME: float[],object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mCurrentPosition: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mDuration: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mFinal: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mOver: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mSplineDistance: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mSplineDuration: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mStart: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mState: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mVelocity: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mStartTime: long,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex@0(size_without_padding=4616803,padding=0,full_name=** .dex (unattributed - includes string literals),object_path=,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=113,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#<clinit>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=225,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#<init>(android.content.Context,org.chromium.chrome.browser.compositor.layouts.phone.StackLayout),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=446,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#evenOutTabs(float,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=96,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#isDisplayable(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=341,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#onUpdateCompositorAnimations(long,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=101,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#onUpdateViewAnimation(long,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=100,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation.allowOverscroll(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=90,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#approxScreen(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=112,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeDiscardAlpha(float,float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=136,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeDiscardScale(float,float,boolean): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=88,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeOverscrollPercent(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=84,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getDefaultDiscardDirection(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=79,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getMaxScroll(boolean): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=113,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getMaxTabHeight(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=196,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getMinScroll(boolean): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=105,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getRange(float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=94,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getScrollDimensionSize(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=128,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getStackScale(android.graphics.RectF): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=69,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#screenToScroll(float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=69,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#scrollToScreen(float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=253,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeSpacing(int): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=68,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getCount(): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=360,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getTabIndexAtPositon(float,float,float): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=121,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getVisibleCount(): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=61,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#access$000(org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack): org.chromium.chrome.browser.compositor.layouts.phone.StackLayout,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=87,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getTabAtPositon(float,float): org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=64,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#cleanupTabs(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=261,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#commitDiscard(long,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=969,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabClippingVisibilityHelper(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=1512,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabOffsetHelper(android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=318,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabPosition(long,android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=217,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabScrollOffsetHelper(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=1008,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabTiltHelper(long,android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=560,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabVisibilitySortingHelper(android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=322,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#contextChanged(android.content.Context): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=563,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#createStackTabs(boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=1521,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#drag(long,float,float,float,float): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=813,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#finishAnimation(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=223,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#finishAnimationsIfDone(long,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=503,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#fling(long,float,float,float,float): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=400,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#notifySizeChanged$483d2f6e(int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=107,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#onUpOrCancel(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=68,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#requestUpdate(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=79,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#resetInputActionIndices(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=134,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#setScrollTarget(float,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=121,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#setStackFocusInfo(float,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=244,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#setWarpState(boolean,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=219,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#springBack(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=919,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#startAnimation$62adfb33(long,int,int,int,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=77,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#startAnimation$6848a047(long,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=95,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#startAnimation$78b04ab8(long,int,int,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=137,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#stopScrollingMovement(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=142,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#swipeCancelled(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=266,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#tabClosingEffect(long,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=217,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#updateOverscrollOffset(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=112,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#<init>(org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,float,float,float,float,float),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=24,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#isDefaultDiscardDirectionPositive(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=30,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getScreenPositionInScrollDirection(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=24,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getScreenSizeInScrollDirection(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=92,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getStaticTabPosition(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=67,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getToolbarOffsetToLineUpWithBorder(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=1055,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createAnimatorSetForType$2fab410e$104f6ddb(int,org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,int,float,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=36,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createEnterStackAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=139,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createNewTabOpenedAnimatorSet$4078c09e(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[]): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=32,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createReachTopAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=36,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createTabFocusedAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=32,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createViewMoreAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#addTiltScrollAnimation(org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,org.chromium.chrome.browser.compositor.layouts.components.LayoutTab,float,int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$$Lambda$0#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$0#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$1#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzkB/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested2$$Lambda$0#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested2$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=82,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#<init>(org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,float,float,float,float,float),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=52,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#isDefaultDiscardDirectionPositive(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=79,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#getScreenPositionInScrollDirection(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=54,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#getScreenSizeInScrollDirection(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=592,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createEnterStackAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=59,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createNewTabOpenedAnimatorSet$4078c09e(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[]): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createReachTopAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=961,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createTabFocusedAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=256,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createViewMoreAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=106,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#addTiltScrollAnimation(org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,org.chromium.chrome.browser.compositor.layouts.components.LayoutTab,float,int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=471,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#<clinit>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=146,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#<init>(android.content.Context),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$000(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=65,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$002(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=218,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#continueWhenFinished(long): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=138,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#springback(int,int,int,long): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=440,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#update(long): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=97,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#getSplineDeceleration(int): double,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=115,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#getSplineFlingDistance(int): double,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$500(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=71,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#getDeceleration(int): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$100(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$200(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$400(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$300(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): long,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=176,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#adjustDuration(int,int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=66,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#finish(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=660,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#fling(int,int,int,int,int,long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=220,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#onEdgeReached(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=109,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#startScroll(int,int,long,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=167,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#startSpringback$4868d30e(int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.dex.method@0(size_without_padding=90,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#updateScroll(float): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) -.pak.nontranslated@2f03(size_without_padding=502,padding=0,full_name=../../chrome/browser/browser_resources.grd: IDR_PDF_COMPOSITOR_MANIFEST,object_path=,source_path=,flags={uncompressed},num_aliases=1,component=) -.pak.nontranslated@2f04(size_without_padding=217,padding=0,full_name=../../chrome/browser/browser_resources.grd: IDR_CHROME_RENDERER_SERVICE_MANIFEST,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.nontranslated@0(size_without_padding=0,padding=18,full_name=Overhead: assets/resources.pak,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3ac6(size_without_padding=40,padding=0,full_name=../../components/app_modal_strings.grdp: IDS_BEFOREUNLOAD_MESSAGEBOX_MESSAGE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3d7c(size_without_padding=24,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_TYPE_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3d82(size_without_padding=25,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_LIST_ENTRY_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3d83(size_without_padding=41,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_SCHEMA_VALIDATION_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dd2(size_without_padding=51,padding=0,full_name=../../components/safe_browsing_strings.grdp: IDS_SB_UNDER_CONSTRUCTION,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3df8(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_TITLE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3df9(size_without_padding=17,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dfa(size_without_padding=18,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dfb(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dfc(size_without_padding=44,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dfd(size_without_padding=226,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PRIMARY_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dfe(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3dff(size_without_padding=231,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e00(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PROCEED_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e01(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e02(size_without_padding=116,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e03(size_without_padding=156,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_SCOUT_REPORTING_AGREE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e08(size_without_padding=26,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e09(size_without_padding=253,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PRIMARY_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e0a(size_without_padding=155,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e0b(size_without_padding=187,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e0c(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e0d(size_without_padding=160,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e0e(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@3e0f(size_without_padding=147,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e85(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_CLEAR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e86(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_TODAY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e87(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SUBMIT_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e89(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_RESET_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e8a(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_BUTTON_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e8b(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_MULTIPLE_FILES_BUTTON_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e8c(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_NO_FILE_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e8d(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_MULTIPLE_UPLOAD,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e8e(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_OTHER_COLOR_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e92(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_DAY_OF_MONTH_FIELD,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e93(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_MONTH_FIELD,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e94(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_YEAR_FIELD,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e95(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SELECT_MENU_LIST_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e96(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_MONTH_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e97(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_WEEK_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e98(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_WEEK_NUMBER_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e99(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_MONTH_SELECTOR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e9a(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_NEXT_MONTH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e9b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_PREVIOUS_MONTH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e9c(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_WEEK_DESCRIPTION,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e9d(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ARTICLE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e9e(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BANNER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4e9f(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COMPLEMENTARY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CHECK_BOX,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea1(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CONTENT_INFO,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DEFINITION,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea4(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DESCRIPTION_TERM,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea5(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DISCLOSURE_TRIANGLE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FEED,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ea9(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FOOTER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eac(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOGGLE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ead(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eae(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LINK,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eaf(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MAIN_CONTENT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb0(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARK,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MATH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NAVIGATIONAL_LINK,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb3(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_REGION,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb4(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH_BOX,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb5(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_STATUS,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb6(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SWITCH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb8(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eb9(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT_DIALOG,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eba(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_APPLICATION,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ebb(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BLOCKQUOTE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ebc(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ebd(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON_DROP_DOWN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ebe(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CELL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ebf(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLOR_WELL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec0(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLUMN_HEADER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec2(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec3(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE_TIME,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec4(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIALOG,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec5(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIRECTORY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec6(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DOCUMENT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec7(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_EMBEDDED_OBJECT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec8(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_GRAPHIC,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ec9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING_WITH_LEVEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eca(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_INPUT_TIME,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ecb(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LIST_BOX,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ecc(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LOG,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ecd(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARQUEE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ece(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ecf(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BAR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed0(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_ITEM,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_METER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed3(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NOTE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed4(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_POP_UP_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed5(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_PROGRESS_INDICATOR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed6(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed7(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO_GROUP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed8(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ROW_HEADER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ed9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SCROLL_BAR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eda(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4edb(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SLIDER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4edc(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPIN_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4edd(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPLITTER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ede(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4edf(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TABLE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_LIST,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_PANEL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee2(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIME,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee3(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIMER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee4(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLBAR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee5(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLTIP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee7(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_GRID,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee8(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_ITEM,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ee9(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_AM_PM_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eea(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_DAY_OF_MONTH_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eeb(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_HOUR_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eec(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DEFAULT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eed(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_ELEMENT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eee(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_ELEMENT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eef(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef0(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef3(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef4(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef5(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef6(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_EXIT_FULL_SCREEN_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef7(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef8(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4ef9(size_without_padding=31,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_OFF_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4efa(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_ON_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4efb(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DOWNLOAD_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4efc(size_without_padding=30,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4eff(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f00(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f01(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f02(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f03(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_SLIDER_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f04(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_SLIDER_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f05(size_without_padding=29,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f06(size_without_padding=42,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f07(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f09(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f0a(size_without_padding=37,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f0d(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f0e(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MILLISECOND_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f0f(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MINUTE_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f10(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MONTH_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f11(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_SECOND_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f13(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_YEAR_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f14(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_INPUT_WEEK_TEMPLATE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f15(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_MULTIPLE_FILE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f16(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f17(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f18(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_DOMAIN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f19(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_LOCAL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f1a(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOMAIN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f1b(size_without_padding=47,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOTS,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f1c(size_without_padding=65,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_LOCAL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f1d(size_without_padding=75,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_NO_AT_SIGN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f1e(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_MULTIPLE_EMAIL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f1f(size_without_padding=48,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f20(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW_DATETIME,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f21(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f22(size_without_padding=34,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW_DATETIME,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f23(size_without_padding=81,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_DATETIME,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f24(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_NUMBER,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f25(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f26(size_without_padding=51,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_CHECKBOX,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f27(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_FILE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f28(size_without_padding=41,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_RADIO,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f29(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_SELECT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f2a(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f2b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_URL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f2c(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_PATTERN_MISMATCH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f2d(size_without_padding=77,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f2e(size_without_padding=64,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH_CLOSE_TO_LIMIT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f2f(size_without_padding=96,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_LONG,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f30(size_without_padding=95,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f31(size_without_padding=97,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT_PLURAL,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f32(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f33(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS_SUBMENU_TITLE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f34(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CAST,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f35(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_ENTER_FULLSCREEN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f36(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_EXIT_FULLSCREEN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f37(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_STOP_CAST,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f38(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_MUTE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f39(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_UNMUTE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f3a(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PLAY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f3b(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PAUSE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f3c(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_DOWNLOAD,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f3d(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_DISABLE_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f3e(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f3f(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TO_UNKNOWN_DEVICE_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@4f40(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_NO_LABEL,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) -.pak.translations@4f41(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_OFF,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=2,component=Blink>Internal) -.pak.translations@4f41(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_OFF,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2,component=Internal>Android) -.pak.translations@4f42(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_PLUGIN_INITIALIZATION_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@5bd6(size_without_padding=27,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_NOT_AVAILABLE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@5bd7(size_without_padding=69,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_CAN_NOT_BE_LOADED,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@5bd8(size_without_padding=121,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@5bd9(size_without_padding=161,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN_SUGGESTIONS,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@5bda(size_without_padding=80,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_PARENTAL_PERMISSION_NEEDED,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@6917(size_without_padding=23,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_FAMILY,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@6918(size_without_padding=9,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_SIZE,object_path=,source_path=,flags={},num_aliases=1,component=) -.pak.translations@0(size_without_padding=0,padding=18,full_name=Overhead: assets/en-US.pak,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=1048576,padding=0,full_name=assets/icudtl.dat,object_path=,source_path=third_party/icu/android/icudtl.dat,flags={},num_aliases=1,component=Internal>Android) -.other@0(size_without_padding=1024,padding=0,full_name=res/drawable-v13/test.xml,object_path=,source_path=chrome/android/res/drawable/test.xml,flags={},num_aliases=1,component=) -.other@0(size_without_padding=4194304,padding=0,full_name=smalltest.so,object_path=,source_path=$APK/smalltest.so,flags={gen},num_aliases=1,component=) -.other@0(size_without_padding=60,padding=0,full_name=** ELF Section: .ARM.attributes,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=1536456,padding=0,full_name=** ELF Section: .ARM.exidx,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=183632,padding=0,full_name=** ELF Section: .ARM.extab,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=304,padding=0,full_name=** ELF Section: .dynamic,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=4025,padding=0,full_name=** ELF Section: .dynstr,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=6496,padding=0,full_name=** ELF Section: .dynsym,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=8,padding=0,full_name=** ELF Section: .fini_array,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=812,padding=0,full_name=** ELF Section: .gnu.version,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=28,padding=0,full_name=** ELF Section: .gnu.version_d,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=96,padding=0,full_name=** ELF Section: .gnu.version_r,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=42956,padding=0,full_name=** ELF Section: .got,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=2684,padding=0,full_name=** ELF Section: .hash,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=8,padding=0,full_name=** ELF Section: .init_array,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=19,padding=0,full_name=** ELF Section: .interp,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=36,padding=0,full_name=** ELF Section: .note.gnu.build-id,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=28,padding=0,full_name=** ELF Section: .note.gnu.gold-version,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=4244,padding=0,full_name=** ELF Section: .plt,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=2655384,padding=0,full_name=** ELF Section: .rel.dyn,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=2816,padding=0,full_name=** ELF Section: .rel.plt,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=436,padding=0,full_name=** ELF Section: .shstrtab,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=34841854,padding=0,full_name=** ELF Section: .strtab,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=17166112,padding=0,full_name=** ELF Section: .symtab,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=0,padding=764,full_name=Overhead: APK file,object_path=,source_path=,flags={},num_aliases=1,component=) -.other@0(size_without_padding=0,padding=33902635,full_name=Overhead: ELF file,object_path=,source_path=,flags={},num_aliases=1,component=) + +Container <Bundle.minimal.apks/other.apk> +Section .text: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .rodata: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 string literals exist. Accounts for 0 bytes (0.0%) padding is 0 bytes. +* 0 symbols have shared ownership. +Section .data.rel.ro: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .data: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .bss: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .dex: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .dex.method: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .pak.translations: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .pak.nontranslated: 0 bytes from 0 symbols. +* Padding accounts for 0 bytes (0.0%) +* 0 have source paths. Accounts for 0 bytes (0.0%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +Section .other: has 100.0% of 696 bytes accounted for from 2 symbols. 0 bytes are unaccounted for. +* Padding accounts for 136 bytes (19.5%) +* 1 have source paths. Accounts for 560 bytes (80.5%). +* 0 have a component assigned. Accounts for 0 bytes (0.0%). +* 0 symbols have shared ownership. +* 1 symbols are from generated sources. Accounts for 560 bytes (80.5%). +<Bundle.minimal.apks/base.apk>.text@28d900(size_without_padding=16,padding=0,full_name=_GLOBAL__sub_I_page_allocator.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.text@28d910(size_without_padding=56,padding=0,full_name=_GLOBAL__sub_I_bbr_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.text@28d948(size_without_padding=28,padding=0,full_name=_GLOBAL__sub_I_pacing_sender.cc,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={startup},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.text@28d964(size_without_padding=38,padding=0,full_name=extFromUUseMapping(signed char, unsigned int, int),object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.text@28d98a(size_without_padding=32,padding=0,full_name=extFromUUseMapping(aj, int),object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.text@28f000(size_without_padding=0,padding=5718,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.text@28f000(size_without_padding=448,padding=0,full_name=ucnv_extMatchFromU(int const*, int, unsigned short const*, int, unsigned short const*, int, unsigned int*, signed char, signed char),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@28f1c8(size_without_padding=20,padding=8,full_name=_GLOBAL__sub_I_SkDeviceProfile.cpp,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={startup,gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@28f1e0(size_without_padding=69120,padding=4,full_name=foo_bar,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={unlikely,gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@2a0000(size_without_padding=16,padding=32,full_name=BazAlias(bool),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@2a0000(size_without_padding=16,padding=32,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=,source_path=,flags={},num_aliases=2,component=) +<Bundle.minimal.apks/base.apk>.text@2a0010(size_without_padding=12,padding=0,full_name=BarAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@2a0010(size_without_padding=12,padding=0,full_name=FooAlias(),object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=4,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen,clone},num_aliases=4,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@2a0010(size_without_padding=12,padding=0,full_name=blink::ContiguousContainerBase::shrinkToFit(),object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={clone},num_aliases=4,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.text@2a0020(size_without_padding=24,padding=4,full_name=blink::ContiguousContainerBase::ContiguousContainerBase(blink::ContiguousContainerBase&&),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.text@2a1000(size_without_padding=0,padding=4040,full_name=** symbol gap 1,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.text@2a1000(size_without_padding=94,padding=0,full_name=blink::PaintChunker::releasePaintChunks(),object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={anon,clone},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.text@2a2000(size_without_padding=32,padding=4002,full_name=** outlined function,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.text@2a2020(size_without_padding=48,padding=0,full_name=aliasedWithOutlinedFunction(),object_path=,source_path=,flags={},num_aliases=2,component=) +<Bundle.minimal.apks/base.apk>.text@2a2020(size_without_padding=48,padding=0,full_name=** outlined function * 2,object_path=,source_path=,flags={},num_aliases=2,component=) +<Bundle.minimal.apks/base.apk>.text@2a2050(size_without_padding=35898456,padding=0,full_name=** .text (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.rodata@266e600(size_without_padding=5,padding=0,full_name="Str1",object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=2,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.rodata@266e600(size_without_padding=5,padding=0,full_name="Str1",object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.rodata@266e605(size_without_padding=16,padding=0,full_name="String literal2",object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.rodata@266e630(size_without_padding=16,padding=27,full_name=** merge strings,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.rodata@284d600(size_without_padding=3425,padding=1961920,full_name=** merge constants,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.rodata@284e364(size_without_padding=0,padding=3,full_name=** symbol gap 0,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.rodata@284e364(size_without_padding=8,padding=0,full_name=,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.rodata@284e370(size_without_padding=40,padding=4,full_name=Name,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.rodata@284e398(size_without_padding=32,padding=0,full_name=chrome::mojom::FilePatcher::Name_,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.rodata@28f3450(size_without_padding=48,padding=675992,full_name=kAnimationFrameTimeHistogramClassPath,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.rodata@28f3480(size_without_padding=4,padding=0,full_name=blink::CSSValueKeywordsHash::findValueImpl(char const*, unsigned int)::value_word_list,object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={anon},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.rodata@28f3484(size_without_padding=3286096,padding=0,full_name=** .rodata (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.data.rel.ro.local@2c176f0(size_without_padding=56,padding=0,full_name=ChromeMainDelegate [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.data.rel.ro.local@2c17728(size_without_padding=24,padding=0,full_name=chrome::mojom::FieldTrialRecorder [vtable],object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.data.rel.ro.local@2c17740(size_without_padding=789904,padding=0,full_name=chrome::mojom::FieldTrialRecorderProxy [vtable],object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.data.rel.ro.local@2cd84e0(size_without_padding=16,padding=16,full_name=.Lswitch.table.45,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libcontroller_api_impl.a_controller_api_impl.o,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.data.rel.ro.local@2cd84f0(size_without_padding=8,padding=0,full_name=kSystemClassPrefixes,object_path=third_party/gvr-android-sdk/libgvr_shim_static_arm.a/libport_android_jni.a_jni_utils.o,source_path=,flags={anon},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.data.rel.ro@2cd8500(size_without_padding=56,padding=0,full_name=ChromeMainDelegateAndroid [vtable],object_path=third_party/sub/PaintChunker.o,source_path=third_party/paint.cc,flags={},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.data.rel.ro@2cd8538(size_without_padding=24,padding=0,full_name=mojo::MessageReceiver [vtable],object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.data.rel.ro@2cd8550(size_without_padding=12,padding=0,full_name=kMethodsAnimationFrameTimeHistogram,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.data.rel.ro@2cd855c(size_without_padding=1065132,padding=0,full_name=** .data.rel.ro (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.data@2de7000(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelCmpxchg,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=1,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.data@2de7004(size_without_padding=4,padding=0,full_name=google::protobuf::internal::pLinuxKernelMemoryBarrier,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.data@2de7008(size_without_padding=152,padding=0,full_name=base::android::kBaseRegisteredMethods,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={rel},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.data@2de70a0(size_without_padding=4,padding=0,full_name=base::android::g_renderer_histogram_code,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={anon},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.data@2de70a4(size_without_padding=4,padding=0,full_name=base::android::g_library_version_number,object_path=third_party/sub/ContiguousContainer.o,source_path=third_party/container/container.c,flags={anon,rel.loc},num_aliases=1,component=UI>Browser) +<Bundle.minimal.apks/base.apk>.data@2de70a8(size_without_padding=101600,padding=0,full_name=** .data (unattributed),object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.bss@0(size_without_padding=262144,padding=0,full_name=ff_cos_131072,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_131072_fixed,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_fixed.o,source_path=third_party/fft_fixed.cc,flags={},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.bss@0(size_without_padding=131072,padding=0,full_name=ff_cos_65536,object_path=third_party/ffmpeg/libffmpeg_internal.a/fft_float.o,source_path=third_party/fft_float.cc,flags={},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.bss@2dffda0(size_without_padding=28,padding=0,full_name=g_chrome_content_browser_client,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.bss@2dffe80(size_without_padding=4,padding=196,full_name=SaveHistogram(_JNIEnv*, base::android::JavaParamRef<_jobject*> const&, base::android::JavaParamRef<_jstring*> const&, base::android::JavaParamRef<_jlongArray*> const&, int)::atomic_histogram_pointer,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.bss@2dffe84(size_without_padding=4,padding=0,full_name=g_AnimationFrameTimeHistogram_clazz,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={anon,gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=1792,padding=0,full_name=org,object_path=$APK/org,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=975347,padding=0,full_name=org.chromium,object_path=$APK/org/chromium,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=44714,padding=0,full_name=org.chromium.chrome,object_path=$APK/org/chromium/chrome,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=2522400,padding=0,full_name=org.chromium.chrome.browser,object_path=$APK/org/chromium/chrome/browser,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=111986,padding=0,full_name=org.chromium.chrome.browser.compositor,object_path=$APK/org/chromium/chrome/browser/compositor,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=58449,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts,object_path=$APK/org/chromium/chrome/browser/compositor/layouts,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=23896,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=7566,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mViewAnimations: android.animation.Animator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mViewAnimatorListener: android.animation.AnimatorListenerAdapter,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollAngleInterpolator: android.view.animation.Interpolator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverscrollSlideInterpolator: android.view.animation.Interpolator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mUnderScrollAngleInterpolator: android.view.animation.Interpolator,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=12,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#$assertionsDisabled: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mInSwipe: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mIsDying: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mIsStackForCurrentTabList: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mRecomputePosition: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeCanScroll: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeIsCancelable: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderLeftPadding: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderTopPadding: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderTransparentSide: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mBorderTransparentTop: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mCurrentScrollDirection: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mDiscardDirection: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mEvenOutProgress: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mEvenOutRate: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLastPinch0Offset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLastPinch1Offset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxOverScroll: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxOverScrollAngle: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxOverScrollSlide: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMaxUnderScroll: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMinScrollMotion: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mMinSpacing: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollOffsetForDyingTabs: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollTarget: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeBoundedScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSwipeUnboundScrollOffset: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mWarpSize: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation.DRAG_ANGLE_THRESHOLD: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mCurrentMode: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mDragLock$7be2905e: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLongPressSelected: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollCounter: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverScrollDerivative: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mOverviewAnimationType$5d025a5c: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mPinch0TabIndex: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mPinch1TabIndex: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mReferenceOrderIndex: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mSpacing: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLastScrollUpdate: long,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mTabAnimations: org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mLayout: org.chromium.chrome.browser.compositor.layouts.phone.StackLayout,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mAnimationFactory: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScroller: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mDiscardingTab: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mScrollingTab: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mStackTabs: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mViewAnimationFactory: org.chromium.chrome.browser.compositor.layouts.phone.stack.StackViewAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#mTabList: org.chromium.chrome.browser.tabmodel.TabList,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mBorderTopHeight: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mBorderTopOpaqueHeight: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mHeight: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mHeightMinusBrowserControls: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mWidth: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#mStack: org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$$Lambda$0,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$$Lambda$0#$instance: Object,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$0,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$0#$instance: Object,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=220,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$1,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzkB/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested2$$Lambda$0,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested2$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested2$$Lambda$0#$instance: Object,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested2$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=104,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mFinished: boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#DECELERATION_RATE: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=11,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mCurrVelocity: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mDeceleration: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mFlingFriction: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mPhysicalCoeff: float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#SPLINE_POSITION: float[],object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#SPLINE_TIME: float[],object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mCurrentPosition: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mDuration: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mFinal: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mOver: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mSplineDistance: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mSplineDuration: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mStart: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mState: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mVelocity: int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=10,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#mStartTime: long,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex@0(size_without_padding=4616803,padding=0,full_name=** .dex (unattributed - includes string literals),object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=113,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#<clinit>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=225,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#<init>(android.content.Context,org.chromium.chrome.browser.compositor.layouts.phone.StackLayout),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=446,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#evenOutTabs(float,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=96,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#isDisplayable(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=341,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#onUpdateCompositorAnimations(long,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=101,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#onUpdateViewAnimation(long,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=100,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation.allowOverscroll(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=90,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#approxScreen(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=112,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeDiscardAlpha(float,float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=136,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeDiscardScale(float,float,boolean): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=88,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeOverscrollPercent(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=84,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getDefaultDiscardDirection(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=79,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getMaxScroll(boolean): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=113,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getMaxTabHeight(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=196,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getMinScroll(boolean): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=105,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getRange(float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=94,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getScrollDimensionSize(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=128,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getStackScale(android.graphics.RectF): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=69,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#screenToScroll(float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=69,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#scrollToScreen(float): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=253,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeSpacing(int): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=68,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getCount(): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=360,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getTabIndexAtPositon(float,float,float): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=121,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getVisibleCount(): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=61,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#access$000(org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack): org.chromium.chrome.browser.compositor.layouts.phone.StackLayout,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=87,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#getTabAtPositon(float,float): org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=64,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#cleanupTabs(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=261,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#commitDiscard(long,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=969,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabClippingVisibilityHelper(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=1512,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabOffsetHelper(android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=318,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabPosition(long,android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=217,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabScrollOffsetHelper(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=1008,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabTiltHelper(long,android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=560,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#computeTabVisibilitySortingHelper(android.graphics.RectF): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=322,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#contextChanged(android.content.Context): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=563,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#createStackTabs(boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=1521,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#drag(long,float,float,float,float): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=813,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#finishAnimation(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=223,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#finishAnimationsIfDone(long,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=503,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#fling(long,float,float,float,float): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=400,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#notifySizeChanged$483d2f6e(int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=107,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#onUpOrCancel(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=68,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#requestUpdate(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=79,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#resetInputActionIndices(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=134,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#setScrollTarget(float,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=121,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#setStackFocusInfo(float,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=244,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#setWarpState(boolean,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=219,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#springBack(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=919,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#startAnimation$62adfb33(long,int,int,int,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=77,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#startAnimation$6848a047(long,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=95,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#startAnimation$78b04ab8(long,int,int,boolean): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=137,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#stopScrollingMovement(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=142,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#swipeCancelled(long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=266,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#tabClosingEffect(long,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=217,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack#updateOverscrollOffset(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=112,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#<init>(org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,float,float,float,float,float),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=24,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#isDefaultDiscardDirectionPositive(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=30,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getScreenPositionInScrollDirection(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=24,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getScreenSizeInScrollDirection(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=92,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getStaticTabPosition(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=67,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#getToolbarOffsetToLineUpWithBorder(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=1055,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createAnimatorSetForType$2fab410e$104f6ddb(int,org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,int,float,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=36,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createEnterStackAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=139,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createNewTabOpenedAnimatorSet$4078c09e(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[]): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=32,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createReachTopAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=36,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createTabFocusedAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=32,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#createViewMoreAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=40,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation#addTiltScrollAnimation(org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,org.chromium.chrome.browser.compositor.layouts.components.LayoutTab,float,int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$$Lambda$0#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$0#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested1$$Lambda$1#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested1$kjevdDQ8V2zqCrdieLqWLHzkB/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=35,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimation$Nested2$$Lambda$0#<init>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/-$$Lambda$StackAnimation$Nested2$kjevdDQ8V2zqCrdieLqWLHzk/dex,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=82,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#<init>(org.chromium.chrome.browser.compositor.layouts.phone.stack.Stack,float,float,float,float,float),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=52,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#isDefaultDiscardDirectionPositive(): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=79,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#getScreenPositionInScrollDirection(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=54,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#getScreenSizeInScrollDirection(): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=592,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createEnterStackAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=59,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createNewTabOpenedAnimatorSet$4078c09e(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[]): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=210,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createReachTopAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=961,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createTabFocusedAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int,int,float): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=256,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#createViewMoreAnimatorSet(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab[],int): org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=106,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackAnimationLandscape#addTiltScrollAnimation(org.chromium.chrome.browser.compositor.layouts.ChromeAnimation,org.chromium.chrome.browser.compositor.layouts.components.LayoutTab,float,int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=471,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#<clinit>(),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=146,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#<init>(android.content.Context),object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$000(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=65,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$002(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller,boolean): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=218,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#continueWhenFinished(long): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=138,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#springback(int,int,int,long): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=440,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#update(long): boolean,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=97,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#getSplineDeceleration(int): double,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=115,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#getSplineFlingDistance(int): double,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$500(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=71,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#getDeceleration(int): float,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$100(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$200(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$400(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): int,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=62,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#access$300(org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller): long,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=176,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#adjustDuration(int,int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=66,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#finish(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=660,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#fling(int,int,int,int,int,long): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=220,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#onEdgeReached(): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=109,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#startScroll(int,int,long,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=167,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#startSpringback$4868d30e(int,int): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.dex.method@0(size_without_padding=90,padding=0,full_name=org.chromium.chrome.browser.compositor.layouts.phone.stack.StackScroller$SplineStackScroller#updateScroll(float): void,object_path=$APK/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller$SplineStackScroller,source_path=chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackScroller.java,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.nontranslated@2f03(size_without_padding=502,padding=0,full_name=../../chrome/browser/browser_resources.grd: IDR_PDF_COMPOSITOR_MANIFEST,object_path=,source_path=,flags={uncompressed},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.nontranslated@2f04(size_without_padding=217,padding=0,full_name=../../chrome/browser/browser_resources.grd: IDR_CHROME_RENDERER_SERVICE_MANIFEST,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.nontranslated@0(size_without_padding=0,padding=18,full_name=Overhead: assets/resources.pak,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3ac6(size_without_padding=40,padding=0,full_name=../../components/app_modal_strings.grdp: IDS_BEFOREUNLOAD_MESSAGEBOX_MESSAGE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3d7c(size_without_padding=24,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_TYPE_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3d82(size_without_padding=25,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_LIST_ENTRY_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3d83(size_without_padding=41,padding=0,full_name=../../components/policy_strings.grdp: IDS_POLICY_SCHEMA_VALIDATION_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dd2(size_without_padding=51,padding=0,full_name=../../components/safe_browsing_strings.grdp: IDS_SB_UNDER_CONSTRUCTION,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3df8(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_TITLE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3df9(size_without_padding=17,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_OPEN_DETAILS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dfa(size_without_padding=18,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_V3_CLOSE_DETAILS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dfb(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFEBROWSING_OVERRIDABLE_SAFETY_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dfc(size_without_padding=44,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dfd(size_without_padding=226,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PRIMARY_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dfe(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3dff(size_without_padding=231,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_EXPLANATION_PARAGRAPH_SUBRESOURCE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e00(size_without_padding=165,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_V3_PROCEED_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e01(size_without_padding=20,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_PRIVACY_POLICY_PAGE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e02(size_without_padding=116,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_MALWARE_REPORTING_AGREE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e03(size_without_padding=156,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_SAFE_BROWSING_SCOUT_REPORTING_AGREE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e08(size_without_padding=26,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e09(size_without_padding=253,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PRIMARY_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e0a(size_without_padding=155,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e0b(size_without_padding=187,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_V4_PROCEED_AND_REPORT_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e0c(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e0d(size_without_padding=160,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_MALWARE_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e0e(size_without_padding=32,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@3e0f(size_without_padding=147,padding=0,full_name=../../components/security_interstitials_strings.grdp: IDS_PHISHING_WEBVIEW_EXPLANATION_PARAGRAPH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e85(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_CLEAR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e86(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_CALENDAR_TODAY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e87(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SUBMIT_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e89(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_RESET_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e8a(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_BUTTON_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e8b(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_MULTIPLE_FILES_BUTTON_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e8c(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_NO_FILE_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e8d(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_FILE_MULTIPLE_UPLOAD,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e8e(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_OTHER_COLOR_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e92(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_DAY_OF_MONTH_FIELD,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e93(size_without_padding=8,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_MONTH_FIELD,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e94(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_PLACEHOLDER_FOR_YEAR_FIELD,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e95(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_SELECT_MENU_LIST_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e96(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_MONTH_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e97(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_THIS_WEEK_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e98(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_WEEK_NUMBER_LABEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e99(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_MONTH_SELECTOR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e9a(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_NEXT_MONTH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e9b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_SHOW_PREVIOUS_MONTH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e9c(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_CALENDAR_WEEK_DESCRIPTION,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e9d(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ARTICLE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e9e(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BANNER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4e9f(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COMPLEMENTARY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CHECK_BOX,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea1(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CONTENT_INFO,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DEFINITION,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea4(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DESCRIPTION_TERM,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea5(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DISCLOSURE_TRIANGLE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FEED,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ea9(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_FOOTER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eac(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOGGLE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ead(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eae(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LINK,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eaf(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MAIN_CONTENT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb0(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARK,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MATH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb2(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NAVIGATIONAL_LINK,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb3(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_REGION,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb4(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH_BOX,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb5(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_STATUS,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb6(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SWITCH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb8(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eb9(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ALERT_DIALOG,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eba(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_APPLICATION,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ebb(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BLOCKQUOTE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ebc(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ebd(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_BUTTON_DROP_DOWN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ebe(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_CELL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ebf(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLOR_WELL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec0(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_COLUMN_HEADER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec2(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec3(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DATE_TIME,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec4(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIALOG,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec5(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DIRECTORY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec6(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_DOCUMENT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec7(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_EMBEDDED_OBJECT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec8(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_GRAPHIC,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ec9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_HEADING_WITH_LEVEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eca(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_INPUT_TIME,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ecb(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LIST_BOX,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ecc(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_LOG,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ecd(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MARQUEE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ece(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ecf(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BAR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed0(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_MENU_ITEM,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_METER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed3(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_NOTE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed4(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_POP_UP_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed5(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_PROGRESS_INDICATOR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed6(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed7(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_RADIO_GROUP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed8(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_ROW_HEADER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ed9(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SCROLL_BAR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eda(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SEARCH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4edb(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SLIDER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4edc(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPIN_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4edd(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_SPLITTER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ede(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4edf(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TABLE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee0(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_LIST,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee1(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TAB_PANEL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee2(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIME,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee3(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TIMER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee4(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLBAR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee5(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TOOLTIP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee6(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee7(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_GRID,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee8(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_ROLE_TREE_ITEM,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ee9(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_AM_PM_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eea(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_DAY_OF_MONTH_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eeb(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_HOUR_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eec(size_without_padding=19,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DEFAULT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eed(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_ELEMENT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eee(size_without_padding=15,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_ELEMENT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eef(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef0(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef1(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef2(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef3(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef4(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef5(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef6(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_EXIT_FULL_SCREEN_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef7(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef8(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4ef9(size_without_padding=31,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_OFF_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4efa(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CAST_ON_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4efb(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_DOWNLOAD_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4efc(size_without_padding=30,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4eff(size_without_padding=22,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_MUTE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f00(size_without_padding=24,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_UNMUTE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f01(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PLAY_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f02(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_PAUSE_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f03(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_AUDIO_SLIDER_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f04(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_VIDEO_SLIDER_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f05(size_without_padding=29,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_CURRENT_TIME_DISPLAY_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f06(size_without_padding=42,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_TIME_REMAINING_DISPLAY_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f07(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_ENTER_FULL_SCREEN_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f09(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_SHOW_CLOSED_CAPTIONS_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f0a(size_without_padding=37,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_HIDE_CLOSED_CAPTIONS_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f0d(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MEDIA_OVERFLOW_BUTTON_HELP,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f0e(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MILLISECOND_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f0f(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MINUTE_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f10(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_MONTH_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f11(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_SECOND_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f13(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_AX_YEAR_FIELD_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f14(size_without_padding=17,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_INPUT_WEEK_TEMPLATE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f15(size_without_padding=38,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_MULTIPLE_FILE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f16(size_without_padding=20,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f17(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f18(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_DOMAIN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f19(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_EMPTY_LOCAL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f1a(size_without_padding=63,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOMAIN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f1b(size_without_padding=47,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_DOTS,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f1c(size_without_padding=65,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_INVALID_LOCAL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f1d(size_without_padding=75,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL_NO_AT_SIGN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f1e(size_without_padding=61,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_MULTIPLE_EMAIL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f1f(size_without_padding=48,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f20(size_without_padding=32,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_UNDERFLOW_DATETIME,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f21(size_without_padding=45,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f22(size_without_padding=34,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_RANGE_OVERFLOW_DATETIME,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f23(size_without_padding=81,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_DATETIME,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f24(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_BAD_INPUT_NUMBER,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f25(size_without_padding=33,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f26(size_without_padding=51,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_CHECKBOX,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f27(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_FILE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f28(size_without_padding=41,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_RADIO,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f29(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_VALUE_MISSING_SELECT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f2a(size_without_padding=36,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_EMAIL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f2b(size_without_padding=25,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TYPE_MISMATCH_URL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f2c(size_without_padding=40,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_PATTERN_MISMATCH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f2d(size_without_padding=77,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f2e(size_without_padding=64,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_STEP_MISMATCH_CLOSE_TO_LIMIT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f2f(size_without_padding=96,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_LONG,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f30(size_without_padding=95,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f31(size_without_padding=97,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_FORM_VALIDATION_TOO_SHORT_PLURAL,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f32(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f33(size_without_padding=13,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CLOSED_CAPTIONS_SUBMENU_TITLE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f34(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_CAST,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f35(size_without_padding=16,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_ENTER_FULLSCREEN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f36(size_without_padding=21,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_EXIT_FULLSCREEN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f37(size_without_padding=18,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_STOP_CAST,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f38(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_MUTE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f39(size_without_padding=12,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_UNMUTE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f3a(size_without_padding=10,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PLAY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f3b(size_without_padding=11,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_PAUSE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f3c(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_OVERFLOW_MENU_DOWNLOAD,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f3d(size_without_padding=26,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_DISABLE_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f3e(size_without_padding=23,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f3f(size_without_padding=28,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_REMOTING_CAST_TO_UNKNOWN_DEVICE_TEXT,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@4f40(size_without_padding=14,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_NO_LABEL,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.pak.translations@4f41(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_OFF,object_path=base/base/page_allocator.o,source_path=base/page_allocator.cc,flags={},num_aliases=2,component=Blink>Internal) +<Bundle.minimal.apks/base.apk>.pak.translations@4f41(size_without_padding=9,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_MEDIA_TRACKS_OFF,object_path=third_party/icu/icuuc/ucnv_ext.o,source_path=third_party/icu/ucnv_ext.c,flags={gen},num_aliases=2,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.pak.translations@4f42(size_without_padding=27,padding=0,full_name=../../content/app/strings/content_strings.grd: IDS_PLUGIN_INITIALIZATION_ERROR,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@5bd6(size_without_padding=27,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_NOT_AVAILABLE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@5bd7(size_without_padding=69,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_CAN_NOT_BE_LOADED,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@5bd8(size_without_padding=121,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@5bd9(size_without_padding=161,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_TEMPORARILY_DOWN_SUGGESTIONS,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@5bda(size_without_padding=80,padding=0,full_name=../../android_webview/ui/aw_strings.grd: IDS_AW_WEBPAGE_PARENTAL_PERMISSION_NEEDED,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@6917(size_without_padding=23,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_FAMILY,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@6918(size_without_padding=9,padding=0,full_name=../../ui/strings/app_locale_settings.grd: IDS_WEB_FONT_SIZE,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.pak.translations@0(size_without_padding=0,padding=18,full_name=Overhead: assets/en-US.pak,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=1048576,padding=0,full_name=assets/icudtl.dat,object_path=,source_path=third_party/icu/android/icudtl.dat,flags={},num_aliases=1,component=Internal>Android) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=1024,padding=0,full_name=res/drawable-v13/test.xml,object_path=,source_path=chrome/android/res/drawable/test.xml,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=4194304,padding=0,full_name=smalltest.so,object_path=,source_path=$APK/smalltest.so,flags={gen},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=60,padding=0,full_name=** ELF Section: .ARM.attributes,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=1536456,padding=0,full_name=** ELF Section: .ARM.exidx,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=183632,padding=0,full_name=** ELF Section: .ARM.extab,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=304,padding=0,full_name=** ELF Section: .dynamic,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=4025,padding=0,full_name=** ELF Section: .dynstr,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=6496,padding=0,full_name=** ELF Section: .dynsym,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=8,padding=0,full_name=** ELF Section: .fini_array,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=812,padding=0,full_name=** ELF Section: .gnu.version,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=28,padding=0,full_name=** ELF Section: .gnu.version_d,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=96,padding=0,full_name=** ELF Section: .gnu.version_r,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=42956,padding=0,full_name=** ELF Section: .got,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=2684,padding=0,full_name=** ELF Section: .hash,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=8,padding=0,full_name=** ELF Section: .init_array,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=19,padding=0,full_name=** ELF Section: .interp,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=36,padding=0,full_name=** ELF Section: .note.gnu.build-id,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=28,padding=0,full_name=** ELF Section: .note.gnu.gold-version,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=4244,padding=0,full_name=** ELF Section: .plt,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=2655384,padding=0,full_name=** ELF Section: .rel.dyn,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=2816,padding=0,full_name=** ELF Section: .rel.plt,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=436,padding=0,full_name=** ELF Section: .shstrtab,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=34841854,padding=0,full_name=** ELF Section: .strtab,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=17166112,padding=0,full_name=** ELF Section: .symtab,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=0,padding=764,full_name=Overhead: APK file,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/base.apk>.other@0(size_without_padding=0,padding=33902635,full_name=Overhead: ELF file,object_path=,source_path=,flags={},num_aliases=1,component=) +<Bundle.minimal.apks/other.apk>.other@0(size_without_padding=560,padding=0,full_name=AndroidManifest.xml,object_path=,source_path=$APK/AndroidManifest.xml,flags={gen},num_aliases=1,component=) +<Bundle.minimal.apks/other.apk>.other@0(size_without_padding=0,padding=136,full_name=Overhead: APK file,object_path=,source_path=,flags={},num_aliases=1,component=)
diff --git a/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/aapt2 b/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/aapt2 new file mode 100755 index 0000000..a32eea4 --- /dev/null +++ b/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/aapt2
@@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +base_dir=$(dirname "$0") +exec python "$base_dir/mock_aapt2.py" "$@"
diff --git a/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_aapt2.py b/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_aapt2.py new file mode 100644 index 0000000..fa07129c --- /dev/null +++ b/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_aapt2.py
@@ -0,0 +1,23 @@ +# Copyright 2020 The Chromium 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 os +import sys +import zipfile + + +def main(): + apk_path = sys.argv[-1] + assert os.path.exists(apk_path), 'Apk does not exist: {}'.format(apk_path) + with zipfile.ZipFile(apk_path) as z: + try: + # The AndroidManifest.xml file will have the aapt2 output, and not XML. + with z.open('AndroidManifest.xml') as f: + sys.stdout.write(f.read()) + except KeyError: + pass + + +if __name__ == '__main__': + main()
diff --git a/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_apkanalyzer.py b/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_apkanalyzer.py index 79d149a7..aa8644cb 100644 --- a/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_apkanalyzer.py +++ b/tools/binary_size/libsupersize/testdata/mock_sdk/tools/bin/mock_apkanalyzer.py
@@ -5,6 +5,7 @@ import os import sys +import zipfile _SCRIPT_DIR = os.path.dirname(__file__) @@ -15,8 +16,12 @@ # Without a proguard mapping file, the last argument is the apk_path. apk_path = sys.argv[-1] assert os.path.exists(apk_path), 'Apk does not exist: {}'.format(apk_path) - with open(_OUTPUT_FILE, 'r') as f: - sys.stdout.write(f.read()) + with zipfile.ZipFile(apk_path) as z: + if any(n.endswith('.dex') for n in z.namelist()): + with open(_OUTPUT_FILE, 'r') as f: + sys.stdout.write(f.read()) + else: + sys.stdout.write('P r 0 0 0 <TOTAL>') if __name__ == '__main__':
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index ea86ce6..1343d7c0 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -162,6 +162,10 @@ "chrome/browser/resources/preinstalled_web_apps/resources.grd": { "includes": [1710], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/pdf/resources.grd": { + "META": {"sizes": {"includes": [200]}}, + "includes": [1715], + }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/print_preview/print_preview_resources.grd": { "META": {"sizes": {"includes": [500],}}, "includes": [1720], @@ -242,7 +246,8 @@ "META": {"sizes": {"includes": [10],}}, "includes": [2090], }, - "chrome/browser/resources/media/webrtc_logs_resources.grd": { + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/media/webrtc_logs_resources.grd": { + "META": {"sizes": {"includes": [10],}}, "includes": [2100], }, "chrome/browser/resources/net_internals/net_internals_resources.grd": {
diff --git a/tools/json_schema_compiler/feature_compiler.py b/tools/json_schema_compiler/feature_compiler.py index 1618996c..fc870d2 100644 --- a/tools/json_schema_compiler/feature_compiler.py +++ b/tools/json_schema_compiler/feature_compiler.py
@@ -390,7 +390,6 @@ # Exceptions (see the feature files). # DO NOT ADD MORE. HOSTED_APP_EXCEPTIONS = [ - '99060B01DE911EB85FD630C8BA6320C9186CA3AB', 'B44D08FD98F1523ED5837D78D0A606EA9D6206E5', '2653F6F6C39BC6EEBD36A09AFB92A19782FF7EB4', ]
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 8fc5f5a..3a944c31 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -144,6 +144,7 @@ 'android-angle-vk-arm-builder': 'angle_specific_android_vulkan_ndk_release_trybot', 'android-angle-vk-arm64-builder': 'angle_specific_android_vulkan_ndk_release_trybot_arm64', 'fuchsia-angle-builder': 'angle_specific_release_trybot_fuchsia', + 'ios-angle-builder': 'angle_specific_release_trybot_ios', 'linux-angle-builder': 'angle_specific_release_trybot', 'linux-angle-chromium-builder': 'gpu_tests_release_trybot', 'linux-ozone-angle-builder': 'angle_specific_ozone_linux_system_gbm_libdrm_release_trybot', @@ -345,10 +346,8 @@ 'mac-upload-perfetto': 'release_bot', 'win-annotator-rel': 'release_bot', 'win-celab-builder-rel': 'release_bot_minimal_symbols', - # TODO(bartekn): Switch back to debug_bot_paeverywhere_x86 and - # release_trybot_paeverywhere_x86. - 'win-paeverywhere-x86-fyi-dbg': 'debug_bot_x86', - 'win-paeverywhere-x86-fyi-rel': 'release_trybot_x86', + 'win-paeverywhere-x86-fyi-dbg': 'debug_bot_paeverywhere_x86', + 'win-paeverywhere-x86-fyi-rel': 'release_trybot_paeverywhere_x86', 'win-paeverywhere-x64-fyi-dbg': 'debug_bot_paeverywhere_x64', 'win-paeverywhere-x64-fyi-rel': 'release_trybot_paeverywhere_x64', 'win-pixel-builder-rel': 'release_bot', @@ -374,10 +373,6 @@ 'win32-archive-rel-goma-canary-localoutputcache': 'release_bot_x86_minimal_symbols_enable_archive_compression', 'win32-archive-rel-goma-latest-localoutputcache': 'release_bot_x86_minimal_symbols_enable_archive_compression', - 'Win7 Builder (dbg) Goma Canary': 'gpu_tests_debug_bot_x86_no_symbols', - 'Win7 Builder (dbg) Goma Latest Client': 'gpu_tests_debug_bot_x86_no_symbols', - 'Win7 Builder Goma Canary': 'gpu_tests_release_bot_x86_minimal_symbols', - 'Win7 Builder Goma Latest Client': 'gpu_tests_release_bot_x86_minimal_symbols', 'Mac Builder (dbg) Goma Canary': 'gpu_tests_debug_bot', 'Mac Builder (dbg) Goma Canary (clobber)': 'gpu_tests_debug_bot', @@ -861,6 +856,7 @@ 'android_angle_vk32_deqp_rel_ng': 'angle_deqp_android_vulkan_ndk_release_trybot', 'android_angle_vk64_deqp_rel_ng': 'angle_deqp_android_vulkan_ndk_release_trybot_arm64', 'fuchsia-angle-rel': 'gpu_fyi_tests_release_trybot_fuchsia', + 'ios-angle-try-intel': 'angle_specific_release_trybot_ios', 'linux-angle-rel': 'gpu_fyi_tests_release_trybot', 'linux_angle_ozone_rel_ng': 'angle_ozone_linux_system_gbm_libdrm_release_trybot', 'linux_angle_deqp_rel_ng': 'angle_deqp_release_trybot', @@ -1524,6 +1520,10 @@ 'angle_specific_tests', 'shared_release_trybot', 'fuchsia', ], + 'angle_specific_release_trybot_ios': [ + 'angle_specific_tests', 'shared_release_trybot', 'ios', 'ios_simulator', 'ios_cpu_x64', 'xctest', + ], + 'angle_specific_release_trybot_x86': [ 'angle_specific_tests', 'shared_release_trybot', 'x86', ], @@ -1923,6 +1923,10 @@ 'debug_bot', 'fuchsia', 'compile_only', ], + 'debug_bot_paeverywhere_x86': [ + 'debug_bot', 'paeverywhere', 'x86', + ], + 'debug_bot_paeverywhere_x64': [ 'debug_bot', 'paeverywhere', 'x64', ], @@ -2568,7 +2572,11 @@ 'use_clang_coverage', 'partial_code_coverage_instrumentation', ], - 'release_trybot_paeverywhere_x64': [ + 'release_trybot_paeverywhere_x86': [ + 'release_trybot', 'paeverywhere', 'x86', + ], + + 'release_trybot_paeverywhere_x64': [ 'release_trybot', 'paeverywhere', 'x64', ], @@ -3175,8 +3183,7 @@ }, 'paeverywhere': { - # TODO(bartekn): Re-enable. - # 'gn_args': 'use_allocator="partition"', + 'gn_args': 'use_allocator="partition"', }, # Used to pass the list of files to instrument for coverage to the compile
diff --git a/tools/mb/mb_config_expectations/chromium.angle.json b/tools/mb/mb_config_expectations/chromium.angle.json index b2ea5ef4..f30b87c3 100644 --- a/tools/mb/mb_config_expectations/chromium.angle.json +++ b/tools/mb/mb_config_expectations/chromium.angle.json
@@ -89,6 +89,22 @@ "use_goma": true } }, + "ios-angle-builder": { + "gn_args": { + "build_angle_deqp_tests": true, + "build_angle_gles1_conform_tests": true, + "build_angle_trace_perf_tests": true, + "dcheck_always_on": true, + "enable_run_ios_unittests_with_xctest": true, + "is_component_build": true, + "is_debug": false, + "symbol_level": 1, + "target_cpu": "x64", + "target_environment": "simulator", + "target_os": "ios", + "use_goma": true + } + }, "linux-angle-builder": { "gn_args": { "build_angle_deqp_tests": true,
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json index 0d02c48..f0f86cf4 100644 --- a/tools/mb/mb_config_expectations/chromium.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -248,6 +248,7 @@ "symbol_level": 1, "target_cpu": "arm", "target_os": "android", + "use_allocator": "partition", "use_goma": true } }, @@ -259,6 +260,7 @@ "symbol_level": 1, "target_cpu": "arm", "target_os": "android", + "use_allocator": "partition", "use_goma": true } }, @@ -269,6 +271,7 @@ "symbol_level": 1, "target_cpu": "arm64", "target_os": "android", + "use_allocator": "partition", "use_goma": true } }, @@ -280,6 +283,7 @@ "symbol_level": 1, "target_cpu": "arm64", "target_os": "android", + "use_allocator": "partition", "use_goma": true } }, @@ -648,6 +652,7 @@ "is_debug": true, "symbol_level": 1, "target_cpu": "x64", + "use_allocator": "partition", "use_goma": true } }, @@ -658,6 +663,7 @@ "is_debug": false, "symbol_level": 1, "target_cpu": "x64", + "use_allocator": "partition", "use_goma": true } }, @@ -723,6 +729,7 @@ "is_debug": true, "symbol_level": 1, "target_cpu": "x64", + "use_allocator": "partition", "use_goma": true } }, @@ -733,6 +740,7 @@ "is_debug": false, "symbol_level": 1, "target_cpu": "x64", + "use_allocator": "partition", "use_goma": true } }, @@ -764,6 +772,7 @@ "is_debug": true, "symbol_level": 1, "target_cpu": "x64", + "use_allocator": "partition", "use_goma": true } }, @@ -774,6 +783,7 @@ "is_debug": false, "symbol_level": 1, "target_cpu": "x64", + "use_allocator": "partition", "use_goma": true } }, @@ -783,6 +793,7 @@ "is_debug": true, "symbol_level": 1, "target_cpu": "x86", + "use_allocator": "partition", "use_goma": true } }, @@ -793,6 +804,7 @@ "is_debug": false, "symbol_level": 1, "target_cpu": "x86", + "use_allocator": "partition", "use_goma": true } },
diff --git a/tools/mb/mb_config_expectations/chromium.goma.fyi.json b/tools/mb/mb_config_expectations/chromium.goma.fyi.json index cabdae5..cdfa93dc 100644 --- a/tools/mb/mb_config_expectations/chromium.goma.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.goma.fyi.json
@@ -181,50 +181,6 @@ "use_goma": true } }, - "Win7 Builder (dbg) Goma Canary": { - "gn_args": { - "ffmpeg_branding": "Chrome", - "is_component_build": true, - "is_debug": true, - "proprietary_codecs": true, - "symbol_level": 0, - "target_cpu": "x86", - "use_goma": true - } - }, - "Win7 Builder (dbg) Goma Latest Client": { - "gn_args": { - "ffmpeg_branding": "Chrome", - "is_component_build": true, - "is_debug": true, - "proprietary_codecs": true, - "symbol_level": 0, - "target_cpu": "x86", - "use_goma": true - } - }, - "Win7 Builder Goma Canary": { - "gn_args": { - "ffmpeg_branding": "Chrome", - "is_component_build": false, - "is_debug": false, - "proprietary_codecs": true, - "symbol_level": 1, - "target_cpu": "x86", - "use_goma": true - } - }, - "Win7 Builder Goma Latest Client": { - "gn_args": { - "ffmpeg_branding": "Chrome", - "is_component_build": false, - "is_debug": false, - "proprietary_codecs": true, - "symbol_level": 1, - "target_cpu": "x86", - "use_goma": true - } - }, "android-archive-dbg-goma-canary": { "gn_args": { "is_component_build": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.angle.json b/tools/mb/mb_config_expectations/tryserver.chromium.angle.json index fc2f09d4..9f5a6096 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.angle.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.angle.json
@@ -106,6 +106,22 @@ "use_goma": true } }, + "ios-angle-try-intel": { + "gn_args": { + "build_angle_deqp_tests": true, + "build_angle_gles1_conform_tests": true, + "build_angle_trace_perf_tests": true, + "dcheck_always_on": true, + "enable_run_ios_unittests_with_xctest": true, + "is_component_build": true, + "is_debug": false, + "symbol_level": 1, + "target_cpu": "x64", + "target_environment": "simulator", + "target_os": "ios", + "use_goma": true + } + }, "linux-angle-rel": { "gn_args": { "build_angle_gles1_conform_tests": true,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 27e293f..809d60a 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -1580,6 +1580,9 @@ </enum> <enum name="AndroidDefaultBrowserPromoUserActionType"> + <obsolete> + Removed Dec 2020; experiment is done and the data isn't useful. + </obsolete> <int value="0" label="Change Default"/> <int value="1" label="No Thanks"/> </enum> @@ -3875,6 +3878,9 @@ </enum> <enum name="AsyncDNSConfigParsePosix"> + <obsolete> + Removed 2021-01. + </obsolete> <int value="0" label="OK"/> <int value="1" label="RES_INIT_FAILED"/> <int value="2" label="RES_INIT_UNSET"/> @@ -3887,6 +3893,9 @@ </enum> <enum name="AsyncDNSConfigParseWin"> + <obsolete> + Removed 2021-01. + </obsolete> <int value="0" label="OK"/> <int value="1" label="READ_IPHELPER"/> <int value="2" label="READ_POLICY_SEARCHLIST"/> @@ -3903,6 +3912,9 @@ </enum> <enum name="AsyncDNSHostsParseWin"> + <obsolete> + Removed 2021-01. + </obsolete> <int value="0" label="OK"/> <int value="1" label="UNREADABLE_HOSTS_FILE"/> <int value="2" label="COMPUTER_NAME_FAILED"/> @@ -3911,6 +3923,9 @@ </enum> <enum name="AsyncDNSNameServersType"> + <obsolete> + Removed unknown date before 2021-01. + </obsolete> <summary>Type of nameservers in the DNS config.</summary> <int value="0" label="NONE">No nameservers configured.</int> <int value="1" label="GOOGLE_PUBLIC_DNS"> @@ -3930,6 +3945,9 @@ </enum> <enum name="AsyncDNSParseResult"> + <obsolete> + Removed unknown date before 2021-01. + </obsolete> <summary>Results of DnsResponse::ParseToAddressList.</summary> <int value="0" label="SUCCESS"/> <int value="1" label="MALFORMED_RESPONSE"/> @@ -3942,12 +3960,18 @@ </enum> <enum name="AsyncDNSPrefDefaultSource"> + <obsolete> + Removed unknown date before 2021-01. + </obsolete> <int value="0" label="PLATFORM"/> <int value="1" label="FIELD_TRIAL"/> <int value="2" label="HARD_CODED_DEFAULT"/> </enum> <enum name="AsyncDNSPrefSource"> + <obsolete> + Removed unknown date before 2021-01. + </obsolete> <int value="0" label="MANAGED_PREF"/> <int value="1" label="SUPERVISED_PREF"/> <int value="2" label="EXTENSION_PREF"/> @@ -3959,6 +3983,9 @@ </enum> <enum name="AsyncDNSRcode"> + <obsolete> + Removed unknown date before 2021-01. + </obsolete> <summary> https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6 </summary> @@ -3971,6 +3998,9 @@ </enum> <enum name="AsyncDNSResolveStatus"> + <obsolete> + Removed unknown date before 2021-01. + </obsolete> <int value="0" label="DNS_SUCCESS">Succeeded with async DNS.</int> <int value="1" label="PROC_SUCCESS"> Succeeded with getaddrinfo after async DNS failed. @@ -3982,6 +4012,9 @@ </enum> <enum name="AsyncDNSWatchStatus"> + <obsolete> + Removed 2021-01. + </obsolete> <int value="0" label="STARTED">Started.</int> <int value="1" label="FAILED_TO_START_CONFIG"> Failed to start watching config. @@ -6914,6 +6947,28 @@ <int value="2" label="BLOCK_STATUS_ALL_DOMAINS_BLOCKED"/> </enum> +<enum name="BluetoothAdapterConnectToServiceInsecurelyResult"> + <int value="0" label="Success"/> + <int value="1" label="Error: Invalid arguments"/> + <int value="2" label="Error: Operation already in progress"/> + <int value="3" label="Error: Already exists"/> + <int value="4" label="Error: Operation is not supported"/> + <int value="5" label="Error: Not connected"/> + <int value="6" label="Error: Already connected"/> + <int value="7" label="Error: Operation currently not available"/> + <int value="8" label="Error: Does not exist"/> + <int value="9" label="Error: Operation not authorized"/> + <int value="10" label="Error: Not permitted"/> + <int value="11" label="Error: No such adapter"/> + <int value="12" label="Error: Agent not available"/> + <int value="13" label="Error: Resource not ready"/> + <int value="14" label="Error: Failed"/> + <int value="15" label="Error: Failed to create receiving Mojo pipe"/> + <int value="16" label="Error: Failed to create sending Mojo pipe"/> + <int value="17" label="Error: Could not connect to device"/> + <int value="18" label="Error: Unknown"/> +</enum> + <enum name="BluetoothAvailability"> <int value="0" label="Unexpected error"/> <int value="1" label="Not available"/> @@ -7169,6 +7224,14 @@ <int value="4" label="Unknown"/> </enum> +<enum name="BlueZResultOfAdvertisementMonitor"> + <int value="0" label="Success"/> + <int value="1" label="Unknown Error"/> + <int value="2" label="Invalid Parameters"/> + <int value="3" label="No Resource"/> + <int value="4" label="Busy"/> +</enum> + <enum name="BlueZResultOfAdvertisementRegistration"> <int value="1" label="Success"/> <int value="2" label="LE unsupported"/> @@ -30350,7 +30413,7 @@ <int value="3343" label="V8Window_GetOriginPrivateDirectory_Method"/> <int value="3344" label="RTCConstraintEnableRtpDataChannelsTrue"/> <int value="3345" label="RTCConstraintEnableRtpDataChannelsFalse"/> - <int value="3346" label="NativeFileSystemDragAndDrop"/> + <int value="3346" label="FileSystemAccessDragAndDrop"/> <int value="3347" label="RTCAdaptivePtime"/> <int value="3348" label="HTMLMetaElementReferrerPolicyMultipleTokensAffectingRequest"/> @@ -30756,6 +30819,9 @@ <int value="3743" label="ReadableStreamWithByteSource"/> <int value="3744" label="ReadableStreamBYOBReader"/> <int value="3745" label="EmbedElementWithoutTypeSrcChanged"/> + <int value="3746" label="SamePartyCookieAttribute"/> + <int value="3747" label="SamePartyCookieExclusionOverruledSameSite"/> + <int value="3748" label="SamePartyCookieInclusionOverruledSameSite"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -36839,6 +36905,9 @@ </enum> <enum name="HistoryUrlType"> + <obsolete> + Removed Jan 2021 as the only user has expired + </obsolete> <int value="0" label="Empty"/> <int value="1" label="Same as baseUrl"/> <int value="2" label="Different from baseUrl"/> @@ -42816,6 +42885,8 @@ <int value="-1497450774" label="TreatUnsafeDownloadsAsActive:disabled"/> <int value="-1497338981" label="disable-accelerated-overflow-scroll"/> <int value="-1496106797" label="IPH_PasswordsAccountStorage:enabled"/> + <int value="-1495973732" + label="ResamplingScrollEventsExperimentalPrediction:disabled"/> <int value="-1492934655" label="TabSwitcherOnReturn:enabled"/> <int value="-1492609320" label="TurnOffStreamingMediaCachingOnBattery:disabled"/> @@ -43351,6 +43422,8 @@ <int value="-1040000888" label="ContextMenuSearchWithGoogleLens:disabled"/> <int value="-1039889738" label="NativeNotifications:enabled"/> <int value="-1039555838" label="GamepadExtensions:enabled"/> + <int value="-1037950113" + label="ResamplingScrollEventsExperimentalPrediction:enabled"/> <int value="-1037128156" label="HomeLauncherGestures:disabled"/> <int value="-1035346097" label="SyncErrorInfoBarAndroid:enabled"/> <int value="-1035140982" label="ClientSideDetectionModelOnAndroid:enabled"/> @@ -50292,6 +50365,22 @@ <int value="5" label="Authentication Error"/> </enum> +<enum name="MultiDeviceNearbyDisconnectionReason"> + <int value="0" label="Disconnection requested by client"/> + <int value="1" label="Failed discovery"/> + <int value="2" label="Timeout during discovery"/> + <int value="3" label="Failed requesting connection"/> + <int value="4" label="Timeout during RequestConnection() call"/> + <int value="5" label="Failed accepting connection"/> + <int value="6" label="Timeout during AcceptConnection() call"/> + <int value="7" label="Connection rejected"/> + <int value="8" label="Timeout waiting for connection to be accepted"/> + <int value="9" label="SendMessage() failed"/> + <int value="10" label="Received unexpected payload type"/> + <int value="11" label="Connection lost"/> + <int value="12" label="Nearby process crash"/> +</enum> + <enum name="MultiDeviceNearbyMessageAction"> <int value="0" label="Message Sent"/> <int value="1" label="Message Received"/> @@ -50851,6 +50940,24 @@ <int value="9" label="WebRTC"/> </enum> +<enum name="NearbyConnectionsStatus"> + <int value="0" label="Success"/> + <int value="1" label="Error"/> + <int value="2" label="Out-of-order API call"/> + <int value="3" label="Already have active strategy"/> + <int value="4" label="Already advertising"/> + <int value="5" label="Already discovering"/> + <int value="6" label="Endpoint IO error"/> + <int value="7" label="Endpoint unknown"/> + <int value="8" label="Connection rejected"/> + <int value="9" label="Already connected to endpoint"/> + <int value="10" label="Not connected to endpoint"/> + <int value="11" label="Bluetooth error"/> + <int value="12" label="BLE error"/> + <int value="13" label="Wi-Fi LAN error"/> + <int value="14" label="Payload unknown"/> +</enum> + <enum name="NearbyShareCertificateManagerGetDecryptedPublicCertificateResult"> <int value="0" label="Success"/> <int value="1" label="No Match"/> @@ -52969,6 +53076,17 @@ <int value="1" label="User Disconnect"/> </enum> +<enum name="NetworkEligibilityStatus"> + <int value="0" label="Network Is Eligible"/> + <int value="1" label="No Metedata"/> + <int value="2" label="Prohibited By Policy"/> + <int value="3" label="Invalid Password"/> + <int value="4" label="Not Connectable"/> + <int value="5" label="Not Configured By User"/> + <int value="6" label="Unsupported Security Type"/> + <int value="7" label="No Wifi Networks Available"/> +</enum> + <enum name="NetworkErrorType"> <int value="0" label="Unknown"/> <int value="1" label="Portal"/> @@ -61423,6 +61541,13 @@ </int> </enum> +<enum name="ProfileKeepAliveOrigin"> + <int value="0" label="kWaitingForFirstBrowserWindow"/> + <int value="1" label="kBrowserWindow"/> + <int value="2" label="kBackgroundMode"/> + <int value="3" label="kOffTheRecordProfile"/> +</enum> + <enum name="ProfileMenuActionableItem"> <int value="0" label="Manage your Google Account button"/> <int value="1" label="Passwords button"/> @@ -66347,6 +66472,13 @@ <int value="1" label="Launcher"/> </enum> +<enum name="ScanJobFailureReason"> + <int value="0" label="Unknown scanner error"/> + <int value="1" label="Scanner not found"/> + <int value="2" label="Unsupported Scan To path"/> + <int value="3" label="Save to disk failed"/> +</enum> + <enum name="ScheduledNavigationType"> <obsolete> Deprecated August 2018 @@ -66792,6 +66924,9 @@ <enum name="SecureChannelNearbyConnectionMedium"> <int value="0" label="Connected via Bluetooth"/> <int value="1" label="Upgraded bandwidth to WebRTC"/> + <int value="2" + label="Disconnected in under 30s without WebRTC upgrade; not provided + enough time to complete bandwidth upgrade process"/> </enum> <enum name="SecureCookieAction">
diff --git a/tools/metrics/histograms/histograms_xml/android/histograms.xml b/tools/metrics/histograms/histograms_xml/android/histograms.xml index ca74d9a..3b549d0 100644 --- a/tools/metrics/histograms/histograms_xml/android/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/android/histograms.xml
@@ -499,6 +499,9 @@ <histogram name="Android.DefaultBrowserPromo.DialogShown" enum="AndroidDefaultBrowserPromoType" expires_after="2021-05-30"> + <obsolete> + Removed Dec 2020; experiment is done and the data isn't useful. + </obsolete> <owner>lazzzis@google.com</owner> <owner>twellington@chromium.org</owner> <owner>pavely@chromium.org</owner> @@ -563,6 +566,9 @@ <histogram name="Android.DefaultBrowserPromo.UIDismissalReason.NoDefault" enum="AndroidDefaultBrowserPromoUserActionType" expires_after="2021-06-06"> + <obsolete> + Removed Dec 2020; experiment is done and the data isn't useful. + </obsolete> <owner>lazzzis@google.com</owner> <owner>twellington@chromium.org</owner> <owner>pavely@chromium.org</owner> @@ -574,6 +580,9 @@ <histogram name="Android.DefaultBrowserPromo.UIDismissalReason.OtherDefault" enum="AndroidDefaultBrowserPromoUserActionType" expires_after="2021-05-30"> + <obsolete> + Removed Dec 2020; experiment is done and the data isn't useful. + </obsolete> <owner>lazzzis@google.com</owner> <owner>twellington@chromium.org</owner> <owner>pavely@chromium.org</owner> @@ -2530,6 +2539,9 @@ <histogram name="Android.WebView.LoadDataWithBaseUrl.HistoryUrl" enum="HistoryUrlType" expires_after="M85"> + <obsolete> + Removed Jan 2021 (had already expired) + </obsolete> <owner>jamwalla@chromium.org</owner> <summary> Records whether the historyUrl parameter to loadDataWithBaseUrl is empty/ @@ -2913,7 +2925,7 @@ </histogram> <histogram name="AndroidSms.EffectivePWAInstallationSuccess" - enum="BooleanSuccess" expires_after="2021-02-02"> + enum="BooleanSuccess" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>jonmann@chromium.org</owner> <owner>better-together-dev@google.com</owner> @@ -2926,7 +2938,7 @@ </histogram> <histogram name="AndroidSms.FcmMessageDispatchFailure" - enum="AndroidSmsFcmMessageType" expires_after="2021-06-06"> + enum="AndroidSmsFcmMessageType" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -2937,7 +2949,7 @@ </histogram> <histogram name="AndroidSms.FcmMessageDispatchRetry" - enum="AndroidSmsFcmMessageType" expires_after="2021-05-16"> + enum="AndroidSmsFcmMessageType" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -2948,7 +2960,7 @@ </histogram> <histogram name="AndroidSms.FcmMessageDispatchSuccess" - enum="AndroidSmsFcmMessageType" expires_after="2021-06-06"> + enum="AndroidSmsFcmMessageType" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -2959,7 +2971,7 @@ </histogram> <histogram name="AndroidSms.MultiDeviceFeatureState" - enum="MultiDevice_FeatureState" expires_after="2021-06-06"> + enum="MultiDevice_FeatureState" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -2970,7 +2982,7 @@ </histogram> <histogram name="AndroidSms.NumAttemptsForSuccessfulInstallation" - units="attempts" expires_after="2021-05-02"> + units="attempts" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>jonmann@chromium.org</owner> <owner>better-together-dev@google.com</owner> @@ -2981,7 +2993,7 @@ </histogram> <histogram name="AndroidSms.PWAInstallationResult" - enum="WebAppInstallResultCode" expires_after="2021-04-04"> + enum="WebAppInstallResultCode" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -2992,7 +3004,7 @@ </histogram> <histogram name="AndroidSms.PWAUninstallationResult" enum="BooleanSuccess" - expires_after="2021-02-02"> + expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -3003,7 +3015,7 @@ </histogram> <histogram name="AndroidSms.ServiceWorkerLifetime" units="ms" - expires_after="2021-02-02"> + expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -3013,7 +3025,7 @@ </histogram> <histogram name="AndroidSms.ServiceWorkerMessageDispatchStatus" - enum="BooleanSuccess" expires_after="2021-02-02"> + enum="BooleanSuccess" expires_after="2022-02-02"> <owner>azeemarshad@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/blink/histograms.xml b/tools/metrics/histograms/histograms_xml/blink/histograms.xml index f37e5e3..784c786 100644 --- a/tools/metrics/histograms/histograms_xml/blink/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/blink/histograms.xml
@@ -2059,6 +2059,25 @@ </summary> </histogram> +<histogram name="Blink.UpdateViewportIntersection.UpdateTime" + units="microseconds" expires_after="2021-03-21"> +<!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> + +<!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> + +<!-- Name completed by histogram_suffixes name="BlinkUpdateTimeAggregatedSuffixes" --> + + <owner>schenney@chromium.org</owner> + <owner>paint-dev@chromium.org</owner> + <summary> + Time spent computing geometry information about iframes from the perspective + of their embedding document. This time is also included in the + Blink.IntersectionObservation.UpdateTime metric. + + This histogram only records metrics on machines with high-resolution clocks. + </summary> +</histogram> + <histogram name="Blink.UseCounter.AnimatedCSSProperties" enum="MappedCSSProperties" expires_after="never"> <!-- expires-never: used by Chrome Platform Status dashboard -->
diff --git a/tools/metrics/histograms/histograms_xml/bluetooth/histograms.xml b/tools/metrics/histograms/histograms_xml/bluetooth/histograms.xml index 35efe536e..c3611e7 100644 --- a/tools/metrics/histograms/histograms_xml/bluetooth/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/bluetooth/histograms.xml
@@ -215,6 +215,17 @@ </summary> </histogram> +<histogram name="Bluetooth.Linux.ConnectToServiceInsecurelyResult" + enum="BluetoothAdapterConnectToServiceInsecurelyResult" + expires_after="2022-01-01"> + <owner>alainm@chromium.org</owner> + <owner>nearby-share-chromeos-eng@google.com</owner> + <summary> + Result of attempting a call to mojom::Adapter::ConnectToServiceInsecurely(). + Emitted when function completes. + </summary> +</histogram> + <histogram base="true" name="Bluetooth.MacOS.Errors" enum="MacOSBluetoothOperationsResult" expires_after="2021-01-31"> <!-- Name completed by histogram_suffixes name="WebBluetoothMacOSAPIs" -->
diff --git a/tools/metrics/histograms/histograms_xml/gpu/histograms.xml b/tools/metrics/histograms/histograms_xml/gpu/histograms.xml index 8399607..e696a5f 100644 --- a/tools/metrics/histograms/histograms_xml/gpu/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/gpu/histograms.xml
@@ -22,8 +22,9 @@ <histograms> <histogram name="GPU.AcceleratedSurfaceRefreshRate" units="hz" - expires_after="M85"> + expires_after="M90"> <owner>vmiura@chromium.org</owner> + <owner>graphics-dev@chromium.org</owner> <summary> Refresh rate of the display in Hz. This is recorded every time we present a frame.
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml index b7b66e30..c66e24a 100644 --- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -1087,6 +1087,9 @@ </histogram_suffixes> <histogram_suffixes name="AsyncDNSPref" separator="_"> + <obsolete> + All histograms removed unknown date before 2021-01. + </obsolete> <suffix name="Disabled" label=""/> <suffix name="Enabled" label=""/> <affected-histogram name="AsyncDNS.PrefDefaultSource"/> @@ -2007,6 +2010,7 @@ <affected-histogram name="Blink.ScrollingCoordinator.UpdateTime"/> <affected-histogram name="Blink.Style.UpdateTime"/> <affected-histogram name="Blink.StyleAndLayout.UpdateTime"/> + <affected-histogram name="Blink.UpdateViewportIntersection.UpdateTime"/> <affected-histogram name="Blink.WaitForCommit.UpdateTime"/> </histogram_suffixes> @@ -2034,6 +2038,7 @@ <affected-histogram name="Blink.ScrollingCoordinator.UpdateTime"/> <affected-histogram name="Blink.Style.UpdateTime"/> <affected-histogram name="Blink.StyleAndLayout.UpdateTime"/> + <affected-histogram name="Blink.UpdateViewportIntersection.UpdateTime"/> <affected-histogram name="Blink.WaitForCommit.UpdateTime"/> </histogram_suffixes> @@ -2061,6 +2066,7 @@ <affected-histogram name="Blink.ScrollingCoordinator.UpdateTime"/> <affected-histogram name="Blink.Style.UpdateTime"/> <affected-histogram name="Blink.StyleAndLayout.UpdateTime"/> + <affected-histogram name="Blink.UpdateViewportIntersection.UpdateTime"/> <affected-histogram name="Blink.WaitForCommit.UpdateTime"/> </histogram_suffixes> @@ -16018,6 +16024,7 @@ <affected-histogram name="SafeBrowsing.RT.IsLookupSuccessful"/> <affected-histogram name="SafeBrowsing.RT.Network.Result"/> <affected-histogram name="SafeBrowsing.RT.Network.Time"/> + <affected-histogram name="SafeBrowsing.RT.Request.Size"/> <affected-histogram name="SafeBrowsing.RT.Request.UserPopulation"/> <affected-histogram name="SafeBrowsing.RT.ThreatInfoSize"/> </histogram_suffixes>
diff --git a/tools/metrics/histograms/histograms_xml/history/histograms.xml b/tools/metrics/histograms/histograms_xml/history/histograms.xml index 525db1c..4b1679d4a 100644 --- a/tools/metrics/histograms/histograms_xml/history/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/history/histograms.xml
@@ -170,7 +170,7 @@ </histogram> <histogram name="History.ClearBrowsingData.FailedTasksChrome" - enum="ChromeBrowsingDataRemoverTasks" expires_after="2021-02-01"> + enum="ChromeBrowsingDataRemoverTasks" expires_after="2021-04-01"> <owner>dullweber@chromium.org</owner> <owner>msramek@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/media/histograms.xml b/tools/metrics/histograms/histograms_xml/media/histograms.xml index 18c3da7a..b743ca7e 100644 --- a/tools/metrics/histograms/histograms_xml/media/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/media/histograms.xml
@@ -1996,7 +1996,7 @@ </histogram> <histogram name="Media.GpuMemoryBufferVideoFramePool.UnsupportedFormat" - enum="VideoPixelFormatUnion" expires_after="M82"> + enum="VideoPixelFormatUnion" expires_after="2022-01-06"> <owner>dcastagna@chromium.org</owner> <owner>mcasas@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/multi_device/histograms.xml b/tools/metrics/histograms/histograms_xml/multi_device/histograms.xml index 26634e90..0ef57b8a 100644 --- a/tools/metrics/histograms/histograms_xml/multi_device/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/multi_device/histograms.xml
@@ -274,6 +274,21 @@ </summary> </histogram> +<histogram name="MultiDevice.SecureChannel.Nearby.DisconnectionReason" + enum="MultiDeviceNearbyDisconnectionReason" expires_after="2022-01-01"> + <owner>khorimoto@chromium.org</owner> + <owner>better-together-dev@google.com</owner> + <summary> + Tracks reasons why a Nearby Connection established via SecureChannel ends up + disconnecting. Includes a "Disconnection requested by client" + value emitted during intentional disconnections as well as several error + enum values. + + Emitted when a connection fails to become established, or emitted after it + is already established when it becomes disconnected. + </summary> +</histogram> + <histogram name="MultiDevice.SecureChannel.Nearby.EffectiveConnectionResult" enum="BooleanSuccess" expires_after="2021-11-30"> <owner>khorimoto@chromium.org</owner> @@ -301,6 +316,27 @@ </summary> </histogram> +<histogram name="MultiDevice.SecureChannel.Nearby.OperationResult.{Function}" + enum="NearbyConnectionsStatus" expires_after="2022-01-01"> + <owner>khorimoto@chromium.org</owner> + <owner>better-together-dev@google.com</owner> + <summary> + Records the result of invoking Nearby Connection's {Function} API function + within SecureChannel. + + Emitted when the API call returns. + </summary> + <token key="Function"> + <variant name="AcceptConnection"/> + <variant name="DisconnectFromEndpoint"/> + <variant name="InjectEndpoint"/> + <variant name="RequestConnection"/> + <variant name="SendPayload"/> + <variant name="StartDiscovery"/> + <variant name="StopDiscovery"/> + </token> +</histogram> + <histogram name="MultiDevice.SecureChannel.Nearby.SendMessageResult" enum="BooleanSuccess" expires_after="2021-11-30"> <owner>khorimoto@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/network/histograms.xml b/tools/metrics/histograms/histograms_xml/network/histograms.xml index 7ee4bdc..6ed2cb9 100644 --- a/tools/metrics/histograms/histograms_xml/network/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/network/histograms.xml
@@ -2050,6 +2050,18 @@ </summary> </histogram> +<histogram name="Network.Wifi.Synced.ZeroNetworksEligibleForSync.Reason" + enum="NetworkEligibilityStatus" expires_after="2021-11-01"> + <owner>cvandermerwe@google.com</owner> + <owner>jonmann@chromium.org</owner> + <owner>better-together-dev@google.com</owner> + <summary> + Chrome OS metric logged for users who have the feature enabled but have zero + networks eligible for sync. Tracks the reasons why none of the networks are + eligible. + </summary> +</histogram> + <histogram name="NetworkService.ConcerningRequestHeader.AddedOnRedirect" enum="ConcerningHeaderPresent" expires_after="2019-11-01"> <owner>mmenke@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml index 29590f4..afac0ce9 100644 --- a/tools/metrics/histograms/histograms_xml/others/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -817,6 +817,9 @@ <histogram name="AsyncDNS.ConfigChange" enum="BooleanSuccess" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -826,6 +829,9 @@ </histogram> <histogram name="AsyncDNS.ConfigNotifyInterval" units="ms" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -834,6 +840,9 @@ </histogram> <histogram name="AsyncDNS.ConfigParseDuration" units="ms" expires_after="M81"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary>Duration of time spent parsing DnsConfig.</summary> @@ -841,6 +850,9 @@ <histogram name="AsyncDNS.ConfigParsePosix" enum="AsyncDNSConfigParsePosix" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -850,6 +862,9 @@ <histogram name="AsyncDNS.ConfigParseWin" enum="AsyncDNSConfigParseWin" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -859,6 +874,9 @@ <histogram name="AsyncDNS.HostParseResult" enum="BooleanSuccess" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary>Whether DnsHosts were parsed successfully.</summary> @@ -866,6 +884,9 @@ <histogram name="AsyncDNS.HostsChange" enum="BooleanSuccess" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -875,6 +896,9 @@ </histogram> <histogram name="AsyncDNS.HostsNotifyInterval" units="ms" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -883,6 +907,9 @@ </histogram> <histogram name="AsyncDNS.HostsParseDuration" units="ms" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary>Duration of time spent parsing DnsHosts.</summary> @@ -890,6 +917,9 @@ <histogram name="AsyncDNS.HostsParseWin" enum="AsyncDNSHostsParseWin" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -898,6 +928,9 @@ </histogram> <histogram name="AsyncDNS.ServerCount" units="units" expires_after="2021-03-21"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -908,6 +941,9 @@ <histogram name="AsyncDNS.UnchangedConfigInterval" units="ms" expires_after="M77"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -918,6 +954,9 @@ <histogram name="AsyncDNS.UnchangedHostsInterval" units="ms" expires_after="2021-01-31"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>ericorth@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -928,6 +967,9 @@ <histogram name="AsyncDNS.WatchStatus" enum="AsyncDNSWatchStatus" expires_after="2021-01-31"> + <obsolete> + Removed 2021-01. + </obsolete> <owner>ericorth@chromium.org</owner> <owner>src/net/OWNERS</owner> <summary> @@ -1251,6 +1293,53 @@ </summary> </histogram> +<histogram name="BlueZ.AdvertisementMonitor.NumOfMonitors" units="count" + expires_after="2021-12-28"> + <owner>apusaka@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> + <summary> + This is specific to Chrome OS. Records the number of active advertisement + monitors every couple of minutes. This helps us to gauge the additional + power requirement for the advertisement monitor feature. + </summary> +</histogram> + +<histogram name="BlueZ.AdvertisementMonitor.{Filter}.FilterPatternsPerMinute" + units="count" expires_after="2021-12-28"> + <owner>apusaka@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> + <summary> + This is specific to Chrome OS. Records the number of advertisement packet + received in the user space while the advertisement monitor is done using + {Filter} filtering. This helps us to gauge the additional power requirement + for the advertisement monitor feature. + </summary> + <token key="Filter"> + <variant name="MSFT"/> + <variant name="SW"/> + </token> +</histogram> + +<histogram name="BlueZ.AdvertisementMonitor.{Filter}.{Operation}.Result" + enum="BlueZResultOfAdvertisementMonitor" expires_after="2021-12-28"> + <owner>apusaka@chromium.org</owner> + <owner>chromeos-bt-platform-sw-core@google.com</owner> + <summary> + This is specific to Chrome OS. Records the outcome of {Operation} operation + of advertisement monitor when {Filter} filtering is used. This helps us to + verify the correctness of this feature as well as to point out possible + regression. + </summary> + <token key="Filter"> + <variant name="MSFT"/> + <variant name="SW"/> + </token> + <token key="Operation"> + <variant name="Add"/> + <variant name="Remove"/> + </token> +</histogram> + <histogram name="BlueZ.ChipLost2" units="seconds" expires_after="2021-05-16"> <owner>sonnysasaka@chromium.org</owner> <summary> @@ -4628,7 +4717,7 @@ </histogram> <histogram name="EasyUnlock.AuthEvent.DidUserManuallyUnlockPhone" - enum="EasyUnlockDidUserManuallyUnlockPhone" expires_after="2021-02-02"> + enum="EasyUnlockDidUserManuallyUnlockPhone" expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4640,7 +4729,7 @@ </histogram> <histogram name="EasyUnlock.AuthEvent.SignIn" enum="EasyUnlockAuthEvent" - expires_after="2021-06-06"> + expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4652,7 +4741,7 @@ </histogram> <histogram name="EasyUnlock.AuthEvent.SignIn.Duration" units="ms" - expires_after="2021-02-02"> + expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4662,7 +4751,7 @@ </histogram> <histogram name="EasyUnlock.AuthEvent.Unlock" enum="EasyUnlockAuthEvent" - expires_after="2021-06-06"> + expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4674,7 +4763,7 @@ </histogram> <histogram name="EasyUnlock.AuthEvent.Unlock.Duration" units="ms" - expires_after="2021-04-04"> + expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4686,7 +4775,7 @@ </histogram> <histogram name="EasyUnlock.AuthProximity.RemoteDeviceModelHash" - enum="EasyUnlockDeviceModelHash" expires_after="2021-02-02"> + enum="EasyUnlockDeviceModelHash" expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4700,7 +4789,7 @@ </histogram> <histogram name="EasyUnlock.AuthProximity.RollingRssi" units="dBm" - expires_after="2021-02-02"> + expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4721,7 +4810,7 @@ </histogram> <histogram name="EasyUnlock.RemoteLockScreenState" - enum="EasyUnlockRemoteLockScreenState" expires_after="2021-02-02"> + enum="EasyUnlockRemoteLockScreenState" expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -4735,7 +4824,7 @@ </histogram> <histogram name="EasyUnlock.StartupTimeFromSuspend" units="ms" - expires_after="2021-02-02"> + expires_after="2022-02-02"> <owner>hansberry@chromium.org</owner> <owner>better-together-dev@google.com</owner> <summary> @@ -6746,7 +6835,10 @@ </histogram> <histogram name="ImportantFile.DeleteOnCloseError" enum="PlatformFileError" - expires_after="2021-01-19"> + expires_after="M89"> + <obsolete> + Removed in M89. + </obsolete> <owner>grt@chromium.org</owner> <owner>xaerox@yandex-team.ru</owner> <summary> @@ -17544,6 +17636,18 @@ <summary>Records the result of shortcut creation for PWA.</summary> </histogram> +<histogram name="WebApp.Shortcuts.Deletion.Success" enum="BooleanSuccess" + expires_after="M93"> + <owner>phillis@chromium.org</owner> + <owner>dmurph@chromium.org</owner> + <owner>sunggch@microsoft.com</owner> + <summary> + Records the result of shortcut deletion for a PWA. This occurs when an + installed PWA is uninstalled, which can be triggered by user, policy admin, + or sync system depending on the situation. + </summary> +</histogram> + <histogram name="Webapp.SyncInitiatedUninstallResult" enum="BooleanSuccess" expires_after="2022-01-01"> <owner>alancutter@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/platform/histograms.xml b/tools/metrics/histograms/histograms_xml/platform/histograms.xml index c4ffb88..31dc28d 100644 --- a/tools/metrics/histograms/histograms_xml/platform/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/platform/histograms.xml
@@ -1236,6 +1236,21 @@ <summary>Records occurrences of legacy U2F commands sent to cr50.</summary> </histogram> +<histogram name="Platform.UnaggregatedUsageTime" units="seconds" + expires_after="2022-01-08"> + <owner>mutexlox@chromium.org</owner> + <owner>iby@chromium.org</owner> + <owner>cros-telemetry@google.com</owner> + <summary> + Use time (device ON and not asleep) in a particular period (approximately + every five minutes). To compute usage time in a given period (e.g. a day), + sum up all reported values of this metric for that period (day). As with + other UMA metrics on CrOS, this will be uploaded roughly every half-hour. + This will eventually supercede Platform.DailyUseTime, which has significant + limitations (e.g. it may not report on the right day). + </summary> +</histogram> + <histogram name="Platform.UncleanShutdownsDaily" units="count per day" expires_after="never"> <!-- expires-never: Used to assess Chrome OS platform stability. -->
diff --git a/tools/metrics/histograms/histograms_xml/profile/histograms.xml b/tools/metrics/histograms/histograms_xml/profile/histograms.xml index fa0b66d4..a26f13ec 100644 --- a/tools/metrics/histograms/histograms_xml/profile/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/profile/histograms.xml
@@ -248,6 +248,17 @@ </summary> </histogram> +<histogram name="Profile.KeepAliveLeakAtShutdown" enum="ProfileKeepAliveOrigin" + expires_after="2021-06-01"> + <owner>nicolaso@chromium.org</owner> + <owner>cbe-eng@google.com</owner> + <summary> + Recorded during BrowserProcess teardown. Indicates that a Profile still has + ScopedProfileKeepAlive objects referencing it, of the given origin. This is + a sign of a bug, or incorrect usage of the ScopedProfileKeepAlive API. + </summary> +</histogram> + <histogram name="Profile.Menu.ClickedActionableItem" enum="ProfileMenuActionableItem" expires_after="2021-06-30"> <owner>droger@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml b/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml index 231a8ef..6af3684 100644 --- a/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml
@@ -1028,6 +1028,16 @@ </summary> </histogram> +<histogram name="SafeBrowsing.RT.Request.Size" units="bytes" + expires_after="2022-01-08"> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + The size of a real time URL check request in bytes. Logged on each resource + check for which a lookup request is sent to the server. + </summary> +</histogram> + <histogram name="SafeBrowsing.RT.Request.UserPopulation" enum="SafeBrowsingUserPopulation" expires_after="2021-05-11"> <owner>xinghuilu@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/scanning/histograms.xml b/tools/metrics/histograms/histograms_xml/scanning/histograms.xml index 26ae58a2..eac8ed7 100644 --- a/tools/metrics/histograms/histograms_xml/scanning/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/scanning/histograms.xml
@@ -63,6 +63,14 @@ </summary> </histogram> +<histogram name="Scanning.ScanJobFailureReason" enum="ScanJobFailureReason" + expires_after="2021-12-04"> + <owner>gavinwill@chromium.org</owner> + <owner>jschettler@chromium.org</owner> + <owner>cros-peripherals@google.com</owner> + <summary>Records the reason a scan job failed.</summary> +</histogram> + <histogram name="Scanning.ScanJobSuccessful" enum="Boolean" expires_after="2021-12-04"> <owner>gavinwill@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index b371e75..3e9044e3 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@ { "trace_processor_shell": { "win": { - "hash": "e966ca8bd8894222cc224f0256aa5b32aef94669", - "remote_path": "perfetto_binaries/trace_processor_shell/win/070ef598892aee3d5cfb628f577867217c863142/trace_processor_shell.exe" + "hash": "1b175a93430138b7855ceeb6eb8516c7e66c3684", + "remote_path": "perfetto_binaries/trace_processor_shell/win/35f78f4a4562f61cde3b096492628e1d47acb04e/trace_processor_shell.exe" }, "mac": { - "hash": "e714905178b25795c55a9468c15a3aa0a4038d47", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/070ef598892aee3d5cfb628f577867217c863142/trace_processor_shell" + "hash": "ad7587bcfdd72883c1e1b1596ddec4f81bbf7736", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/35f78f4a4562f61cde3b096492628e1d47acb04e/trace_processor_shell" }, "linux": { - "hash": "153bdd7d922d3d225b8c2855de063cf00ff59efa", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/070ef598892aee3d5cfb628f577867217c863142/trace_processor_shell" + "hash": "4910c2bfbdf2ab1a735e227bb0d279ccdad8d311", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/35f78f4a4562f61cde3b096492628e1d47acb04e/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/measurements/dual_metric_measurement.py b/tools/perf/measurements/dual_metric_measurement.py index 972cce3..06ed832b6 100644 --- a/tools/perf/measurements/dual_metric_measurement.py +++ b/tools/perf/measurements/dual_metric_measurement.py
@@ -22,7 +22,9 @@ else: self._enable_tracing = False - def WillRunStory(self, platform): + # pylint: disable=arguments-differ + # pylint: disable=unused-argument + def WillRunStory(self, platform, story=None): if self._enable_tracing: self._tbm_test.WillRunStory(platform)
diff --git a/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js b/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js index 01fcc5b..884d376 100644 --- a/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js +++ b/ui/accessibility/extensions/chromevoxclassic/testing/chromevox_unittest_base.js
@@ -10,7 +10,9 @@ '//chrome/browser/resources/chromeos/accessibility/chromevox/testing/' + 'common.js', '//chrome/browser/resources/chromeos/accessibility/common/testing/' + - 'callback_helper.js' + 'callback_helper.js', + '//chrome/browser/resources/chromeos/accessibility/common/testing/' + + 'common.js' ]); /**
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index fa6f3c8..65c930f4 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -147,6 +147,7 @@ "java/res/color/chip_stroke_color.xml", "java/res/color/chip_text_color.xml", "java/res/color/chip_text_color_secondary.xml", + "java/res/color/default_text_color_hint_list.xml", "java/res/color/default_text_color_inverse_list.xml", "java/res/color/default_text_color_light_list.xml", "java/res/color/default_text_color_list.xml",
diff --git a/ui/android/java/res/color/default_text_color_hint_list.xml b/ui/android/java/res/color/default_text_color_hint_list.xml new file mode 100644 index 0000000..d38c58d --- /dev/null +++ b/ui/android/java/res/color/default_text_color_hint_list.xml
@@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2021 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@color/default_text_color_disabled" android:state_enabled="false"/> + <item android:color="@color/default_text_color_secondary" /> +</selector> \ No newline at end of file
diff --git a/ui/aura/client/aura_constants.cc b/ui/aura/client/aura_constants.cc index ca98973..ac74052 100644 --- a/ui/aura/client/aura_constants.cc +++ b/ui/aura/client/aura_constants.cc
@@ -49,9 +49,6 @@ DEFINE_UI_CLASS_PROPERTY_KEY(bool, kConstrainedWindowKey, false) DEFINE_UI_CLASS_PROPERTY_KEY(bool, kCreatedByUserGesture, false) DEFINE_UI_CLASS_PROPERTY_KEY(bool, kDrawAttentionKey, false) -DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Rect, - kEmbeddedWindowEnsureNotInRect, - nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(FocusClient*, kFocusClientKey, nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kHostWindowKey, nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(Window*, kChildModalParentKey, nullptr)
diff --git a/ui/aura/client/aura_constants.h b/ui/aura/client/aura_constants.h index bb97f9b..ac15d1b 100644 --- a/ui/aura/client/aura_constants.h +++ b/ui/aura/client/aura_constants.h
@@ -18,7 +18,7 @@ namespace mojom { enum class WindowType; } -} +} // namespace ws namespace aura { namespace client { @@ -84,12 +84,6 @@ // attention. AURA_EXPORT extern const WindowProperty<bool>* const kDrawAttentionKey; -// A property key to store a bounds in screen coordinates that an embedded -// window wants to be moved out of. This is only used in MUS to move the -// embedding top-level window at the other side. -AURA_EXPORT extern const WindowProperty<gfx::Rect*>* const - kEmbeddedWindowEnsureNotInRect; - // A property key to store the focus client on the window. AURA_EXPORT extern const WindowProperty<FocusClient*>* const kFocusClientKey;
diff --git a/ui/base/prediction/empty_predictor.cc b/ui/base/prediction/empty_predictor.cc index 9859880..c1cacb3 100644 --- a/ui/base/prediction/empty_predictor.cc +++ b/ui/base/prediction/empty_predictor.cc
@@ -30,7 +30,8 @@ } std::unique_ptr<InputPredictor::InputData> EmptyPredictor::GeneratePrediction( - base::TimeTicks predict_time) const { + base::TimeTicks predict_time, + base::TimeDelta frame_interval) { if (!HasPrediction()) return nullptr; return std::make_unique<InputData>(last_input_.value());
diff --git a/ui/base/prediction/empty_predictor.h b/ui/base/prediction/empty_predictor.h index 408261b..ebb41b3 100644 --- a/ui/base/prediction/empty_predictor.h +++ b/ui/base/prediction/empty_predictor.h
@@ -30,7 +30,8 @@ // Returns the last_input_ for testing. std::unique_ptr<InputData> GeneratePrediction( - base::TimeTicks predict_time) const override; + base::TimeTicks predict_time, + base::TimeDelta frame_interval) override; // Returns kTimeInterval for testing. base::TimeDelta TimeInterval() const override;
diff --git a/ui/base/prediction/input_predictor.h b/ui/base/prediction/input_predictor.h index 50b8a9c2..a77491a 100644 --- a/ui/base/prediction/input_predictor.h +++ b/ui/base/prediction/input_predictor.h
@@ -47,8 +47,12 @@ virtual bool HasPrediction() const = 0; // Generate the prediction based on current points. + // It can use a latency based on the vsync refresh rate: `frame_interval`. + // TODO(crbug.com/1142061): Remove the `frame_interval` arg if the expriment + // concludes that a frame-dependent latency isn't better. virtual std::unique_ptr<InputData> GeneratePrediction( - base::TimeTicks predict_time) const = 0; + base::TimeTicks predict_time, + base::TimeDelta frame_interval = base::TimeDelta::FromSeconds(0)) = 0; // Returns the maximum of prediction available for resampling // before having side effects (jitter, wrong orientation, etc..)
diff --git a/ui/base/prediction/input_predictor_unittest_helpers.h b/ui/base/prediction/input_predictor_unittest_helpers.h index db2dadfa..2ce8fef4 100644 --- a/ui/base/prediction/input_predictor_unittest_helpers.h +++ b/ui/base/prediction/input_predictor_unittest_helpers.h
@@ -21,9 +21,9 @@ InputPredictorTest(); ~InputPredictorTest() override; - static base::TimeTicks FromMilliseconds(int64_t ms) { + static base::TimeTicks FromMilliseconds(double ms) { return test::PredictionUnittestHelpers::GetStaticTimeStampForTests() + - base::TimeDelta::FromMilliseconds(ms); + base::TimeDelta::FromMillisecondsD(ms); } void ValidatePredictor(const std::vector<double>& x,
diff --git a/ui/base/prediction/kalman_predictor.cc b/ui/base/prediction/kalman_predictor.cc index df359f5d..2678cfe6 100644 --- a/ui/base/prediction/kalman_predictor.cc +++ b/ui/base/prediction/kalman_predictor.cc
@@ -71,7 +71,8 @@ } std::unique_ptr<InputPredictor::InputData> KalmanPredictor::GeneratePrediction( - base::TimeTicks predict_time) const { + base::TimeTicks predict_time, + base::TimeDelta frame_interval) { if (!HasPrediction()) return nullptr;
diff --git a/ui/base/prediction/kalman_predictor.h b/ui/base/prediction/kalman_predictor.h index 89d7b466b2..a748a1d 100644 --- a/ui/base/prediction/kalman_predictor.h +++ b/ui/base/prediction/kalman_predictor.h
@@ -48,7 +48,8 @@ // Generate the prediction based on stored points and given time_stamp. // Return false if no prediction available. std::unique_ptr<InputData> GeneratePrediction( - base::TimeTicks predict_time) const override; + base::TimeTicks predict_time, + base::TimeDelta frame_interval) override; // Return the filtered value of time intervals. base::TimeDelta TimeInterval() const override;
diff --git a/ui/base/prediction/least_squares_predictor.cc b/ui/base/prediction/least_squares_predictor.cc index ab3c37c..ef3085b 100644 --- a/ui/base/prediction/least_squares_predictor.cc +++ b/ui/base/prediction/least_squares_predictor.cc
@@ -82,7 +82,8 @@ } std::unique_ptr<InputPredictor::InputData> -LeastSquaresPredictor::GeneratePrediction(base::TimeTicks predict_time) const { +LeastSquaresPredictor::GeneratePrediction(base::TimeTicks predict_time, + base::TimeDelta frame_interval) { if (!HasPrediction()) return nullptr;
diff --git a/ui/base/prediction/least_squares_predictor.h b/ui/base/prediction/least_squares_predictor.h index 12b9f1c..a846012 100644 --- a/ui/base/prediction/least_squares_predictor.h +++ b/ui/base/prediction/least_squares_predictor.h
@@ -38,7 +38,8 @@ // Generate the prediction based on stored points and given time_stamp. // Return false if no prediction available. std::unique_ptr<InputData> GeneratePrediction( - base::TimeTicks predict_time) const override; + base::TimeTicks predict_time, + base::TimeDelta frame_interval) override; // Return the averaged value of time intervals. base::TimeDelta TimeInterval() const override;
diff --git a/ui/base/prediction/linear_predictor.cc b/ui/base/prediction/linear_predictor.cc index 9f85488..08a2ca5 100644 --- a/ui/base/prediction/linear_predictor.cc +++ b/ui/base/prediction/linear_predictor.cc
@@ -81,7 +81,8 @@ } std::unique_ptr<InputPredictor::InputData> LinearPredictor::GeneratePrediction( - base::TimeTicks predict_time) const { + base::TimeTicks predict_time, + base::TimeDelta frame_interval) { if (!HasPrediction()) return nullptr;
diff --git a/ui/base/prediction/linear_predictor.h b/ui/base/prediction/linear_predictor.h index 0f3bac5..96997350 100644 --- a/ui/base/prediction/linear_predictor.h +++ b/ui/base/prediction/linear_predictor.h
@@ -42,7 +42,8 @@ // Generate the prediction based on stored points and given time_stamp. // Return false if no prediction available. std::unique_ptr<InputData> GeneratePrediction( - base::TimeTicks predict_time) const override; + base::TimeTicks predict_time, + base::TimeDelta frame_interval) override; // Return the average time delta in the event queue. base::TimeDelta TimeInterval() const override;
diff --git a/ui/base/prediction/linear_resampling.cc b/ui/base/prediction/linear_resampling.cc index 850e99c..92bd5f07 100644 --- a/ui/base/prediction/linear_resampling.cc +++ b/ui/base/prediction/linear_resampling.cc
@@ -6,6 +6,8 @@ #include <algorithm> +#include <base/feature_list.h> +#include "base/strings/string_number_conversions.h" #include "ui/base/ui_base_features.h" namespace ui { @@ -22,7 +24,13 @@ // resampling either doing interpolation or extrapolating a closer future time // so that resampled result is more accurate and has less noise. This adds some // latency during resampling but a few ms should be fine. -constexpr auto kResampleLatency = base::TimeDelta::FromMilliseconds(5); +constexpr auto kResampleLatency = base::TimeDelta::FromMilliseconds(-5); +// The optimal prediction anticipation from experimentation: In the study +// https://bit.ly/3iyQf8V we found that, on a machine with VSync at 60Hz, adding +// 1/2 * frame_interval (on top of kResampleLatency) minimizes the Lag on touch +// scrolling. + 1/2 * (1/60) - 5ms = 3.3ms. +constexpr auto kResampleLatencyExperimental = + base::TimeDelta::FromMillisecondsD(3.3); // Get position at |sample_time| by linear interpolate/extrapolate a and b. inline gfx::PointF lerp(const InputPredictor::InputData& a, @@ -71,11 +79,14 @@ } std::unique_ptr<InputPredictor::InputData> LinearResampling::GeneratePrediction( - base::TimeTicks frame_time) const { + base::TimeTicks frame_time, + base::TimeDelta frame_interval) { if (!HasPrediction()) return nullptr; - base::TimeTicks sample_time = frame_time - kResampleLatency; + base::TimeDelta resample_latency = + latency_calculator_.GetResampleLatency(frame_interval); + base::TimeTicks sample_time = frame_time + resample_latency; base::TimeDelta max_prediction = std::min(kResampleMaxPrediction, events_dt_ / 2.0); @@ -94,4 +105,37 @@ return kTimeInterval; } +base::TimeDelta LinearResampling::LatencyCalculator::GetResampleLatency( + base::TimeDelta frame_interval) { + // Cache |resample_latency_| and recalculate only when |frame_interval| + // changes. + if (frame_interval != frame_interval_ || resample_latency_.is_zero()) { + frame_interval_ = frame_interval; + resample_latency_ = CalculateLatency(); + } + return resample_latency_; +} + +base::TimeDelta LinearResampling::LatencyCalculator::CalculateLatency() { + std::string prediction_type = GetFieldTrialParamValueByFeature( + ::features::kResamplingScrollEventsExperimentalPrediction, "mode"); + + if (prediction_type != ::features::kPredictionTypeTimeBased && + prediction_type != ::features::kPredictionTypeFramesBased) + return kResampleLatency; + + std::string latency_value = GetFieldTrialParamValueByFeature( + ::features::kResamplingScrollEventsExperimentalPrediction, "latency"); + double latency; + if (base::StringToDouble(latency_value, &latency)) { + return prediction_type == ::features::kPredictionTypeTimeBased + ? base::TimeDelta::FromMillisecondsD(latency) + : latency * frame_interval_ + kResampleLatency; + } + + return prediction_type == ::features::kPredictionTypeTimeBased + ? kResampleLatencyExperimental + : 0.5 * frame_interval_ + kResampleLatency; +} + } // namespace ui
diff --git a/ui/base/prediction/linear_resampling.h b/ui/base/prediction/linear_resampling.h index 4e44d44d..c100a754 100644 --- a/ui/base/prediction/linear_resampling.h +++ b/ui/base/prediction/linear_resampling.h
@@ -38,12 +38,24 @@ // Generate the prediction based on stored points and given frame_time. // Return false if no prediction available. std::unique_ptr<InputData> GeneratePrediction( - base::TimeTicks frame_time) const override; + base::TimeTicks frame_time, + base::TimeDelta frame_interval) override; // Return the average time delta in the event queue. base::TimeDelta TimeInterval() const override; private: + // Class to cache the Resample Latency to avoid its recalculation each frame. + class LatencyCalculator { + public: + base::TimeDelta GetResampleLatency(base::TimeDelta frame_interval); + + private: + base::TimeDelta CalculateLatency(); + base::TimeDelta resample_latency_; + base::TimeDelta frame_interval_; + }; + static constexpr size_t kNumEventsForResampling = 2; // Store the last events received @@ -52,6 +64,8 @@ // Store the current delta time between the last 2 events base::TimeDelta events_dt_; + LatencyCalculator latency_calculator_; + DISALLOW_COPY_AND_ASSIGN(LinearResampling); };
diff --git a/ui/base/prediction/linear_resampling_unittest.cc b/ui/base/prediction/linear_resampling_unittest.cc index 9ae3bda..9ab31aa8 100644 --- a/ui/base/prediction/linear_resampling_unittest.cc +++ b/ui/base/prediction/linear_resampling_unittest.cc
@@ -4,6 +4,7 @@ #include "ui/base/prediction/linear_resampling.h" +#include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/prediction/input_predictor_unittest_helpers.h" #include "ui/base/ui_base_features.h" @@ -17,6 +18,51 @@ void SetUp() override { predictor_ = std::make_unique<LinearResampling>(); } + void ValidatePredictorFrameBased( + const std::vector<double>& events_x, + const std::vector<double>& events_y, + const std::vector<double>& events_time_ms, + const std::vector<double>& prediction_time_ms, + const std::vector<double>& predicted_x, + const std::vector<double>& predicted_y, + const double vsync_frequency) { + // LinearResampling* predictor = + // dynamic_cast<LinearResampling*>(predictor_.get()); + base::TimeDelta frame_interval = + base::TimeDelta::FromSecondsD(1.0f / vsync_frequency); + + predictor_->Reset(); + std::vector<double> computed_x; + std::vector<double> computed_y; + size_t current_prediction_index = 0; + for (size_t i = 0; i < events_time_ms.size(); i++) { + InputPredictor::InputData data = {gfx::PointF(events_x[i], events_y[i]), + FromMilliseconds(events_time_ms[i])}; + predictor_->Update(data); + + if (predictor_->HasPrediction()) { + auto result = predictor_->GeneratePrediction( + FromMilliseconds(prediction_time_ms[current_prediction_index]), + frame_interval); + EXPECT_TRUE(result); + computed_x.push_back(result->pos.x()); + computed_y.push_back(result->pos.y()); + EXPECT_GT(result->time_stamp, base::TimeTicks()); + current_prediction_index++; + } + } + + EXPECT_TRUE(computed_x.size() == predicted_x.size()); + if (computed_x.size() == predicted_x.size()) { + for (size_t i = 0; i < predicted_x.size(); i++) { + EXPECT_NEAR(computed_x[i], predicted_x[i], kEpsilon); + EXPECT_NEAR(computed_y[i], predicted_y[i], kEpsilon); + } + } + } + + base::test::ScopedFeatureList feature_list; + DISALLOW_COPY_AND_ASSIGN(LinearResamplingTest); }; @@ -119,5 +165,95 @@ base::TimeDelta::FromMilliseconds(t[1] - t[0])); } +// Tests resampling with the experimental latency if +3.3ms instead of +// the default -5ms. +TEST_F(LinearResamplingTest, ResamplingValueWithExperimentalLatencyTimeBased) { + base::FieldTrialParams params; + params["mode"] = ::features::kPredictionTypeTimeBased; + feature_list.Reset(); + feature_list.InitAndEnableFeatureWithParameters( + features::kResamplingScrollEventsExperimentalPrediction, params); + + std::vector<double> x = {10, 20, 30}; + std::vector<double> y = {5, 25, 35}; + std::vector<double> t = {15, 24, 32}; + + // Resample at `frame_time` = 24.7 ms, `sample_time` = 24.7+3.3 = 28ms. + // Resample at `frame_time` = 32.7 ms, `sample_time` = 32.7+3.3 = 36ms. + std::vector<double> pred_ts = {24.7, 32.7}; + std::vector<double> pred_x = {24.44, 35}; + std::vector<double> pred_y = {33.89, 40}; + ValidatePredictor(x, y, t, pred_ts, pred_x, pred_y); +} + +// Tests resampling with the experimental latency if +1ms (using switch) instead +// of the default -5ms. +TEST_F(LinearResamplingTest, + ResamplingValueWithExperimentalLatencyTimeBasedSwitch) { + base::FieldTrialParams params; + params["mode"] = ::features::kPredictionTypeTimeBased; + params["latency"] = "1.0"; + feature_list.Reset(); + feature_list.InitAndEnableFeatureWithParameters( + features::kResamplingScrollEventsExperimentalPrediction, params); + + std::vector<double> x = {10, 20, 30}; + std::vector<double> y = {5, 25, 35}; + std::vector<double> t = {15, 24, 32}; + + // Resample at `frame_time` = 27 ms, `sample_time` = 27+1 = 28ms. + // Resample at `frame_time` = 35 ms, `sample_time` = 35+1 = 36ms. + std::vector<double> pred_ts = {27, 35}; + std::vector<double> pred_x = {24.44, 35}; + std::vector<double> pred_y = {33.89, 40}; + ValidatePredictor(x, y, t, pred_ts, pred_x, pred_y); +} + +// Tests resampling with the experimental latency if +0.5*`frame_interval` +// instead of the default -5ms. +TEST_F(LinearResamplingTest, ResamplingValueWithExperimentalLatencyFrameBased) { + base::FieldTrialParams params; + params["mode"] = ::features::kPredictionTypeFramesBased; + feature_list.Reset(); + feature_list.InitAndEnableFeatureWithParameters( + features::kResamplingScrollEventsExperimentalPrediction, params); + + std::vector<double> x = {10, 20, 30}; + std::vector<double> y = {5, 25, 35}; + std::vector<double> t = {15, 24, 32}; + + // Using 100Hz frequency => `frame_interval` = 10ms + // Resample at `frame_time` = 33 ms, `sample_time` = 28-5+0.5*10 = 28ms. + // Resample at `frame_time` = 41 ms, `sample_time` = 36-5+0.5*10 = 36ms. + std::vector<double> pred_ts = {28, 36}; + std::vector<double> pred_x = {24.44, 35}; + std::vector<double> pred_y = {33.89, 40}; + ValidatePredictorFrameBased(x, y, t, pred_ts, pred_x, pred_y, 100); +} + +// Tests resampling with the experimental latency if +0.5*`frame_interval` +// (using switch) instead of the default -5ms. +TEST_F(LinearResamplingTest, + ResamplingValueWithExperimentalLatencyFrameBasedSwitch) { + base::FieldTrialParams params; + params["mode"] = ::features::kPredictionTypeFramesBased; + params["latency"] = "1.0"; + feature_list.Reset(); + feature_list.InitAndEnableFeatureWithParameters( + features::kResamplingScrollEventsExperimentalPrediction, params); + + std::vector<double> x = {10, 20, 30}; + std::vector<double> y = {5, 25, 35}; + std::vector<double> t = {15, 24, 32}; + + // Using 200Hz frequency => `frame_interval` = 5ms + // Resample at `frame_time` = 33 ms, `sample_time` = 28-5+1*5 = 28ms. + // Resample at `frame_time` = 41 ms, `sample_time` = 36-5+1*5 = 36ms. + std::vector<double> pred_ts = {28, 36}; + std::vector<double> pred_x = {24.44, 35}; + std::vector<double> pred_y = {33.89, 40}; + ValidatePredictorFrameBased(x, y, t, pred_ts, pred_x, pred_y, 200); +} + } // namespace test } // namespace ui
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc index 6b60c00..2d5847dd7 100644 --- a/ui/base/ui_base_features.cc +++ b/ui/base/ui_base_features.cc
@@ -253,6 +253,10 @@ return base::FeatureList::IsEnabled(kSynchronousPageFlipTesting); } +const base::Feature kResamplingScrollEventsExperimentalPrediction{ + "ResamplingScrollEventsExperimentalPrediction", + base::FEATURE_DISABLED_BY_DEFAULT}; + #if defined(USE_X11) || defined(USE_OZONE) const base::Feature kUseOzonePlatform { "UseOzonePlatform", @@ -292,6 +296,11 @@ const char kFilterNameEmpty[] = "empty_filter"; const char kFilterNameOneEuro[] = "one_euro_filter"; +const char kPredictionTypeTimeBased[] = "time"; +const char kPredictionTypeFramesBased[] = "frames"; +const char kPredictionTypeDefaultTime[] = "3.3"; +const char kPredictionTypeDefaultFramesRatio[] = "0.5"; + const base::Feature kSwipeToMoveCursor{"SwipeToMoveCursor", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h index 7166d0a..4eeda91 100644 --- a/ui/base/ui_base_features.h +++ b/ui/base/ui_base_features.h
@@ -138,6 +138,23 @@ extern const char kPredictorNameLinearResampling[]; COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictorNameEmpty[]; +// Enables resampling of scroll events using an experimental latency of +3.3ms +// instead of the original -5ms. +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const base::Feature kResamplingScrollEventsExperimentalPrediction; + +// The type of prediction used. TimeBased uses a fixed timing, FramesBased uses +// a ratio of the vsync refresh rate. The timing/ratio can be changed on the +// command line through a `latency` param. +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictionTypeTimeBased[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeFramesBased[]; +// The default values for `latency` +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeDefaultTime[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeDefaultFramesRatio[]; + // The type of filter to use for filtering events. These values are used as the // 'filter' feature param for |blink::features::kFilteringScrollPrediction|. COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kFilterNameEmpty[];
diff --git a/ui/display/fake/fake_display_delegate.cc b/ui/display/fake/fake_display_delegate.cc index c8f6251c..2932ce3 100644 --- a/ui/display/fake/fake_display_delegate.cc +++ b/ui/display/fake/fake_display_delegate.cc
@@ -132,9 +132,9 @@ void FakeDisplayDelegate::Configure( const std::vector<display::DisplayConfigurationParams>& config_requests, ConfigureCallback callback) { - base::flat_map<int64_t, bool> statuses; + bool config_success = true; for (const auto& config : config_requests) { - bool configure_success = false; + bool request_success = false; if (config.mode.has_value()) { // Find display snapshot of display ID. @@ -147,19 +147,20 @@ // Check that config mode is appropriate for the display snapshot. for (const auto& existing_mode : snapshot->get()->modes()) { if (AreModesEqual(*existing_mode.get(), *config.mode.value().get())) { - configure_success = true; + request_success = true; break; } } } } else { // This is a request to turn off the display. - configure_success = true; + request_success = true; } - statuses.insert(std::make_pair(config.id, configure_success)); + config_success &= request_success; } - configure_callbacks_.push(base::BindOnce(std::move(callback), statuses)); + configure_callbacks_.push( + base::BindOnce(std::move(callback), config_success)); // Start the timer if it's not already running. If there are multiple queued // configuration requests then ConfigureDone() will handle starting the
diff --git a/ui/display/manager/configure_displays_task.cc b/ui/display/manager/configure_displays_task.cc index fb78ce8..ac146c8 100644 --- a/ui/display/manager/configure_displays_task.cc +++ b/ui/display/manager/configure_displays_task.cc
@@ -113,15 +113,6 @@ return width_idx * base::size(kDisplayResolutionSamples) + height_idx + 1; } -std::__wrap_iter<const DisplayConfigureRequest*> GetRequestForDisplayId( - int64_t display_id, - const std::vector<DisplayConfigureRequest>& requests) { - return find_if(requests.begin(), requests.end(), - [display_id](const DisplayConfigureRequest& request) { - return request.display->display_id() == display_id; - }); -} - void UpdateResolutionAndRefreshRateUma(const DisplayConfigureRequest& request) { const bool internal = request.display->type() == DISPLAY_CONNECTION_TYPE_INTERNAL; @@ -236,55 +227,37 @@ std::move(callback_).Run(task_status_); } -void ConfigureDisplaysTask::OnConfigured( - const base::flat_map<int64_t, bool>& statuses) { - bool config_success = true; - // Check if all displays are successfully configured. - for (const auto& status : statuses) { - int64_t display_id = status.first; - bool display_success = status.second; - config_success &= display_success; +void ConfigureDisplaysTask::OnConfigured(bool config_success) { + bool should_reconfigure = false; - auto request = GetRequestForDisplayId(display_id, requests_); - DCHECK(request != requests_.end()); - - VLOG(2) << "Configured status=" << display_success - << " display=" << request->display->display_id() - << " origin=" << request->origin.ToString() - << " mode=" << (request->mode ? request->mode->ToString() : "null"); - - UpdateAttemptSucceededUma(request->display, display_success); - } - - // Update displays upon success or prep |requests_| for reconfiguration. - if (config_success) { - for (auto& request : requests_) { + for (auto& request : requests_) { + // Update displays upon success or prep |requests_| for reconfiguration. + if (config_success) { request.display->set_current_mode(request.mode); request.display->set_origin(request.origin); - } - } else { - bool should_reconfigure = false; - // For the failing config, check if there is another mode to be requested. - // If there is one, attempt to reconfigure everything again. - for (const auto& status : statuses) { - int64_t display_id = status.first; - bool display_success = status.second; - if (!display_success) { - const DisplayConfigureRequest* request = - GetRequestForDisplayId(display_id, requests_).base(); - const DisplayMode* next_mode = - FindNextMode(*request->display, request->mode); - if (next_mode) { - const_cast<DisplayConfigureRequest*>(request)->mode = next_mode; - should_reconfigure = true; - } + } else { + // For the failing config, check if there is another mode to be requested. + // If there is one, attempt to reconfigure everything again. + const DisplayMode* next_mode = + FindNextMode(*request.display, request.mode); + if (next_mode) { + request.mode = next_mode; + should_reconfigure = true; } } - if (should_reconfigure) { - task_status_ = PARTIAL_SUCCESS; - Run(); - return; - } + + VLOG(2) << "Configured status=" << config_success + << " display=" << request.display->display_id() + << " origin=" << request.origin.ToString() + << " mode=" << (request.mode ? request.mode->ToString() : "null"); + + UpdateAttemptSucceededUma(request.display, config_success); + } + + if (should_reconfigure) { + task_status_ = PARTIAL_SUCCESS; + Run(); + return; } // Update the final state.
diff --git a/ui/display/manager/configure_displays_task.h b/ui/display/manager/configure_displays_task.h index 2c09b932..1b878f5 100644 --- a/ui/display/manager/configure_displays_task.h +++ b/ui/display/manager/configure_displays_task.h
@@ -66,7 +66,7 @@ void OnDisplaySnapshotsInvalidated() override; private: - void OnConfigured(const base::flat_map<int64_t, bool>& statuses); + void OnConfigured(bool config_status); NativeDisplayDelegate* delegate_; // Not owned.
diff --git a/ui/display/manager/display_configurator_unittest.cc b/ui/display/manager/display_configurator_unittest.cc index 38dc5eb..bd393102 100644 --- a/ui/display/manager/display_configurator_unittest.cc +++ b/ui/display/manager/display_configurator_unittest.cc
@@ -1033,7 +1033,7 @@ // This test should attempt to configure a mirror mode that will not succeed // and should end up in extended mode. native_display_delegate_->set_max_configurable_pixels( - modes[3]->size().GetArea()); + modes[1]->size().GetArea()); state_controller_.set_state(MULTIPLE_DISPLAY_STATE_MULTI_MIRROR); UpdateOutputs(2, true); @@ -1046,17 +1046,32 @@ GetCrtcAction( {outputs_[1]->display_id(), gfx::Point(0, 0), modes[0].get()}) .c_str(), - // First mode tried is expected to fail and it will - // retry with the 4th mode in the list (for non-internal displays). + // First try is expected to fail and it will retry with the next + // largest mode in the list (for non-internal displays).since the + // internal display will always fail, the display configurator will + // attempt all of the external display's available modes before it + // gives up. GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), outputs_[0]->native_mode()}) .c_str(), GetCrtcAction( {outputs_[1]->display_id(), gfx::Point(0, 0), modes[3].get()}) .c_str(), + GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), + outputs_[0]->native_mode()}) + .c_str(), + GetCrtcAction( + {outputs_[1]->display_id(), gfx::Point(0, 0), modes[2].get()}) + .c_str(), + GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), + outputs_[0]->native_mode()}) + .c_str(), + GetCrtcAction( + {outputs_[1]->display_id(), gfx::Point(0, 0), modes[1].get()}) + .c_str(), // Since it was requested to go into mirror mode and the configured // modes were different, it should now try and setup a valid - // configurable extended mode. + // configurable extended mode in the same order described above. GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), outputs_[0]->native_mode()}) .c_str(), @@ -1073,6 +1088,22 @@ DisplayConfigurator::kVerticalGap), modes[3].get()}) .c_str(), + GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), + outputs_[0]->native_mode()}) + .c_str(), + GetCrtcAction({outputs_[1]->display_id(), + gfx::Point(0, modes[0]->size().height() + + DisplayConfigurator::kVerticalGap), + modes[2].get()}) + .c_str(), + GetCrtcAction({outputs_[0]->display_id(), gfx::Point(0, 0), + outputs_[0]->native_mode()}) + .c_str(), + GetCrtcAction({outputs_[1]->display_id(), + gfx::Point(0, modes[0]->size().height() + + DisplayConfigurator::kVerticalGap), + modes[1].get()}) + .c_str(), nullptr), log_->GetActionsAndClear()); }
diff --git a/ui/display/manager/test/test_native_display_delegate.cc b/ui/display/manager/test/test_native_display_delegate.cc index 9cacc22..f812f04 100644 --- a/ui/display/manager/test/test_native_display_delegate.cc +++ b/ui/display/manager/test/test_native_display_delegate.cc
@@ -73,15 +73,15 @@ void TestNativeDisplayDelegate::Configure( const std::vector<display::DisplayConfigurationParams>& config_requests, ConfigureCallback callback) { - base::flat_map<int64_t, bool> statuses; + bool config_success = true; for (const auto& config : config_requests) - statuses.insert(std::make_pair(config.id, Configure(config))); + config_success &= Configure(config); if (run_async_) { base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), statuses)); + FROM_HERE, base::BindOnce(std::move(callback), config_success)); } else { - std::move(callback).Run(statuses); + std::move(callback).Run(config_success); } }
diff --git a/ui/display/types/native_display_delegate.h b/ui/display/types/native_display_delegate.h index 56375f9..0c04497 100644 --- a/ui/display/types/native_display_delegate.h +++ b/ui/display/types/native_display_delegate.h
@@ -25,8 +25,7 @@ using GetDisplaysCallback = base::OnceCallback<void(const std::vector<DisplaySnapshot*>&)>; -using ConfigureCallback = - base::OnceCallback<void(const base::flat_map<int64_t, bool>&)>; +using ConfigureCallback = base::OnceCallback<void(bool)>; using GetHDCPStateCallback = base::OnceCallback<void(bool, HDCPState, ContentProtectionMethod)>; using SetHDCPStateCallback = base::OnceCallback<void(bool)>;
diff --git a/ui/gfx/image/image_skia.cc b/ui/gfx/image/image_skia.cc index 6d2748d..31dfdf5d 100644 --- a/ui/gfx/image/image_skia.cc +++ b/ui/gfx/image/image_skia.cc
@@ -125,7 +125,7 @@ // one and rescale the image. // Right now only Windows uses 2 and other platforms use 1 by default. // TODO(mukai, oshima): abandon 1 code path and use 2 for every platforms. - std::vector<const ImageSkiaRep>::iterator FindRepresentation( + std::vector<ImageSkiaRep>::const_iterator FindRepresentation( float scale, bool fetch_new_image) const; @@ -211,7 +211,7 @@ return source_ && source_->HasRepresentationAtAllScales(); } -std::vector<const ImageSkiaRep>::iterator ImageSkiaStorage::FindRepresentation( +std::vector<ImageSkiaRep>::const_iterator ImageSkiaStorage::FindRepresentation( float scale, bool fetch_new_image) const { auto closest_iter = image_reps_.end();
diff --git a/ui/gl/direct_composition_surface_win.cc b/ui/gl/direct_composition_surface_win.cc index 57a0d1db..5a4ba87a 100644 --- a/ui/gl/direct_composition_surface_win.cc +++ b/ui/gl/direct_composition_surface_win.cc
@@ -41,6 +41,8 @@ bool g_decode_swap_chain_disabled = false; // Whether to force the nv12 overlay support. bool g_force_nv12_overlay_support = false; +// Whether software overlays have been disabled. +bool g_disable_sw_overlays = false; // The lock to guard g_overlay_caps_valid and g_supports_overlays. base::Lock& GetOverlayLock() { @@ -58,6 +60,12 @@ g_supports_overlays = support; } +bool SupportsSoftwareOverlays() { + return base::FeatureList::IsEnabled( + features::kDirectCompositionSoftwareOverlays) && + !g_disable_sw_overlays; +} + bool OverlayCapsValid() { base::AutoLock auto_lock(GetOverlayLock()); return g_overlay_caps_valid; @@ -252,8 +260,7 @@ base::UmaHistogramBoolean("GPU.DirectComposition.HardwareOverlaysSupported", *supports_overlays); - if (*supports_overlays || !base::FeatureList::IsEnabled( - features::kDirectCompositionSoftwareOverlays)) { + if (*supports_overlays || !SupportsSoftwareOverlays()) { return; } @@ -464,6 +471,11 @@ } // static +void DirectCompositionSurfaceWin::DisableSoftwareOverlays() { + g_disable_sw_overlays = true; +} + +// static void DirectCompositionSurfaceWin::InvalidateOverlayCaps() { SetOverlayCapsValid(false); } @@ -473,9 +485,7 @@ UpdateOverlaySupport(); if (g_overlay_format_used == DXGI_FORMAT_NV12) { return (g_nv12_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING) || - (SupportsOverlays() && - base::FeatureList::IsEnabled( - features::kDirectCompositionSoftwareOverlays)); + (SupportsOverlays() && SupportsSoftwareOverlays()); } else if (g_overlay_format_used == DXGI_FORMAT_YUY2) { return !!(g_yuy2_overlay_support_flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING); } else {
diff --git a/ui/gl/direct_composition_surface_win.h b/ui/gl/direct_composition_surface_win.h index 5c53ae96..8669dd3 100644 --- a/ui/gl/direct_composition_surface_win.h +++ b/ui/gl/direct_composition_surface_win.h
@@ -62,6 +62,9 @@ // current GPU process' lifetime. static void DisableOverlays(); + // Similar to the above but disables software overlay support. + static void DisableSoftwareOverlays(); + // Indicate the overlay caps are invalid. static void InvalidateOverlayCaps();
diff --git a/ui/ozone/demo/window_manager.cc b/ui/ozone/demo/window_manager.cc index 611d6bff..686f88da 100644 --- a/ui/ozone/demo/window_manager.cc +++ b/ui/ozone/demo/window_manager.cc
@@ -108,13 +108,10 @@ } } -void WindowManager::OnDisplayConfigured( - const int64_t display_id, - const gfx::Rect& bounds, - const base::flat_map<int64_t, bool>& statuses) { - DCHECK_EQ(statuses.size(), 1UL); - - if (statuses.at(display_id)) { +void WindowManager::OnDisplayConfigured(const int64_t display_id, + const gfx::Rect& bounds, + bool config_success) { + if (config_success) { std::unique_ptr<DemoWindow> window( new DemoWindow(this, renderer_factory_.get(), bounds)); window->Start();
diff --git a/ui/ozone/demo/window_manager.h b/ui/ozone/demo/window_manager.h index 0415b01..db65a5b 100644 --- a/ui/ozone/demo/window_manager.h +++ b/ui/ozone/demo/window_manager.h
@@ -41,7 +41,7 @@ const std::vector<display::DisplaySnapshot*>& displays); void OnDisplayConfigured(const int64_t display_id, const gfx::Rect& bounds, - const base::flat_map<int64_t, bool>& statuses); + bool config_success); // display::NativeDisplayDelegate: void OnConfigurationChanged() override;
diff --git a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc index 8fdb11a..3b1057b0 100644 --- a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc +++ b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.cc
@@ -166,9 +166,9 @@ drm->DropMaster(); } -base::flat_map<int64_t, bool> DrmGpuDisplayManager::ConfigureDisplays( +bool DrmGpuDisplayManager::ConfigureDisplays( const std::vector<display::DisplayConfigurationParams>& config_requests) { - base::flat_map<int64_t, bool> statuses; + bool config_success = true; ScreenManager::ControllerConfigsList controllers_to_configure; for (const auto& config : config_requests) { @@ -176,7 +176,7 @@ DrmDisplay* display = FindDisplay(display_id); if (!display) { LOG(ERROR) << "There is no display with ID " << display_id; - statuses.insert(std::make_pair(display_id, false)); + config_success = false; continue; } @@ -185,7 +185,7 @@ if (config.mode) { if (!FindModeForDisplay(mode_ptr.get(), *config.mode.value(), display->modes(), displays_)) { - statuses.insert(std::make_pair(display_id, false)); + config_success = false; continue; } } @@ -206,22 +206,21 @@ } if (controllers_to_configure.empty()) - return statuses; + return config_success; if (clear_overlay_cache_callback_) clear_overlay_cache_callback_.Run(); - auto config_statuses = + config_success &= screen_manager_->ConfigureDisplayControllers(controllers_to_configure); - for (const auto& status : config_statuses) { - int64_t display_id = status.first; - bool success = status.second; + for (const auto& controller : controllers_to_configure) { + int64_t display_id = controller.display_id; DrmDisplay* display = FindDisplay(display_id); auto config = std::find_if( config_requests.begin(), config_requests.end(), [display_id](const auto& request) { return request.id == display_id; }); - if (success) { + if (config_success) { display->SetOrigin(config->origin); } else { if (config->mode) { @@ -235,11 +234,9 @@ << " crtc=" << display->crtc(); } } - - statuses.insert(std::make_pair(display_id, success)); } - return statuses; + return config_success; } bool DrmGpuDisplayManager::GetHDCPState(
diff --git a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h index 2dbe2ba..5bbdc84 100644 --- a/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h +++ b/ui/ozone/platform/drm/gpu/drm_gpu_display_manager.h
@@ -52,7 +52,7 @@ bool TakeDisplayControl(); void RelinquishDisplayControl(); - base::flat_map<int64_t, bool> ConfigureDisplays( + bool ConfigureDisplays( const std::vector<display::DisplayConfigurationParams>& config_requests); bool GetHDCPState(int64_t display_id, display::HDCPState* state,
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc index d77131c..1de5138 100644 --- a/ui/ozone/platform/drm/gpu/drm_thread.cc +++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -328,13 +328,11 @@ void DrmThread::ConfigureNativeDisplays( const std::vector<display::DisplayConfigurationParams>& config_requests, - base::OnceCallback<void(const base::flat_map<int64_t, bool>&)> callback) { + base::OnceCallback<void(bool)> callback) { TRACE_EVENT0("drm", "DrmThread::ConfigureNativeDisplays"); - base::flat_map<int64_t, bool> statuses = - display_manager_->ConfigureDisplays(config_requests); - - std::move(callback).Run(statuses); + bool config_success = display_manager_->ConfigureDisplays(config_requests); + std::move(callback).Run(config_success); } void DrmThread::TakeDisplayControl(base::OnceCallback<void(bool)> callback) {
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc index 62edc86e..00279e2 100644 --- a/ui/ozone/platform/drm/gpu/screen_manager.cc +++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -101,12 +101,6 @@ return controller->GetFormatModifiersForModesetting(fourcc_format); } -bool AreAllStatusesTrue(base::flat_map<int64_t, bool>& display_statuses) { - auto it = find_if(display_statuses.begin(), display_statuses.end(), - [](const auto status) { return status.second == false; }); - return (it == display_statuses.end()); -} - } // namespace ScreenManager::ScreenManager() = default; @@ -227,7 +221,7 @@ UpdateControllerToWindowMapping(); } -base::flat_map<int64_t, bool> ScreenManager::ConfigureDisplayControllers( +bool ScreenManager::ConfigureDisplayControllers( const ControllerConfigsList& controllers_params) { TRACE_EVENT0("drm", "ScreenManager::ConfigureDisplayControllers"); @@ -244,29 +238,17 @@ displays_for_drm_devices[params.drm].emplace_back(params); } - base::flat_map<int64_t, bool> statuses; + bool config_success = true; // Perform display configurations together for the same DRM only. for (const auto& configs_on_drm : displays_for_drm_devices) { - auto display_statuses = TestAndModeset(configs_on_drm.second); - statuses.insert(display_statuses.begin(), display_statuses.end()); + config_success &= + TestModeset(configs_on_drm.second) && Modeset(configs_on_drm.second); } - if (AreAllStatusesTrue(statuses)) + if (config_success) UpdateControllerToWindowMapping(); - return statuses; -} - -base::flat_map<int64_t, bool> ScreenManager::TestAndModeset( - const ControllerConfigsList& controllers_params) { - if (!TestModeset(controllers_params)) { - base::flat_map<int64_t, bool> statuses; - for (const auto& params : controllers_params) - statuses.insert(std::make_pair(params.display_id, false)); - return statuses; - } - - return Modeset(controllers_params); + return config_success; } bool ScreenManager::TestModeset( @@ -301,11 +283,10 @@ DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET); } -base::flat_map<int64_t, bool> ScreenManager::Modeset( - const ControllerConfigsList& controllers_params) { +bool ScreenManager::Modeset(const ControllerConfigsList& controllers_params) { TRACE_EVENT0("drm", "ScreenManager::Modeset"); - base::flat_map<int64_t, bool> statuses; + bool modeset_success = true; for (const auto& params : controllers_params) { // Commit one controller at a time. @@ -339,10 +320,10 @@ UpdateControllerStateAfterModeset(params, request_for_update, status); } - statuses.insert(std::make_pair(params.display_id, status)); + modeset_success &= status; } - return statuses; + return modeset_success; } void ScreenManager::SetDisplayControllerForEnableAndGetProps(
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.h b/ui/ozone/platform/drm/gpu/screen_manager.h index 16a868cc..bf34b8f 100644 --- a/ui/ozone/platform/drm/gpu/screen_manager.h +++ b/ui/ozone/platform/drm/gpu/screen_manager.h
@@ -68,7 +68,7 @@ void RemoveDisplayControllers(const CrtcsWithDrmList& controllers_to_remove); // Enables/Disables the display controller based on if a mode exists. - base::flat_map<int64_t, bool> ConfigureDisplayControllers( + bool ConfigureDisplayControllers( const ControllerConfigsList& controllers_params); // Returns a reference to the display controller configured to display within @@ -105,13 +105,9 @@ const scoped_refptr<DrmDevice>& drm, uint32_t crtc); - base::flat_map<int64_t, bool> TestAndModeset( - const ControllerConfigsList& controllers_params); - bool TestModeset(const ControllerConfigsList& controllers_params); - base::flat_map<int64_t, bool> Modeset( - const ControllerConfigsList& controllers_params); + bool Modeset(const ControllerConfigsList& controllers_params); // Configures a display controller to be enabled. The display controller is // identified by (|crtc|, |connector|) and the controller is to be modeset
diff --git a/ui/ozone/platform/drm/host/drm_display_host_manager.cc b/ui/ozone/platform/drm/host/drm_display_host_manager.cc index 975da5c..3281843 100644 --- a/ui/ozone/platform/drm/host/drm_display_host_manager.cc +++ b/ui/ozone/platform/drm/host/drm_display_host_manager.cc
@@ -237,15 +237,11 @@ void DrmDisplayHostManager::ConfigureDisplays( const std::vector<display::DisplayConfigurationParams>& config_requests, display::ConfigureCallback callback) { - base::flat_map<int64_t, bool> dummy_statuses; - bool is_any_dummy = false; for (auto& config : config_requests) { - is_any_dummy |= GetDisplay(config.id)->is_dummy(); - dummy_statuses.insert(std::make_pair(config.id, true)); - } - if (is_any_dummy) { - std::move(callback).Run(dummy_statuses); - return; + if (GetDisplay(config.id)->is_dummy()) { + std::move(callback).Run(true); + return; + } } proxy_->GpuConfigureNativeDisplays(config_requests, std::move(callback));
diff --git a/ui/ozone/platform/drm/host/host_drm_device.cc b/ui/ozone/platform/drm/host/host_drm_device.cc index 1c6c2b9..9cd757c 100644 --- a/ui/ozone/platform/drm/host/host_drm_device.cc +++ b/ui/ozone/platform/drm/host/host_drm_device.cc
@@ -136,16 +136,11 @@ if (IsConnected()) { drm_device_->ConfigureNativeDisplays(config_requests, std::move(callback)); } else { - // If not connected, report failure to config. - base::flat_map<int64_t, bool> dummy_statuses; - for (const auto& config : config_requests) - dummy_statuses.insert(std::make_pair(config.id, false)); - // Post this task to protect the callstack from accumulating too many // recursive calls to ConfigureDisplaysTask::Run() in cases in which the GPU // process crashes repeatedly. base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), dummy_statuses)); + FROM_HERE, base::BindOnce(std::move(callback), false)); } }
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn index ac195b3..725fed3 100644 --- a/ui/ozone/platform/wayland/BUILD.gn +++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -369,6 +369,7 @@ testonly = true sources = [ + "common/wayland_util_unittest.cc", "gpu/wayland_overlay_manager_unittest.cc", "host/wayland_connection_unittest.cc", "host/wayland_data_device_unittest.cc", @@ -383,6 +384,8 @@ "host/wayland_window_manager_unittests.cc", "host/wayland_window_unittest.cc", "host/wayland_zaura_shell_unittest.cc", + "test/wayland_drag_drop_test.cc", + "test/wayland_drag_drop_test.h", "test/wayland_test.cc", "test/wayland_test.h", ]
diff --git a/ui/ozone/platform/wayland/common/wayland_util.cc b/ui/ozone/platform/wayland/common/wayland_util.cc index 042cfc8e..dbc1b51 100644 --- a/ui/ozone/platform/wayland/common/wayland_util.cc +++ b/ui/ozone/platform/wayland/common/wayland_util.cc
@@ -7,7 +7,10 @@ #include <xdg-shell-client-protocol.h> #include <xdg-shell-unstable-v6-client-protocol.h> +#include "third_party/skia/include/core/SkPath.h" +#include "third_party/skia/include/core/SkRegion.h" #include "ui/base/hit_test.h" +#include "ui/gfx/skia_util.h" #include "ui/ozone/platform/wayland/host/wayland_connection.h" #include "ui/ozone/platform/wayland/host/wayland_shm_buffer.h" #include "ui/ozone/platform/wayland/host/wayland_surface.h" @@ -276,4 +279,17 @@ 1.0 / window->buffer_scale()); } +std::vector<gfx::Rect> CreateRectsFromSkPath(const SkPath& path) { + SkRegion clip_region; + clip_region.setRect(path.getBounds().round()); + SkRegion region; + region.setPath(path, clip_region); + + std::vector<gfx::Rect> rects; + for (SkRegion::Iterator it(region); !it.done(); it.next()) + rects.push_back(gfx::SkIRectToRect(it.rect())); + + return rects; +} + } // namespace wl
diff --git a/ui/ozone/platform/wayland/common/wayland_util.h b/ui/ozone/platform/wayland/common/wayland_util.h index d755de9..e472820 100644 --- a/ui/ozone/platform/wayland/common/wayland_util.h +++ b/ui/ozone/platform/wayland/common/wayland_util.h
@@ -17,6 +17,7 @@ #include "ui/platform_window/platform_window_init_properties.h" class SkBitmap; +class SkPath; namespace ui { class WaylandConnection; @@ -87,6 +88,9 @@ gfx::Rect TranslateWindowBoundsToParentDIP(ui::WaylandWindow* window, ui::WaylandWindow* parent_window); +// Returns rectangles dictated by SkPath. +std::vector<gfx::Rect> CreateRectsFromSkPath(const SkPath& path); + } // namespace wl #endif // UI_OZONE_PLATFORM_WAYLAND_COMMON_WAYLAND_UTIL_H_
diff --git a/ui/ozone/platform/wayland/common/wayland_util_unittest.cc b/ui/ozone/platform/wayland/common/wayland_util_unittest.cc new file mode 100644 index 0000000..57a3669c --- /dev/null +++ b/ui/ozone/platform/wayland/common/wayland_util_unittest.cc
@@ -0,0 +1,71 @@ +// Copyright 2020 The Chromium 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/ozone/platform/wayland/common/wayland_util.h" + +#include <memory> + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkPath.h" +#include "third_party/skia/include/core/SkRect.h" + +namespace ui { + +class WaylandUtilTest : public testing::Test {}; + +TEST_F(WaylandUtilTest, TestCreateRectsFromSkPath) { + constexpr int width = 100; + constexpr int height = 100; + + // Test1 consists of 2 rectangles from SkPath. + std::vector<gfx::Rect> expectedFor2Rects = {gfx::Rect(1, 0, 98, 1), + gfx::Rect(0, 1, 100, 99)}; + SkPath pathFor2Rects; + const SkRect rect = SkRect::MakeIWH(width, height); + constexpr SkScalar corner_radius_scalar = 2.0; + constexpr SkScalar radii[8] = {corner_radius_scalar, + corner_radius_scalar, // top-left + corner_radius_scalar, + corner_radius_scalar, // top-right + 0, + 0, // bottom-right + 0, + 0}; // bottom-left + pathFor2Rects.addRoundRect(rect, radii, SkPathDirection::kCW); + EXPECT_EQ(expectedFor2Rects, wl::CreateRectsFromSkPath(pathFor2Rects)); + + // Test2 consists of 5 rectangles from SkPath. + std::vector<gfx::Rect> expectedFor5Rects = { + gfx::Rect(3, 0, 94, 1), gfx::Rect(1, 1, 98, 2), gfx::Rect(0, 3, 100, 94), + gfx::Rect(1, 97, 98, 2), gfx::Rect(3, 99, 94, 1)}; + SkPath pathFor5Rects; + pathFor5Rects.moveTo(0, 3); + pathFor5Rects.lineTo(1, 3); + pathFor5Rects.lineTo(1, 1); + pathFor5Rects.lineTo(3, 1); + pathFor5Rects.lineTo(3, 0); + + pathFor5Rects.lineTo(width - 3, 0); + pathFor5Rects.lineTo(width - 3, 1); + pathFor5Rects.lineTo(width - 1, 1); + pathFor5Rects.lineTo(width - 1, 3); + pathFor5Rects.lineTo(width, 3); + + pathFor5Rects.lineTo(width, height - 3); + pathFor5Rects.lineTo(width - 1, height - 3); + pathFor5Rects.lineTo(width - 1, height - 1); + pathFor5Rects.lineTo(width - 3, height - 1); + pathFor5Rects.lineTo(width - 3, height); + + pathFor5Rects.lineTo(3, height); + pathFor5Rects.lineTo(3, height - 1); + pathFor5Rects.lineTo(1, height - 1); + pathFor5Rects.lineTo(1, height - 3); + pathFor5Rects.lineTo(0, height - 3); + pathFor5Rects.close(); + + EXPECT_EQ(expectedFor5Rects, wl::CreateRectsFromSkPath(pathFor5Rects)); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc b/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc index f44eed4..860e66c 100644 --- a/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_data_drag_controller_unittest.cc
@@ -33,6 +33,7 @@ #include "ui/ozone/platform/wayland/test/test_data_offer.h" #include "ui/ozone/platform/wayland/test/test_data_source.h" #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h" +#include "ui/ozone/platform/wayland/test/wayland_drag_drop_test.h" #include "ui/ozone/platform/wayland/test/wayland_test.h" #include "ui/ozone/public/platform_clipboard.h" #include "ui/platform_window/platform_window_init_properties.h" @@ -128,17 +129,13 @@ int available_operations_ = ui::DragDropTypes::DRAG_NONE; }; -class WaylandDataDragControllerTest : public WaylandTest { +class WaylandDataDragControllerTest : public WaylandDragDropTest { public: WaylandDataDragControllerTest() = default; + ~WaylandDataDragControllerTest() override = default; void SetUp() override { - WaylandTest::SetUp(); - - Sync(); - - data_device_manager_ = server_.data_device_manager(); - DCHECK(data_device_manager_); + WaylandDragDropTest::SetUp(); drag_handler_delegate_ = std::make_unique<MockDragHandlerDelegate>(); drop_handler_ = std::make_unique<MockDropHandler>(); @@ -168,9 +165,14 @@ return text; } - uint32_t NextSerial() const { - static uint32_t serial = 0; - return ++serial; + void RunDragLoopWithSampleData(WaylandWindow* origin_window, int operations) { + ASSERT_TRUE(origin_window); + OSExchangeData os_exchange_data; + os_exchange_data.SetString(sample_text_for_dnd()); + origin_window->StartDrag(os_exchange_data, operations, /*cursor=*/{}, + /*can_grab_pointer=*/true, + drag_handler_delegate_.get()); + Sync(); } std::unique_ptr<WaylandWindow> CreateTestWindow( @@ -189,66 +191,6 @@ return window; } - // TODO(crbug.com/1163544): Deduplicate DnD test helper code. - void SendDndEnter(WaylandWindow* window, const gfx::Point& location) { - EXPECT_TRUE(data_device_manager_->data_source()); - - auto* surface = server_.GetObject<wl::MockSurface>( - window->root_surface()->GetSurfaceId()); - - // Emulate server sending an wl_data_device::offer event. - auto* data_offer = data_device_manager_->data_device()->OnDataOffer(); - data_offer->OnOffer( - kMimeTypeText, ToClipboardData(std::string(kSampleTextForDragAndDrop))); - - // Emulate server sending an wl_data_device::enter event. - data_device_manager_->data_device()->OnEnter( - NextSerial(), surface->resource(), wl_fixed_from_int(location.x()), - wl_fixed_from_int(location.y()), data_offer); - } - - void SendDndLeave() { - EXPECT_TRUE(data_device_manager_->data_source()); - data_device_manager_->data_device()->OnLeave(); - } - - void SendDndCancelled() { - EXPECT_TRUE(data_device_manager_->data_source()); - data_device_manager_->data_source()->OnCancelled(); - } - - void ReadDataWhenSourceIsReady() { - Sync(); - - if (!data_device_manager_->data_source()) { - // The data source is created asynchronously via the window's data drag - // controller. If it is null now, it means that the task for that has not - // yet executed, and we have to come later. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce( - &WaylandDataDragControllerTest::ReadDataWhenSourceIsReady, - base::Unretained(this))); - return; - } - - // Now the server can read the data and give it to our callback. - base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); - auto callback = base::BindOnce( - [](base::RunLoop* loop, std::vector<uint8_t>&& data) { - std::string result(data.begin(), data.end()); - EXPECT_EQ(kSampleTextForDragAndDrop, result); - loop->Quit(); - }, - &run_loop); - data_device_manager_->data_source()->ReadData(kMimeTypeTextUtf8, - std::move(callback)); - run_loop.Run(); - - data_device_manager_->data_source()->OnCancelled(); - Sync(); - } - void ScheduleDragCancel() { ScheduleTestTask(base::BindOnce( [](WaylandDataDragControllerTest* self) { @@ -265,29 +207,7 @@ base::Unretained(this))); } - void ScheduleTestTask(base::OnceClosure test_task) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&WaylandDataDragControllerTest::RunTestTask, - base::Unretained(this), std::move(test_task))); - } - - void RunTestTask(base::OnceClosure test_task) { - Sync(); - - // The data source is created asynchronously by the data drag controller. If - // it is null at this point, it means that the task for that has not yet - // executed, and we have to try again a bit later. - if (!data_device_manager_->data_source()) { - ScheduleTestTask(std::move(test_task)); - return; - } - - std::move(test_task).Run(); - } - protected: - wl::TestDataDeviceManager* data_device_manager_; std::unique_ptr<MockDropHandler> drop_handler_; std::unique_ptr<MockDragHandlerDelegate> drag_handler_delegate_; }; @@ -296,21 +216,31 @@ const bool restored_focus = window_->has_pointer_focus(); window_->SetPointerFocus(true); - // The client starts dragging. - ASSERT_EQ(PlatformWindowType::kWindow, window_->type()); - OSExchangeData os_exchange_data; - os_exchange_data.SetString(sample_text_for_dnd()); + auto test = [](WaylandDataDragControllerTest* self) { + // Now the server can read the data and give it to our callback. + base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed); + auto read_callback = base::BindOnce( + [](base::RunLoop* loop, std::vector<uint8_t>&& data) { + std::string result(data.begin(), data.end()); + EXPECT_EQ(kSampleTextForDragAndDrop, result); + loop->Quit(); + }, + &run_loop); + self->ReadData(kMimeTypeTextUtf8, std::move(read_callback)); + run_loop.Run(); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&WaylandDataDragControllerTest::ReadDataWhenSourceIsReady, - base::Unretained(this))); + self->SendDndCancelled(); + self->Sync(); + }; - window_->StartDrag(os_exchange_data, - DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE, {}, - /*can_grab_pointer=*/true, drag_handler_delegate_.get()); - Sync(); + // Post test task to be performed asynchronously once the dnd-related protocol + // objects are ready. + ScheduleTestTask(base::BindOnce(test, base::Unretained(this))); + RunDragLoopWithSampleData( + window_.get(), DragDropTypes::DRAG_COPY | DragDropTypes::DRAG_MOVE); + + // Ensure drag delegate it properly reset when the drag loop quits. EXPECT_FALSE(data_device()->drag_delegate_); window_->SetPointerFocus(restored_focus); @@ -564,13 +494,11 @@ const bool restored_focus = window_->has_pointer_focus(); window_->SetPointerFocus(true); + // Schedule a wl_data_source::cancelled event to be sent asynchronously + // once the drag session gets started. ScheduleDragCancel(); - OSExchangeData os_exchange_data; - os_exchange_data.SetString(sample_text_for_dnd()); - window_->StartDrag(os_exchange_data, DragDropTypes::DRAG_COPY, {}, - /*can_grab_pointer=*/true, drag_handler_delegate_.get()); - Sync(); + RunDragLoopWithSampleData(window_.get(), DragDropTypes::DRAG_COPY); window_->SetPointerFocus(restored_focus); } @@ -616,9 +544,6 @@ ASSERT_EQ(PlatformWindowType::kWindow, window_1->type()); auto test = [](WaylandDataDragControllerTest* self) { - // Emulate server sending an dnd offer + enter events for |window_1|. - self->SendDndEnter(self->window(), gfx::Point(10, 10)); - // Init and open |target_window|. MockPlatformWindowDelegate delegate_2; auto window_2 = self->CreateTestWindow(PlatformWindowType::kWindow, @@ -645,12 +570,8 @@ // started. ScheduleTestTask(base::BindOnce(test, base::Unretained(this))); - // Request to start the drag session, which spins a nested run loop. - OSExchangeData os_exchange_data; - os_exchange_data.SetString(sample_text_for_dnd()); - window_1->StartDrag(os_exchange_data, DragDropTypes::DRAG_COPY, {}, true, - drag_handler_delegate_.get()); - Sync(); + RunDragLoopWithSampleData(window_.get(), DragDropTypes::DRAG_COPY); + window_1->SetPointerFocus(restored_focus); } @@ -662,29 +583,31 @@ auto test = [](WaylandDataDragControllerTest* self, PlatformWindowType window_type) { - // Emulate server sending an dnd offer + enter events for |origin_window|. - self->SendDndEnter(self->window(), gfx::Point(10, 10)); - EXPECT_CALL(*self->drop_handler(), MockOnDragEnter()).Times(1); - EXPECT_CALL(*self->drop_handler(), MockDragMotion(_, _, _)).Times(1); - self->Sync(); - // Init and open |target_window|. - MockPlatformWindowDelegate delegate_2; - auto window_2 = - self->CreateTestWindow(window_type, gfx::Size(100, 40), &delegate_2); + MockPlatformWindowDelegate aux_window_delegate; + auto aux_window = self->CreateTestWindow(window_type, gfx::Size(100, 40), + &aux_window_delegate); - // Leave |origin_window| and enter non-toplevel |window_2|. + // Leave |origin_window| and enter non-toplevel |aux_window|. self->SendDndLeave(); EXPECT_CALL(*self->drop_handler(), OnDragLeave).Times(1); + self->Sync(); - self->SendDndEnter(window_2.get(), {}); + self->SendDndEnter(aux_window.get(), {}); EXPECT_CALL(*self->drop_handler(), MockOnDragEnter()).Times(1); EXPECT_CALL(*self->drop_handler(), MockDragMotion(_, _, _)).Times(1); self->Sync(); + // Goes back to |origin_window|, as |aux_window| is going to get destroyed + // once this test task finishes. self->SendDndLeave(); EXPECT_CALL(*self->drop_handler(), OnDragLeave).Times(1); self->Sync(); + + self->SendDndEnter(self->window(), {}); + EXPECT_CALL(*self->drop_handler(), MockOnDragEnter()).Times(1); + EXPECT_CALL(*self->drop_handler(), MockDragMotion(_, _, _)).Times(1); + self->Sync(); }; // Post test tasks, for each non-toplevel window type, to be performed @@ -700,11 +623,8 @@ ScheduleDragCancel(); // Request to start the drag session, which spins a nested run loop. - OSExchangeData os_exchange_data; - os_exchange_data.SetString(sample_text_for_dnd()); - origin_window->StartDrag(os_exchange_data, DragDropTypes::DRAG_COPY, {}, true, - drag_handler_delegate_.get()); - Sync(); + RunDragLoopWithSampleData(origin_window, DragDropTypes::DRAG_COPY); + origin_window->SetPointerFocus(restored_focus); }
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc index cc4d182..c162d15 100644 --- a/ui/ozone/platform/wayland/host/wayland_surface.cc +++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -7,6 +7,7 @@ #include <linux-explicit-synchronization-unstable-v1-client-protocol.h> #include <viewporter-client-protocol.h> +#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" @@ -191,18 +192,49 @@ if (!root_window_ || !root_window_->IsOpaqueWindow()) return; - wl::Object<wl_region> region( - wl_compositor_create_region(connection_->compositor())); - gfx::Rect region_dip = - gfx::ScaleToEnclosingRect(region_px, 1.f / buffer_scale_); - wl_region_add(region.get(), region_dip.x(), region_dip.y(), - region_dip.width(), region_dip.height()); - - wl_surface_set_opaque_region(surface_.get(), region.get()); + wl_surface_set_opaque_region(surface_.get(), + CreateAndAddRegion(region_px).get()); connection_->ScheduleFlush(); } +void WaylandSurface::SetInputRegion(const gfx::Rect& region_px) { + // Don't set input region when use_native_frame is enabled. + if (!root_window_ || root_window_->ShouldUseNativeFrame()) + return; + + // Sets input region for input events to allow go through and + // for the compositor to ignore the parts of the input region that fall + // outside of the surface. + wl_surface_set_input_region(surface_.get(), + CreateAndAddRegion(region_px).get()); + + connection_->ScheduleFlush(); +} + +wl::Object<wl_region> WaylandSurface::CreateAndAddRegion( + const gfx::Rect& region_px) { + DCHECK(root_window_); + + wl::Object<wl_region> region( + wl_compositor_create_region(connection_->compositor())); + + auto add_region = [&](const gfx::Rect& r) { + gfx::Rect region_dip = gfx::ScaleToEnclosingRect(r, 1.f / buffer_scale_); + wl_region_add(region.get(), region_dip.x(), region_dip.y(), + region_dip.width(), region_dip.height()); + }; + + if (root_window_->GetWindowShape().has_value()) { + std::vector<gfx::Rect> rectangles = root_window_->GetWindowShape().value(); + for (const auto& rect : rectangles) + add_region(rect); + } else { + add_region(region_px); + } + return region; +} + void WaylandSurface::SetViewportSource(const gfx::RectF& src_rect) { if (src_rect == crop_rect_) { return;
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.h b/ui/ozone/platform/wayland/host/wayland_surface.h index 55ed7727..2f7284ae 100644 --- a/ui/ozone/platform/wayland/host/wayland_surface.h +++ b/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -79,6 +79,13 @@ // pixels. void SetOpaqueRegion(const gfx::Rect& region_px); + // Sets the input region on this surface in physical pixels. + // The input region indicates which parts of the surface accept pointer and + // touch input events. This is expected to be called from ToplevelWindow + // whenever the region that the surface span changes or window state changes + // when custom frame is used. + void SetInputRegion(const gfx::Rect& region_px); + // Set the source rectangle of the associated wl_surface. // See: // https://cgit.freedesktop.org/wayland/wayland-protocols/tree/stable/viewporter/viewporter.xml @@ -98,6 +105,8 @@ wl::Object<wl_subsurface> CreateSubsurface(WaylandSurface* parent); private: + wl::Object<wl_region> CreateAndAddRegion(const gfx::Rect& region_px); + WaylandConnection* const connection_; WaylandWindow* root_window_ = nullptr; wl::Object<wl_surface> surface_;
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc index acfc1e7..041d0f9 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -9,6 +9,7 @@ #include "base/run_loop.h" #include "base/unguessable_token.h" #include "build/chromeos_buildflags.h" +#include "third_party/skia/include/core/SkPath.h" #include "ui/base/hit_test.h" #include "ui/gfx/native_widget_types.h" #include "ui/ozone/platform/wayland/host/shell_object_factory.h" @@ -58,6 +59,10 @@ SetSizeConstraints(); TriggerStateChanges(); InitializeAuraShellSurface(); + // This could be the proper time to update window mask using + // NonClientView::GetWindowMask, since |non_client_view| is not created yet + // during the call to WaylandWindow::Initialize(). + UpdateWindowMask(); return true; } @@ -211,6 +216,8 @@ use_native_frame_ = use_native_frame; if (shell_toplevel_) SetDecorationMode(); + + UpdateWindowMask(); } bool WaylandToplevelWindow::ShouldUseNativeFrame() const { @@ -222,6 +229,11 @@ ->xdg_decoration_manager_v1(); } +base::Optional<std::vector<gfx::Rect>> WaylandToplevelWindow::GetWindowShape() + const { + return window_shape_; +} + void WaylandToplevelWindow::HandleSurfaceConfigure(int32_t width, int32_t height, bool is_maximized, @@ -409,4 +421,23 @@ } } +void WaylandToplevelWindow::UpdateWindowMask() { + // TODO(http://crbug.com/1158733): When supporting PlatformWindow::SetShape, + // update window region with the given |shape|. + WaylandWindow::UpdateWindowMask(); + root_surface()->SetInputRegion(GetBounds()); +} + +void WaylandToplevelWindow::UpdateWindowShape() { + // Create |window_shape_| using the window mask of PlatformWindowDelegate + // otherwise resets it. + base::Optional<SkPath> window_mask = delegate()->GetWindowMaskForWindowShape( + gfx::Size(GetBounds().width(), GetBounds().height())); + if (window_mask.has_value()) { + window_shape_ = wl::CreateRectsFromSkPath(window_mask.value()); + } else { + window_shape_.reset(); + } +} + } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.h b/ui/ozone/platform/wayland/host/wayland_toplevel_window.h index eb0636a..8467b40 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.h +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.h
@@ -38,7 +38,7 @@ int hittest, const gfx::Point& pointer_location_in_px) override; - // PlatformWindow + // PlatformWindow: void Show(bool inactive) override; void Hide() override; bool IsVisible() const override; @@ -55,6 +55,9 @@ void SetUseNativeFrame(bool use_native_frame) override; bool ShouldUseNativeFrame() const override; + // WaylandWindow overrides: + base::Optional<std::vector<gfx::Rect>> GetWindowShape() const override; + private: // WaylandWindow overrides: void HandleSurfaceConfigure(int32_t widht, @@ -64,6 +67,11 @@ bool is_activated) override; bool OnInitialize(PlatformWindowInitProperties properties) override; bool IsActive() const override; + // Calls UpdateWindowShape, set_input_region and set_opaque_region + // for this toplevel window. + void UpdateWindowMask() override; + // Update the window shape using the window mask of PlatformWindowDelegate. + void UpdateWindowShape() override; // WmMoveLoopHandler: bool RunMoveLoop(const gfx::Vector2d& drag_offset) override; @@ -141,6 +149,8 @@ // When use_native_frame is true, server-side decoration is set, // e.g. lacros-taskmanager. bool use_native_frame_ = false; + + base::Optional<std::vector<gfx::Rect>> window_shape_; }; } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index f14adef..a3e55d1 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -191,7 +191,7 @@ return; bounds_px_ = bounds_px; - root_surface_->SetOpaqueRegion(gfx::Rect(bounds_px_.size())); + UpdateWindowMask(); delegate_->OnBoundsChanged(bounds_px_); } @@ -394,6 +394,17 @@ delegate_->OnCloseRequest(); } +base::Optional<std::vector<gfx::Rect>> WaylandWindow::GetWindowShape() const { + return base::nullopt; +} + +void WaylandWindow::UpdateWindowMask() { + UpdateWindowShape(); + root_surface_->SetOpaqueRegion(bounds_px_); +} + +void WaylandWindow::UpdateWindowShape() {} + void WaylandWindow::OnDragEnter(const gfx::PointF& point, std::unique_ptr<OSExchangeData> data, int operation) {
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h index 4e0a01c..d45e107 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.h +++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -177,6 +177,8 @@ virtual void OnDragLeave(); virtual void OnDragSessionClose(uint32_t dnd_action); + virtual base::Optional<std::vector<gfx::Rect>> GetWindowShape() const; + // Returns a root parent window within the same hierarchy. WaylandWindow* GetRootParentWindow(); @@ -211,6 +213,9 @@ void set_ui_scale(int32_t ui_scale) { ui_scale_ = ui_scale; } + // Calls set_opaque_region for this window. + virtual void UpdateWindowMask(); + private: FRIEND_TEST_ALL_PREFIXES(WaylandScreenTest, SetBufferScale); @@ -226,6 +231,8 @@ // Additional initialization of derived classes. virtual bool OnInitialize(PlatformWindowInitProperties properties) = 0; + virtual void UpdateWindowShape(); + // WaylandWindowDragController might need to take ownership of the wayland // surface whether the window that originated the DND session gets destroyed // in the middle of that session (e.g: when it is snapped into a tab strip).
diff --git a/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc index db39448..55e173de 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_drag_controller_unittest.cc
@@ -30,7 +30,7 @@ #include "ui/ozone/platform/wayland/test/test_data_offer.h" #include "ui/ozone/platform/wayland/test/test_data_source.h" #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h" -#include "ui/ozone/platform/wayland/test/wayland_test.h" +#include "ui/ozone/platform/wayland/test/wayland_drag_drop_test.h" #include "ui/ozone/test/mock_platform_window_delegate.h" #include "ui/platform_window/extensions/wayland_extension.h" #include "ui/platform_window/platform_window_delegate.h" @@ -41,14 +41,14 @@ namespace ui { -class WaylandWindowDragControllerTest : public WaylandTest, - public wl::TestDataDevice::Delegate { +class WaylandWindowDragControllerTest : public WaylandDragDropTest { public: WaylandWindowDragControllerTest() = default; ~WaylandWindowDragControllerTest() override = default; void SetUp() override { - WaylandTest::SetUp(); + WaylandDragDropTest::SetUp(); + screen_ = std::make_unique<WaylandScreen>(connection_.get()); wl_seat_send_capabilities(server_.seat()->resource(), @@ -59,16 +59,6 @@ EXPECT_FALSE(window_->has_pointer_focus()); EXPECT_EQ(State::kIdle, drag_controller()->state()); - - data_device_manager_ = server_.data_device_manager(); - DCHECK(data_device_manager_); - - source_ = nullptr; - data_device_manager_->data_device()->set_delegate(this); - } - - void TearDown() override { - data_device_manager_->data_device()->set_delegate(nullptr); } WaylandWindowDragController* drag_controller() const { @@ -79,52 +69,9 @@ return connection_->wayland_window_manager(); } - uint32_t NextSerial() const { - static uint32_t serial = 0; - return ++serial; - } - - uint32_t NextTime() const { - static uint32_t timestamp = 0; - return ++timestamp; - } - protected: using State = WaylandWindowDragController::State; - // wl::TestDataDevice::Delegate: - void StartDrag(wl::TestDataSource* source, - wl::MockSurface* origin, - uint32_t serial) override { - EXPECT_FALSE(source_); - source_ = source; - OfferAndEnter(origin); - } - - // Helper functions - void SendDndMotion(const gfx::Point& location) { - EXPECT_TRUE(source_); - wl_fixed_t x = wl_fixed_from_int(location.x()); - wl_fixed_t y = wl_fixed_from_int(location.y()); - data_device_manager_->data_device()->OnMotion(NextTime(), x, y); - } - - void SendDndEnter(WaylandWindow* window) { - EXPECT_TRUE(window); - OfferAndEnter(server_.GetObject<wl::MockSurface>( - window->root_surface()->GetSurfaceId())); - } - - void SendDndLeave() { - EXPECT_TRUE(source_); - data_device_manager_->data_device()->OnLeave(); - } - - void SendDndDrop() { - EXPECT_TRUE(source_); - source_->OnCancelled(); - } - void SendPointerEnter(WaylandWindow* window, MockPlatformWindowDelegate* delegate) { auto* surface = server_.GetObject<wl::MockSurface>( @@ -181,24 +128,17 @@ screen_->GetLocalProcessWidgetAtPoint(location, {})); } - void OfferAndEnter(wl::MockSurface* surface) { - EXPECT_TRUE(source_); - auto* data_device = data_device_manager_->data_device(); - auto* offer = data_device->OnDataOffer(); - EXPECT_EQ(1u, source_->mime_types().size()); - for (const auto& mime_type : source_->mime_types()) - offer->OnOffer(mime_type, {}); - - wl_data_device_send_enter(data_device->resource(), NextSerial(), - surface->resource(), 0, 0, offer->resource()); - } + // For the context of window drag, "drop" is detected through + // wl_data_source::cancelled in the regular case. Unless extended-drag + // protocol is available. + // + // TODO(crbug.com/1116431): Support extended-drag in test compositor. + void SendDndDrop() { SendDndCancelled(); } // client objects std::unique_ptr<WaylandScreen> screen_; // server objects - wl::TestDataDeviceManager* data_device_manager_; - wl::TestDataSource* source_; wl::MockPointer* pointer_; }; @@ -471,7 +411,7 @@ // Exit |source_window| and enter the |target_window|. SendDndLeave(); - SendDndEnter(target_window); + SendDndEnter(target_window, {}); test_step = kEnteredTarget; });
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc index aa9197b..94e31f1 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -815,6 +815,51 @@ EXPECT_EQ(restored_bounds, gfx::Rect()); } +TEST_P(WaylandWindowTest, UpdateWindowRegion) { + wl::MockSurface* mock_surface = server_.GetObject<wl::MockSurface>( + window_->root_surface()->GetSurfaceId()); + + // Change bounds. + const gfx::Rect initial_bounds = window_->GetBounds(); + const gfx::Rect new_bounds = gfx::Rect(0, 0, initial_bounds.width() + 10, + initial_bounds.height() + 10); + EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).Times(1); + EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(1); + window_->SetBounds(new_bounds); + Sync(); + VerifyAndClearExpectations(); + EXPECT_EQ(mock_surface->opaque_region(), new_bounds); + EXPECT_EQ(mock_surface->input_region(), new_bounds); + + // Maximize. + ScopedWlArray states = InitializeWlArrayWithActivatedState(); + EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).Times(1); + EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(1); + const gfx::Rect maximized_bounds = gfx::Rect(0, 0, 1024, 768); + window_->Maximize(); + AddStateToWlArray(XDG_TOPLEVEL_STATE_MAXIMIZED, states.get()); + SendConfigureEvent(xdg_surface_, maximized_bounds.width(), + maximized_bounds.height(), 1, states.get()); + Sync(); + VerifyAndClearExpectations(); + EXPECT_EQ(mock_surface->opaque_region(), maximized_bounds); + EXPECT_EQ(mock_surface->input_region(), maximized_bounds); + + // Restore. + const gfx::Rect restored_bounds = window_->GetRestoredBoundsInPixels(); + EXPECT_CALL(*mock_surface, SetOpaqueRegion(_)).Times(1); + EXPECT_CALL(*mock_surface, SetInputRegion(_)).Times(1); + window_->Restore(); + // Reinitialize wl_array, which removes previous old states. + auto active = InitializeWlArrayWithActivatedState(); + SendConfigureEvent(xdg_surface_, 0, 0, 2, active.get()); + Sync(); + VerifyAndClearExpectations(); + + EXPECT_EQ(mock_surface->opaque_region(), restored_bounds); + EXPECT_EQ(mock_surface->input_region(), restored_bounds); +} + TEST_P(WaylandWindowTest, CanDispatchMouseEventDefault) { EXPECT_FALSE(window_->CanDispatchEvent(&test_mouse_event_)); }
diff --git a/ui/ozone/platform/wayland/test/mock_surface.cc b/ui/ozone/platform/wayland/test/mock_surface.cc index f2039e5..33b9ae34 100644 --- a/ui/ozone/platform/wayland/test/mock_surface.cc +++ b/ui/ozone/platform/wayland/test/mock_surface.cc
@@ -28,7 +28,7 @@ void SetInputRegion(wl_client* client, wl_resource* resource, wl_resource* region) { - GetUserDataAs<MockSurface>(resource)->SetInputRegion(region); + GetUserDataAs<MockSurface>(resource)->SetInputRegionImpl(region); } void Damage(wl_client* client, @@ -103,6 +103,10 @@ } void MockSurface::SetOpaqueRegionImpl(wl_resource* region) { + if (!region) { + opaque_region_ = gfx::Rect(-1, -1, 0, 0); + return; + } auto bounds = GetUserDataAs<TestRegion>(region)->getBounds(); opaque_region_ = gfx::Rect(bounds.fLeft, bounds.fTop, bounds.fRight - bounds.fLeft, @@ -111,6 +115,22 @@ SetOpaqueRegion(region); } +void MockSurface::SetInputRegionImpl(wl_resource* region) { + // It is unsafe to always treat |region| as a valid pointer. + // According to the protocol about wl_surface::set_input_region + // "A NULL wl_region cuases the input region to be set to infinite." + if (!region) { + input_region_ = gfx::Rect(-1, -1, 0, 0); + return; + } + auto bounds = GetUserDataAs<TestRegion>(region)->getBounds(); + input_region_ = + gfx::Rect(bounds.fLeft, bounds.fTop, bounds.fRight - bounds.fLeft, + bounds.fBottom - bounds.fTop); + + SetInputRegion(region); +} + void MockSurface::AttachNewBuffer(wl_resource* buffer_resource, int32_t x, int32_t y) {
diff --git a/ui/ozone/platform/wayland/test/mock_surface.h b/ui/ozone/platform/wayland/test/mock_surface.h index 0901319..fd682b8 100644 --- a/ui/ozone/platform/wayland/test/mock_surface.h +++ b/ui/ozone/platform/wayland/test/mock_surface.h
@@ -57,6 +57,7 @@ TestViewport* viewport() { return viewport_; } gfx::Rect opaque_region() const { return opaque_region_; } + gfx::Rect input_region() const { return input_region_; } void set_frame_callback(wl_resource* callback_resource) { DCHECK(!frame_callback_); @@ -69,6 +70,7 @@ bool has_role() const { return !!xdg_surface_ || !!sub_surface_; } void SetOpaqueRegionImpl(wl_resource* region); + void SetInputRegionImpl(wl_resource* region); void AttachNewBuffer(wl_resource* buffer_resource, int32_t x, int32_t y); void DestroyPrevAttachedBuffer(); void ReleaseBuffer(wl_resource* buffer); @@ -79,6 +81,7 @@ TestSubSurface* sub_surface_ = nullptr; TestViewport* viewport_ = nullptr; gfx::Rect opaque_region_ = {-1, -1, 0, 0}; + gfx::Rect input_region_ = {-1, -1, 0, 0}; wl_resource* frame_callback_ = nullptr;
diff --git a/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc b/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc new file mode 100644 index 0000000..259e8541 --- /dev/null +++ b/ui/ozone/platform/wayland/test/wayland_drag_drop_test.cc
@@ -0,0 +1,127 @@ +// Copyright 2021 The Chromium 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/ozone/platform/wayland/test/wayland_drag_drop_test.h" + +#include <wayland-util.h> + +#include <cstdint> + +#include "base/callback.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/point.h" +#include "ui/ozone/platform/wayland/host/wayland_window.h" +#include "ui/ozone/platform/wayland/test/mock_surface.h" +#include "ui/ozone/platform/wayland/test/test_data_device.h" +#include "ui/ozone/platform/wayland/test/test_data_device_manager.h" +#include "ui/ozone/platform/wayland/test/test_data_offer.h" +#include "ui/ozone/platform/wayland/test/test_data_source.h" + +namespace ui { + +WaylandDragDropTest::WaylandDragDropTest() = default; + +void WaylandDragDropTest::SendDndEnter(WaylandWindow* window, + const gfx::Point& location) { + auto* surface = server_.GetObject<wl::MockSurface>( + window->root_surface()->GetSurfaceId()); + OfferAndEnter(surface, location); +} + +void WaylandDragDropTest::SendDndLeave() { + data_device_manager_->data_device()->OnLeave(); +} + +void WaylandDragDropTest::SendDndMotion(const gfx::Point& location) { + EXPECT_TRUE(data_source_); + wl_fixed_t x = wl_fixed_from_int(location.x()); + wl_fixed_t y = wl_fixed_from_int(location.y()); + data_device_manager_->data_device()->OnMotion(NextTime(), x, y); +} + +void WaylandDragDropTest::SendDndCancelled() { + EXPECT_TRUE(data_source_); + data_source_->OnCancelled(); +} + +void WaylandDragDropTest::ReadData( + const std::string& mime_type, + wl::TestDataSource::ReadDataCallback callback) { + ASSERT_TRUE(data_source_); + data_source_->ReadData(mime_type, std::move(callback)); +} + +void WaylandDragDropTest::SetUp() { + WaylandTest::SetUp(); + Sync(); + + data_device_manager_ = server_.data_device_manager(); + ASSERT_TRUE(data_device_manager_); + + data_source_ = nullptr; + data_device_manager_->data_device()->set_delegate(this); +} + +void WaylandDragDropTest::TearDown() { + data_device_manager_->data_device()->set_delegate(nullptr); + data_device_manager_ = nullptr; +} + +// wl::TestDataDevice::Delegate: +void WaylandDragDropTest::StartDrag(wl::TestDataSource* source, + wl::MockSurface* origin, + uint32_t serial) { + EXPECT_FALSE(data_source_); + data_source_ = source; + OfferAndEnter(origin, {}); +} + +uint32_t WaylandDragDropTest::NextSerial() const { + static uint32_t serial = 0; + return ++serial; +} + +uint32_t WaylandDragDropTest::NextTime() const { + static uint32_t timestamp = 0; + return ++timestamp; +} + +void WaylandDragDropTest::OfferAndEnter(wl::MockSurface* surface, + const gfx::Point& location) { + ASSERT_TRUE(data_source_); + auto* data_device = data_device_manager_->data_device(); + + // Emulate server sending an wl_data_device::offer event. + auto* data_offer = data_device->OnDataOffer(); + for (const auto& mime_type : data_source_->mime_types()) + data_offer->OnOffer(mime_type, {}); + + // Emulate server sending an wl_data_device::enter event. + wl_data_device_send_enter( + data_device->resource(), NextSerial(), surface->resource(), + wl_fixed_from_int(location.x()), wl_fixed_from_int(location.y()), + data_offer->resource()); +} + +void WaylandDragDropTest::ScheduleTestTask(base::OnceClosure test_task) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(&WaylandDragDropTest::RunTestTask, + base::Unretained(this), std::move(test_task))); +} + +void WaylandDragDropTest::RunTestTask(base::OnceClosure test_task) { + Sync(); + + // The data source is created asynchronously by the drag controller. If it is + // null at this point, it means that the task for that has not yet executed, + // so try again a bit later. + if (!data_device_manager_->data_source()) { + ScheduleTestTask(std::move(test_task)); + return; + } + + std::move(test_task).Run(); +} + +} // namespace ui
diff --git a/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h b/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h new file mode 100644 index 0000000..3455909 --- /dev/null +++ b/ui/ozone/platform/wayland/test/wayland_drag_drop_test.h
@@ -0,0 +1,68 @@ +// Copyright 2021 The Chromium 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_OZONE_PLATFORM_WAYLAND_TEST_WAYLAND_DRAG_DROP_TEST_H_ +#define UI_OZONE_PLATFORM_WAYLAND_TEST_WAYLAND_DRAG_DROP_TEST_H_ + +#include "base/callback_forward.h" +#include "ui/ozone/platform/wayland/test/test_data_device.h" +#include "ui/ozone/platform/wayland/test/test_data_source.h" +#include "ui/ozone/platform/wayland/test/wayland_test.h" + +namespace gfx { +class Point; +} + +namespace wl { +class MockSurface; +class TestDataDeviceManager; +} // namespace wl + +namespace ui { + +class WaylandWindow; + +// Base class for Wayland drag-and-drop tests. Public methods allow test code to +// emulate dnd-related events from the test compositor and can be used in both +// data and window dragging test cases. +class WaylandDragDropTest : public WaylandTest, + public wl::TestDataDevice::Delegate { + public: + WaylandDragDropTest(); + WaylandDragDropTest(const WaylandDragDropTest&) = delete; + WaylandDragDropTest& operator=(const WaylandDragDropTest&) = delete; + + // These are public for convenience, as they must be callable from lambda + // functions, usually posted to task queue while the drag loop runs. + void SendDndEnter(WaylandWindow* window, const gfx::Point& location); + void SendDndLeave(); + void SendDndMotion(const gfx::Point& location); + void SendDndCancelled(); + void ReadData(const std::string& mime_type, + wl::TestDataSource::ReadDataCallback callback); + + protected: + // WaylandTest: + void SetUp() override; + void TearDown() override; + + // wl::TestDataDevice::Delegate: + void StartDrag(wl::TestDataSource* source, + wl::MockSurface* origin, + uint32_t serial) override; + + void OfferAndEnter(wl::MockSurface* surface, const gfx::Point& location); + uint32_t NextSerial() const; + uint32_t NextTime() const; + void ScheduleTestTask(base::OnceClosure test_task); + void RunTestTask(base::OnceClosure test_task); + + // Server objects + wl::TestDataDeviceManager* data_device_manager_; + wl::TestDataSource* data_source_; +}; + +} // namespace ui + +#endif // UI_OZONE_PLATFORM_WAYLAND_TEST_WAYLAND_DRAG_DROP_TEST_H_
diff --git a/ui/ozone/public/mojom/drm_device.mojom b/ui/ozone/public/mojom/drm_device.mojom index caf4a7e..cf0e17009 100644 --- a/ui/ozone/public/mojom/drm_device.mojom +++ b/ui/ozone/public/mojom/drm_device.mojom
@@ -51,11 +51,11 @@ // Instructs the GPU to abandon a DRM device. RemoveGraphicsDevice(mojo_base.mojom.FilePath path); - // Configures (Enables/Disables) DRM displays, returns a map: each configured - // display ID to its status, true on success. + // Configures (Enables/Disables) DRM displays, returns whether or not the + // configuration was successful. ConfigureNativeDisplays( array<display.mojom.DisplayConfigurationParams> config_requests) => - (map<int64, bool> statuses); + (bool config_success); // Gets high-definition content protection (HDCP) (DRM as in // digital rights management) state.
diff --git a/ui/platform_window/DEPS b/ui/platform_window/DEPS index b51da65..baa2776 100644 --- a/ui/platform_window/DEPS +++ b/ui/platform_window/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+third_party/skia/include", "+ui/base", "+ui/gfx", ]
diff --git a/ui/platform_window/extensions/x11_extension_delegate.h b/ui/platform_window/extensions/x11_extension_delegate.h index 86ec59d2..381f2994 100644 --- a/ui/platform_window/extensions/x11_extension_delegate.h +++ b/ui/platform_window/extensions/x11_extension_delegate.h
@@ -12,12 +12,6 @@ using AtkKeyEventStruct = struct _AtkKeyEventStruct; #endif -class SkPath; - -namespace gfx { -class Size; -} - namespace ui { class COMPONENT_EXPORT(PLATFORM_WINDOW) X11ExtensionDelegate { @@ -30,10 +24,6 @@ // (menu) windows. virtual void OnLostMouseGrab() = 0; - // Returns a mask to be used to clip the window for the given - // size. This is used to create the non-rectangular window shape. - virtual void GetWindowMask(const gfx::Size& size, SkPath* window_mask) = 0; - #if BUILDFLAG(USE_ATK) // Notifies an ATK key event to be processed. The transient parameter will be // true if the event target is a transient window (e.g. a modal dialog)
diff --git a/ui/platform_window/platform_window_delegate.cc b/ui/platform_window/platform_window_delegate.cc index fb685b3..c93bb3e 100644 --- a/ui/platform_window/platform_window_delegate.cc +++ b/ui/platform_window/platform_window_delegate.cc
@@ -4,6 +4,7 @@ #include "ui/platform_window/platform_window_delegate.h" +#include "third_party/skia/include/core/SkPath.h" #include "ui/gfx/geometry/size.h" namespace ui { @@ -20,4 +21,9 @@ return base::nullopt; } +base::Optional<SkPath> PlatformWindowDelegate::GetWindowMaskForWindowShape( + const gfx::Size& size_in_pixels) { + return base::nullopt; +} + } // namespace ui
diff --git a/ui/platform_window/platform_window_delegate.h b/ui/platform_window/platform_window_delegate.h index 6ffdaa15..05054d1 100644 --- a/ui/platform_window/platform_window_delegate.h +++ b/ui/platform_window/platform_window_delegate.h
@@ -14,6 +14,8 @@ class Size; } // namespace gfx +class SkPath; + namespace ui { class Event; @@ -63,6 +65,11 @@ virtual base::Optional<gfx::Size> GetMinimumSizeForWindow(); virtual base::Optional<gfx::Size> GetMaximumSizeForWindow(); + // Returns a mask to be used to clip the window for the given + // size. This is used to create the non-rectangular window shape. + virtual base::Optional<SkPath> GetWindowMaskForWindowShape( + const gfx::Size& size_in_pixels); + // Called when the location of mouse pointer entered the window. This is // different from ui::ET_MOUSE_ENTERED which may not be generated when mouse // is captured either by implicitly or explicitly.
diff --git a/ui/platform_window/x11/test/x11_window_unittest.cc b/ui/platform_window/x11/test/x11_window_unittest.cc index b0950b0..945fc5b3 100644 --- a/ui/platform_window/x11/test/x11_window_unittest.cc +++ b/ui/platform_window/x11/test/x11_window_unittest.cc
@@ -73,6 +73,21 @@ } void OnActivationChanged(bool active) override {} void OnMouseEnter() override {} + base::Optional<SkPath> GetWindowMaskForWindowShape( + const gfx::Size& size_in_pixels) override { + SkPath window_mask; + int right = size_in_pixels.width(); + int bottom = size_in_pixels.height(); + + window_mask.moveTo(0, 0); + window_mask.lineTo(0, bottom); + window_mask.lineTo(right, bottom); + window_mask.lineTo(right, 10); + window_mask.lineTo(right - 10, 10); + window_mask.lineTo(right - 10, 0); + window_mask.close(); + return window_mask; + } private: gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget; @@ -90,18 +105,6 @@ ~ShapedX11ExtensionDelegate() override = default; void OnLostMouseGrab() override {} - void GetWindowMask(const gfx::Size& size, SkPath* window_mask) override { - int right = size.width(); - int bottom = size.height(); - - window_mask->moveTo(0, 0); - window_mask->lineTo(0, bottom); - window_mask->lineTo(right, bottom); - window_mask->lineTo(right, 10); - window_mask->lineTo(right - 10, 10); - window_mask->lineTo(right - 10, 0); - window_mask->close(); - } #if BUILDFLAG(USE_ATK) bool OnAtkKeyEvent(AtkKeyEventStruct* atk_key_event, bool transient) override {
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc index a70699ea..0cfcb1c 100644 --- a/ui/platform_window/x11/x11_window.cc +++ b/ui/platform_window/x11/x11_window.cc
@@ -765,8 +765,10 @@ void X11Window::GetWindowMaskForXWindow(const gfx::Size& size, SkPath* window_mask) { - if (x11_extension_delegate_) - x11_extension_delegate_->GetWindowMask(size, window_mask); + base::Optional<SkPath> path = + platform_window_delegate_->GetWindowMaskForWindowShape(size); + if (path.has_value()) + *window_mask = path.value(); } void X11Window::DispatchHostWindowDragMovement(
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index 03db25c7..a7c7d96 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -826,6 +826,8 @@ "widget/desktop_aura/desktop_drag_drop_client_ozone.h", "widget/desktop_aura/desktop_window_tree_host_platform.cc", "widget/desktop_aura/window_move_client_platform.cc", + "widget/desktop_aura/window_shape_updater.cc", + "widget/desktop_aura/window_shape_updater.h", ] } if (use_atk) {
diff --git a/ui/views/metadata/type_conversion.h b/ui/views/metadata/type_conversion.h index cf770a3..0fc8eb0 100644 --- a/ui/views/metadata/type_conversion.h +++ b/ui/views/metadata/type_conversion.h
@@ -45,10 +45,14 @@ const T&>::type; // General Type Conversion Template Functions --------------------------------- -template <typename T> -struct TypeConverter { - static constexpr bool is_serializable = std::is_enum<T>::value; +template <bool serializable> +struct BaseTypeConverter { + static constexpr bool is_serializable = serializable; static bool IsSerializable() { return is_serializable; } +}; + +template <typename T> +struct TypeConverter : BaseTypeConverter<std::is_enum<T>::value> { static base::string16 ToString(ArgType<T> source_value); static base::Optional<T> FromString(const base::string16& source_value); }; @@ -116,9 +120,7 @@ #define DECLARE_CONVERSIONS(T) \ template <> \ - struct VIEWS_EXPORT TypeConverter<T> { \ - static constexpr bool is_serializable = true; \ - static bool IsSerializable() { return is_serializable; } \ + struct VIEWS_EXPORT TypeConverter<T> : BaseTypeConverter<true> { \ static base::string16 ToString(ArgType<T> source_value); \ static base::Optional<T> FromString(const base::string16& source_value); \ }; @@ -149,9 +151,8 @@ VIEWS_EXPORT const base::string16& GetNullOptStr(); template <typename T> -struct TypeConverter<base::Optional<T>> { - static constexpr bool is_serializable = TypeConverter<T>::is_serializable; - static bool IsSerializable() { return is_serializable; } +struct TypeConverter<base::Optional<T>> + : BaseTypeConverter<TypeConverter<T>::is_serializable> { static base::string16 ToString(ArgType<base::Optional<T>> source_value) { if (!source_value) return GetNullOptStr(); @@ -168,9 +169,7 @@ }; template <typename T> -struct TypeConverter<std::unique_ptr<T>> { - static constexpr bool is_serializable = false; - static bool IsSerializable() { return is_serializable; } +struct TypeConverter<std::unique_ptr<T>> : BaseTypeConverter<false> { static base::string16 ToString(const std::unique_ptr<T>& source_value); static base::Optional<std::unique_ptr<T>> FromString( const base::string16& source_value);
diff --git a/ui/views/views_features.cc b/ui/views/views_features.cc index 83a10c4..827cae2 100644 --- a/ui/views/views_features.cc +++ b/ui/views/views_features.cc
@@ -12,12 +12,6 @@ // Please keep alphabetized. -// Increase corner radius on Dialogs for the material design refresh. -// TODO(tluk): Remove this feature flag when platform inconsistencies -// have been fixed as recorded on: https://crbug.com/932970 -const base::Feature kEnableMDRoundedCornersOnDialogs{ - "EnableMDRoundedCornersOnDialogs", base::FEATURE_DISABLED_BY_DEFAULT}; - // Use a high-contrast style for ink drops when in platform high-contrast mode, // including full opacity and a high-contrast color const base::Feature kEnablePlatformHighContrastInkDrop{
diff --git a/ui/views/views_features.h b/ui/views/views_features.h index f0f7715..9a042adc 100644 --- a/ui/views/views_features.h +++ b/ui/views/views_features.h
@@ -14,7 +14,6 @@ // Please keep alphabetized. -VIEWS_EXPORT extern const base::Feature kEnableMDRoundedCornersOnDialogs; VIEWS_EXPORT extern const base::Feature kEnablePlatformHighContrastInkDrop; VIEWS_EXPORT extern const base::Feature kEnableViewPaintOptimization; VIEWS_EXPORT extern const base::Feature kTextfieldFocusOnTapUp;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc index 0bdc147..a0f75cc9 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -339,17 +339,6 @@ non_client_window_event_filter_.reset(); } -void DesktopWindowTreeHostLinux::GetWindowMask(const gfx::Size& size, - SkPath* window_mask) { - DCHECK(window_mask); - Widget* widget = native_widget_delegate()->AsWidget(); - if (widget->non_client_view()) { - // Some frame views define a custom (non-rectangular) window mask. If - // so, use it to define the window shape. If not, fall through. - widget->non_client_view()->GetWindowMask(size, window_mask); - } -} - void DesktopWindowTreeHostLinux::OnLostMouseGrab() { dispatcher()->OnHostLostMouseGrab(); }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h index 4b6a5a4..e033937 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -19,8 +19,6 @@ #include "ui/views/views_export.h" #include "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h" -class SkPath; - namespace aura { class ScopedWindowTargeter; } // namespace aura @@ -106,7 +104,6 @@ void DestroyNonClientEventFilter(); // X11ExtensionDelegate overrides: - void GetWindowMask(const gfx::Size& size, SkPath* window_mask) override; void OnLostMouseGrab() override; #if BUILDFLAG(USE_ATK) bool OnAtkKeyEvent(AtkKeyEventStruct* atk_key_event, bool transient) override;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc index 6a1fcf7..50d62e6 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" +#include "third_party/skia/include/core/SkPath.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/drag_drop_client.h" #include "ui/aura/client/focus_client.h" @@ -27,6 +28,7 @@ #include "ui/views/corewm/tooltip_aura.h" #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h" #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" +#include "ui/views/widget/desktop_aura/window_shape_updater.h" #include "ui/views/widget/widget_aura_utils.h" #include "ui/views/window/native_frame_view.h" #include "ui/wm/core/window_util.h" @@ -198,7 +200,13 @@ native_widget_delegate_->OnNativeWidgetCreated(); } -void DesktopWindowTreeHostPlatform::OnWidgetInitDone() {} +void DesktopWindowTreeHostPlatform::OnWidgetInitDone() { + // WindowShape is updated from ShapeRects transformed from + // NonClientView::GetWindowMask. We can guarantee that |NonClientView| is + // created OnWidgetInitDone. + WindowShapeUpdater::CreateWindowShapeUpdater( + this, this->desktop_native_widget_aura()); +} void DesktopWindowTreeHostPlatform::OnActiveWindowChanged(bool active) {} @@ -436,6 +444,8 @@ void DesktopWindowTreeHostPlatform::SetShape( std::unique_ptr<Widget::ShapeRects> native_shape) { + // TODO(crbug.com/1158733) : When supporting PlatformWindow::SetShape, + // Calls ui::Layer::SetAlphaShape and sets |is_shape_explicitly_set_| to true. platform_window()->SetShape(std::move(native_shape), GetRootTransform()); } @@ -558,7 +568,10 @@ } bool DesktopWindowTreeHostPlatform::ShouldWindowContentsBeTransparent() const { - return platform_window()->ShouldWindowContentsBeTransparent(); + return platform_window()->ShouldWindowContentsBeTransparent() || + const_cast<DesktopWindowTreeHostPlatform*>(this) + ->GetWindowMaskForWindowShape(GetBoundsInPixels().size()) + .has_value(); } void DesktopWindowTreeHostPlatform::FrameTypeChanged() { @@ -738,6 +751,20 @@ .size(); } +base::Optional<SkPath> +DesktopWindowTreeHostPlatform::GetWindowMaskForWindowShape( + const gfx::Size& size_in_pixels) { + if (GetWidget()->non_client_view()) { + SkPath window_mask; + // Some frame views define a custom (non-rectanguar) window mask. + // If so, use it to define the window shape. If not, fall through. + GetWidget()->non_client_view()->GetWindowMask(size_in_pixels, &window_mask); + if (!window_mask.isEmpty()) + return window_mask; + } + return base::nullopt; +} + void DesktopWindowTreeHostPlatform::OnWorkspaceChanged() { OnHostWorkspaceChanged(); }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h index 8db9bca..3eeb80848 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -42,6 +42,8 @@ aura::Window* GetContentWindow(); const aura::Window* GetContentWindow() const; + bool is_shape_explicitly_set() const { return is_shape_explicitly_set_; } + // DesktopWindowTreeHost: void Init(const Widget::InitParams& params) override; void OnNativeWidgetCreated(const Widget::InitParams& params) override; @@ -121,6 +123,8 @@ void OnActivationChanged(bool active) override; base::Optional<gfx::Size> GetMinimumSizeForWindow() override; base::Optional<gfx::Size> GetMaximumSizeForWindow() override; + base::Optional<SkPath> GetWindowMaskForWindowShape( + const gfx::Size& size_in_pixels) override; // ui::WorkspaceExtensionDelegate: void OnWorkspaceChanged() override; @@ -174,6 +178,10 @@ // Used for tab dragging in move loop requests. WindowMoveClientPlatform window_move_client_; + // ui::Layer::SetAlphaShape can be set from either SetShape or default window + // mask. When explicitly setting from SetShape, |explicitly_set_shape_:true|. + bool is_shape_explicitly_set_ = false; + base::WeakPtrFactory<DesktopWindowTreeHostPlatform> close_widget_factory_{ this};
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc index 45c1da7..b228f8b 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
@@ -167,6 +167,37 @@ EXPECT_TRUE(widget->GetNativeWindow()->IsVisible()); } +// Tests that the window shape is updated from the +// |NonClientView::GetWindowMask|. +TEST_F(DesktopWindowTreeHostPlatformTest, UpdateWindowShapeFromWindowMask) { + std::unique_ptr<Widget> widget = CreateWidgetWithNativeWidget(); + widget->Show(); + + auto* host_platform = DesktopWindowTreeHostPlatform::GetHostForWidget( + widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget()); + ASSERT_TRUE(host_platform); + auto* content_window = + DesktopWindowTreeHostPlatform::GetContentWindowForWidget( + widget->GetNativeWindow()->GetHost()->GetAcceleratedWidget()); + ASSERT_TRUE(content_window); + // alpha_shape for the layer of content window is updated from the + // |NonClientView::GetWindowMask|. + EXPECT_TRUE(host_platform + ->GetWindowMaskForWindowShape(content_window->bounds().size()) + .has_value()); + EXPECT_TRUE(content_window->layer()->alpha_shape()); + + // When fullscreen mode, alpha_shape is set to empty since there is no + // |NonClientView::GetWindowMask|. + host_platform->SetFullscreen(true); + widget->SetBounds(gfx::Rect(800, 800)); + EXPECT_FALSE( + host_platform + ->GetWindowMaskForWindowShape(content_window->bounds().size()) + .has_value()); + EXPECT_FALSE(content_window->layer()->alpha_shape()); +} + // A Widget that allows setting the min/max size for the widget. class CustomSizeWidget : public Widget { public:
diff --git a/ui/views/widget/desktop_aura/window_shape_updater.cc b/ui/views/widget/desktop_aura/window_shape_updater.cc new file mode 100644 index 0000000..225d526 --- /dev/null +++ b/ui/views/widget/desktop_aura/window_shape_updater.cc
@@ -0,0 +1,77 @@ +// Copyright 2021 The Chromium 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/widget/desktop_aura/window_shape_updater.h" + +#include "ui/gfx/skia_util.h" +#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" +#include "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h" + +namespace { + +std::unique_ptr<ui::Layer::ShapeRects> ConvertToShapeRects(const SkPath& path) { + // Converts to ShapeRects from SkPath. + auto shape_rects = std::make_unique<ui::Layer::ShapeRects>(); + SkRegion clip_region; + clip_region.setRect(path.getBounds().round()); + SkRegion region; + region.setPath(path, clip_region); + for (SkRegion::Iterator it(region); !it.done(); it.next()) + shape_rects->push_back(gfx::SkIRectToRect(it.rect())); + return shape_rects; +} + +} // namespace + +namespace views { + +// static +WindowShapeUpdater* WindowShapeUpdater::CreateWindowShapeUpdater( + DesktopWindowTreeHostPlatform* tree_host, + DesktopNativeWidgetAura* native_widget_aura) { + return new WindowShapeUpdater(tree_host, native_widget_aura); +} + +WindowShapeUpdater::WindowShapeUpdater( + DesktopWindowTreeHostPlatform* tree_host, + DesktopNativeWidgetAura* native_widget_aura) + : tree_host_(tree_host), native_widget_aura_(native_widget_aura) { + tree_host_->GetContentWindow()->AddObserver(this); + UpdateWindowShapeFromWindowMask(tree_host_->GetContentWindow()); +} + +void WindowShapeUpdater::OnWindowBoundsChanged( + aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds, + ui::PropertyChangeReason reason) { + UpdateWindowShapeFromWindowMask(window); +} + +void WindowShapeUpdater::OnWindowDestroying(aura::Window* window) { + window->RemoveObserver(this); + delete this; +} + +void WindowShapeUpdater::UpdateWindowShapeFromWindowMask(aura::Window* window) { + // If |ui::Layer::alpha_shape_| is set explicitly from SetShape, + // we don't need to set default window mask from non_client_view. + if (tree_host_->is_shape_explicitly_set()) + return; + // WindowTransparency should be updated as well when the window shape is + // changed. When a window mask exists, transparent should be true to prevent + // compositor from filling the entire screen in AppendQuadsToFillScreen. + // Otherwise, transparent should be false. + native_widget_aura_->UpdateWindowTransparency(); + base::Optional<SkPath> path = + tree_host_->GetWindowMaskForWindowShape(window->bounds().size()); + if (path.has_value()) { + // SetAlphaShape to the layer of |content_window_| + window->layer()->SetAlphaShape(ConvertToShapeRects(path.value())); + } else { + window->layer()->SetAlphaShape(nullptr); + } +} + +} // namespace views
diff --git a/ui/views/widget/desktop_aura/window_shape_updater.h b/ui/views/widget/desktop_aura/window_shape_updater.h new file mode 100644 index 0000000..ec77362 --- /dev/null +++ b/ui/views/widget/desktop_aura/window_shape_updater.h
@@ -0,0 +1,49 @@ +// Copyright 2021 The Chromium 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_WIDGET_DESKTOP_AURA_WINDOW_SHAPE_UPDATER_H_ +#define UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_SHAPE_UPDATER_H_ + +#include <memory> + +#include "ui/aura/window_observer.h" +#include "ui/compositor/layer.h" + +namespace views { + +class DesktopNativeWidgetAura; +class DesktopWindowTreeHostPlatform; + +// Class to observe the window bounds changed to update window shape +// for the rounded corner of the browser frame. +class WindowShapeUpdater : public aura::WindowObserver { + public: + static WindowShapeUpdater* CreateWindowShapeUpdater( + DesktopWindowTreeHostPlatform* tree_host, + DesktopNativeWidgetAura* native_widget_aura); + + private: + WindowShapeUpdater(DesktopWindowTreeHostPlatform* tree_host, + DesktopNativeWidgetAura* native_widget_aura); + WindowShapeUpdater(const WindowShapeUpdater&) = delete; + WindowShapeUpdater& operator=(const WindowShapeUpdater&) = delete; + ~WindowShapeUpdater() override = default; + + // aura::WindowObserver: + void OnWindowBoundsChanged(aura::Window* window, + const gfx::Rect& old_bounds, + const gfx::Rect& new_bounds, + ui::PropertyChangeReason reason) override; + + void OnWindowDestroying(aura::Window* window) override; + + void UpdateWindowShapeFromWindowMask(aura::Window* window); + + DesktopWindowTreeHostPlatform* tree_host_ = nullptr; + DesktopNativeWidgetAura* native_widget_aura_ = nullptr; +}; + +} // namespace views + +#endif // UI_VIEWS_WIDGET_DESKTOP_AURA_WINDOW_SHAPE_UPDATER_H_
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index 79b605daf..cf62e62 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc
@@ -418,11 +418,14 @@ } int DialogDelegate::GetCornerRadius() const { - return base::FeatureList::IsEnabled( - features::kEnableMDRoundedCornersOnDialogs) - ? LayoutProvider::Get()->GetCornerRadiusMetric( - views::EMPHASIS_MEDIUM) - : 2; +#if defined(OS_MAC) + // TODO(crbug.com/1116680): On Mac MODAL_TYPE_WINDOW is implemented using + // sheets which causes visual artifacts when corner radius is increased for + // modal types. Remove this after this issue has been addressed. + if (GetModalType() == ui::MODAL_TYPE_WINDOW) + return 2; +#endif + return LayoutProvider::Get()->GetCornerRadiusMetric(views::EMPHASIS_MEDIUM); } std::unique_ptr<View> DialogDelegate::DisownFootnoteView() {
diff --git a/ui/webui/resources/cr_components/BUILD.gn b/ui/webui/resources/cr_components/BUILD.gn index a261bcb7..7337a5e 100644 --- a/ui/webui/resources/cr_components/BUILD.gn +++ b/ui/webui/resources/cr_components/BUILD.gn
@@ -38,6 +38,7 @@ "chromeos/cellular_setup/psim_2x.png", "chromeos/cellular_setup/esim_1x.png", "chromeos/cellular_setup/esim_2x.png", + "chromeos/cellular_setup/default_esim_profile.svg", "chromeos/network/cellular_0_with_x.svg", "chromeos/network/cellular_0.svg", "chromeos/network/cellular_1.svg",
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.html index 2d24cee..d129a10 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.html +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.html
@@ -6,11 +6,43 @@ <dom-module id="confirmation-code-page"> <template> <style include="iron-flex"> + [slot='page-body'] { + margin-top: -20px; + } + + #details { + align-items: center; + color: var(--cr-primary-text-color); + display: flex; + margin-bottom: 40px; + margin-top: 60px; + } + + #profileImage { + margin-inline-end: 16px; + } + + #confirmationCode { + margin-inline-end: 16px; + } </style> <base-page> - <div slot="page-body" class="layout horizontal center-center"> - <!-- TODO(crbug.com/1093185): Create UI for confirmation code page. --> - Please enter your confirmation code for [[getProfileName_(profileProperties_)]]. + <div slot="page-body"> + <!-- TODO(crbug.com/1093185): Handle activation code case where + we don't have profileProperties_. --> + <div id="description">[[getMessage_(profileProperties_)]]</div> + <div id="details"> + <!-- TODO(crbug.com/1093185): Update with real profile image. --> + <img id="profileImage" src="default_esim_profile.svg"> + <div> + [[getProfileName_(profileProperties_)]] + </div> + </div> + <cr-input id="confirmationCode" + label="[[i18n('confirmationCodeInput')]]" + value="{{confirmationCode}}" + aria-describedby="description"> + </cr-input> </div> </base-page> </template>
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.js index 84b91e80..edbd11ac 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.js +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/confirmation_code_page.js
@@ -21,6 +21,11 @@ observer: 'onProfileChanged_', }, + confirmationCode: { + type: String, + notify: true, + }, + /** * @type {?chromeos.cellularSetup.mojom.ESimProfileProperties} * @private @@ -46,6 +51,18 @@ * @return {string} * @private */ + getMessage_() { + const profileName = this.getProfileName_(); + if (!profileName) { + return ''; + } + return this.i18n('confirmationCodeMessage', profileName); + }, + + /** + * @return {string} + * @private + */ getProfileName_() { if (!this.profileProperties_) { return '';
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/default_esim_profile.svg b/ui/webui/resources/cr_components/chromeos/cellular_setup/default_esim_profile.svg new file mode 100644 index 0000000..058d7e0 --- /dev/null +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/default_esim_profile.svg
@@ -0,0 +1 @@ +<svg width="31" height="20" viewBox="0 0 31 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4 2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h23a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H4zm7.704 10.915h-3.55V6.18h-1.36V14h4.91v-1.085zm4.254-5.64h2.438V6.18h-6.203v1.095h2.417V14h1.348V7.275zm4.823 3.234h3.212V9.435h-3.212v-2.16h3.717V6.18h-5.076V14h5.114v-1.085H20.78v-2.406z" fill="#5F6368"/></svg> \ No newline at end of file
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html index 79704c5..b41e8b9 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.html
@@ -39,6 +39,7 @@ show-error="{{showError_}}"> </activation-code-page> <confirmation-code-page id="confirmationCodePage" + confirmation-code="{{confirmationCode_}}" profile="[[selectedProfile_]]"> </confirmation-code-page> <final-page
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js index 414a91a..6796c63 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
@@ -88,6 +88,13 @@ type: String, value: '', }, + + /** @private */ + confirmationCode_: { + type: String, + value: '', + observer: 'onConfirmationCodeUpdated_', + }, }, /** @@ -162,6 +169,7 @@ * response */ handleProfileInstallResponse_(response) { + // TODO(crbug.com/1093185) Handle error during confirmation code page. this.showError_ = response.result !== chromeos.cellularSetup.mojom.ProfileInstallResult.kSuccess; if (response.result === @@ -224,11 +232,11 @@ cancel: this.delegate.shouldShowCancelButton() ? cellularSetup.ButtonState.SHOWN_AND_ENABLED : cellularSetup.ButtonState.HIDDEN, - done: cellularSetup.ButtonState.SHOWN_AND_ENABLED, - next: cellularSetup.ButtonState.HIDDEN, + done: cellularSetup.ButtonState.HIDDEN, + // TODO(crbug.com/1093185) Add a "Confirm" button state. + next: cellularSetup.ButtonState.SHOWN_BUT_DISABLED, tryAgain: cellularSetup.ButtonState.HIDDEN, skipDiscovery: cellularSetup.ButtonState.HIDDEN, - // TODO(crbug.com/1093185) Add a "Confirm" button state. }; break; case ESimUiState.PROFILE_SELECTION: @@ -285,6 +293,20 @@ } }, + /** @private */ + onConfirmationCodeUpdated_() { + // TODO(crbug.com/1093185) Change this to updating a "Confirm" button's + // state. + if (this.confirmationCode_) { + this.set( + 'buttonState.next', cellularSetup.ButtonState.SHOWN_AND_ENABLED); + } else { + this.set( + 'buttonState.next', cellularSetup.ButtonState.SHOWN_BUT_DISABLED); + } + }, + + /** SubflowBehavior override */ navigateForward() { switch (this.state_) { case ESimUiState.ACTIVATION_CODE_ENTRY: @@ -297,12 +319,25 @@ break; case ESimUiState.PROFILE_SELECTION: if (this.selectedProfile_) { + // Assume installing the profile doesn't require a confirmation + // code, send an empty string. this.selectedProfile_.installProfile('').then( this.handleProfileInstallResponse_.bind(this)); } else { this.state_ = ESimUiState.ACTIVATION_CODE_ENTRY; } break; + case ESimUiState.CONFIRMATION_CODE_ENTRY: + if (this.selectedProfile_) { + this.selectedProfile_.installProfile(this.confirmationCode_) + .then(this.handleProfileInstallResponse_.bind(this)); + } else { + this.euicc_ + .installProfileFromActivationCode( + this.activationCode_, this.confirmationCode_) + .then(this.handleProfileInstallResponse_.bind(this)); + } + break; default: assertNotReached(); break; @@ -311,6 +346,7 @@ /** * @returns {boolean} true if backward navigation was handled + * SubflowBehavior override */ attemptBackwardNavigation() { // TODO(crbug.com/1093185): Handle state when camera is used
diff --git a/ui/webui/resources/js/cr/ui/BUILD.gn b/ui/webui/resources/js/cr/ui/BUILD.gn index b0cba354..7825de6 100644 --- a/ui/webui/resources/js/cr/ui/BUILD.gn +++ b/ui/webui/resources/js/cr/ui/BUILD.gn
@@ -39,7 +39,6 @@ "array_data_model.js", "bubble_button.js", "bubble.js", - "card_slider.js", "command.js", "context_menu_handler.js", "dialogs.js", @@ -63,7 +62,6 @@ "store_client.js", "store.js", "tabs.js", - "touch_handler.js", "tree.js", ]
diff --git a/ui/wm/core/ime_util_chromeos.cc b/ui/wm/core/ime_util_chromeos.cc index 03e98076..552ea8cbd 100644 --- a/ui/wm/core/ime_util_chromeos.cc +++ b/ui/wm/core/ime_util_chromeos.cc
@@ -59,9 +59,6 @@ nullptr) void RestoreWindowBoundsOnClientFocusLost(aura::Window* window) { - window->GetRootWindow()->ClearProperty( - aura::client::kEmbeddedWindowEnsureNotInRect); - // Get restore bounds of the window gfx::Rect* vk_restore_bounds = window->GetProperty(kVirtualKeyboardRestoreBoundsKey); @@ -97,37 +94,4 @@ MoveWindowToEnsureCaretNotInRect(window, rect_in_screen); } -EnsureWindowNotInRectHelper::EnsureWindowNotInRectHelper( - aura::Window* embedding_root) - : embedding_root_(embedding_root) { - embedding_root_->AddObserver(this); -} - -EnsureWindowNotInRectHelper::~EnsureWindowNotInRectHelper() { - if (embedding_root_) - embedding_root_->RemoveObserver(this); -} - -void EnsureWindowNotInRectHelper::OnWindowPropertyChanged(aura::Window* window, - const void* key, - intptr_t old) { - DCHECK_EQ(embedding_root_, window); - - if (key != aura::client::kEmbeddedWindowEnsureNotInRect) - return; - - aura::Window* top_level = embedding_root_->GetToplevelWindow(); - gfx::Rect* rect_in_screen = embedding_root_->GetProperty( - aura::client::kEmbeddedWindowEnsureNotInRect); - if (rect_in_screen) - EnsureWindowNotInRect(top_level, *rect_in_screen); - else - RestoreWindowBoundsOnClientFocusLost(top_level); -} - -void EnsureWindowNotInRectHelper::OnWindowDestroyed(aura::Window* window) { - DCHECK_EQ(embedding_root_, window); - embedding_root_ = nullptr; -} - } // namespace wm
diff --git a/ui/wm/core/ime_util_chromeos.h b/ui/wm/core/ime_util_chromeos.h index 346820ce..eb5faae 100644 --- a/ui/wm/core/ime_util_chromeos.h +++ b/ui/wm/core/ime_util_chromeos.h
@@ -6,7 +6,6 @@ #define UI_WM_CORE_IME_UTIL_CHROMEOS_H_ #include "ui/aura/window.h" -#include "ui/aura/window_observer.h" #include "ui/wm/core/wm_core_export.h" namespace gfx { @@ -20,11 +19,7 @@ WM_CORE_EXPORT extern const aura::WindowProperty<gfx::Rect*>* const kVirtualKeyboardRestoreBoundsKey; -// Moves |window| to ensure it does not intersect with |rect_in_screen| if it -// does not belong to an embedded window tree. Otherwise, sets |rect_in_screen| -// in kEmbeddedWindowEnsureNotInRect window property on the root window of the -// embedded tree so that the embedding side could forward the call to the -// relevant top level window. See also EnsureWindowNotInRectHelper. +// Moves |window| to ensure it does not intersect with |rect_in_screen|. WM_CORE_EXPORT void EnsureWindowNotInRect(aura::Window* window, const gfx::Rect& rect_in_screen); @@ -32,25 +27,6 @@ WM_CORE_EXPORT void RestoreWindowBoundsOnClientFocusLost( aura::Window* top_level_window); -// Helper to call EnsureWindowNotInRect/RestoreWindowBoundsOnClientFocusLost -// on the top-level window of an embedding root when its -// kEmbeddedWindowEnsureNotInRect window property changes. -class WM_CORE_EXPORT EnsureWindowNotInRectHelper : public aura::WindowObserver { - public: - explicit EnsureWindowNotInRectHelper(aura::Window* embedding_root); - ~EnsureWindowNotInRectHelper() override; - - private: - // aura::WindowObsever: - void OnWindowPropertyChanged(aura::Window* window, - const void* key, - intptr_t old) override; - void OnWindowDestroyed(aura::Window* window) override; - - aura::Window* embedding_root_ = nullptr; - DISALLOW_COPY_AND_ASSIGN(EnsureWindowNotInRectHelper); -}; - } // namespace wm #endif // UI_WM_CORE_IME_UTIL_CHROMEOS_H_
diff --git a/ui/wm/core/ime_util_chromeos_unittest.cc b/ui/wm/core/ime_util_chromeos_unittest.cc index 3096705e..41fe2f1 100644 --- a/ui/wm/core/ime_util_chromeos_unittest.cc +++ b/ui/wm/core/ime_util_chromeos_unittest.cc
@@ -128,23 +128,4 @@ EXPECT_EQ(original_bounds, window->GetBoundsInScreen()); } -// Tests that setting/clearing kEmbeddedWindowEnsureNotInRect window property -// triggers the relevant top level to be moved/restored. -TEST_F(ImeUtilChromeosTest, EnsureWindowNotInRectHelper) { - const gfx::Rect original_bounds(10, 10, 100, 100); - aura::Window* top_level = aura::test::CreateTestWindow( - SK_ColorWHITE, 1, original_bounds, root_window()); - aura::Window* embedding_root = aura::test::CreateTestWindowWithBounds( - gfx::Rect(original_bounds.size()), top_level); - EnsureWindowNotInRectHelper helper(embedding_root); - - gfx::Rect occluded_rect(50, 50, 200, 200); - embedding_root->SetProperty(aura::client::kEmbeddedWindowEnsureNotInRect, - new gfx::Rect(occluded_rect)); - EXPECT_EQ(gfx::Rect(10, 0, 100, 100), top_level->bounds()); - - embedding_root->ClearProperty(aura::client::kEmbeddedWindowEnsureNotInRect); - EXPECT_EQ(original_bounds, top_level->bounds()); -} - } // namespace wm
diff --git a/url/BUILD.gn b/url/BUILD.gn index 9b72a07..0e3e91ee 100644 --- a/url/BUILD.gn +++ b/url/BUILD.gn
@@ -171,6 +171,20 @@ } } +source_set("url_test_support") { + testonly = true + + sources = [ "origin_abstract_tests.h" ] + + public_deps = [ + ":url", + "//base", + "//base/test:test_support", + "//testing/gmock", + "//testing/gtest", + ] +} + test("url_unittests") { sources = [ "gurl_unittest.cc", @@ -186,6 +200,7 @@ deps = [ ":url", + ":url_test_support", "//base", "//base/test:test_support", "//testing/gmock",
diff --git a/url/origin_abstract_tests.h b/url/origin_abstract_tests.h new file mode 100644 index 0000000..eeb8f213 --- /dev/null +++ b/url/origin_abstract_tests.h
@@ -0,0 +1,99 @@ +// Copyright 2020 The Chromium 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 URL_ORIGIN_ABSTRACT_TESTS_H_ +#define URL_ORIGIN_ABSTRACT_TESTS_H_ + +#include <string> +#include <type_traits> + +#include "base/strings/string_piece.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/url_util.h" + +namespace url { + +// AbstractOriginTest below abstracts away differences between url::Origin and +// blink::SecurityOrigin by parametrizing the tests with a class that has to be +// derived from OriginTraitsBase below. +template <typename TConcreteOriginType> +class OriginTraitsBase { + public: + using OriginType = TConcreteOriginType; + OriginTraitsBase() = default; + + // Constructing an origin. + virtual OriginType CreateOriginFromString(base::StringPiece s) const = 0; + + // Accessors for origin properties. + virtual bool IsOpaque(const OriginType& origin) const = 0; + virtual std::string GetScheme(const OriginType& origin) const = 0; + virtual std::string GetHost(const OriginType& origin) const = 0; + virtual uint16_t GetPort(const OriginType& origin) const = 0; + + // This type is non-copyable and non-moveable. + OriginTraitsBase(const OriginTraitsBase&) = delete; + OriginTraitsBase& operator=(const OriginTraitsBase&) = delete; +}; + +// Test suite for tests that cover both url::Origin and blink::SecurityOrigin. +template <typename TOriginTraits> +class AbstractOriginTest : public testing::Test { + static_assert( + std::is_base_of<OriginTraitsBase<typename TOriginTraits::OriginType>, + TOriginTraits>::value, + "TOriginTraits needs to expose the right members."); + + protected: + // Wrappers that allow tests to ignore presence of `origin_traits_`. + // + // Note that calling the wrappers needs to be prefixed with `this->...` to + // avoid hitting: explicit qualification required to use member 'IsOpaque' + // from dependent base class. + using OriginType = typename TOriginTraits::OriginType; + OriginType CreateOriginFromString(base::StringPiece s) const { + return origin_traits_.CreateOriginFromString(s); + } + bool IsOpaque(const OriginType& origin) const { + return origin_traits_.IsOpaque(origin); + } + std::string GetScheme(const OriginType& origin) const { + return origin_traits_.GetScheme(origin); + } + std::string GetHost(const OriginType& origin) const { + return origin_traits_.GetHost(origin); + } + uint16_t GetPort(const OriginType& origin) const { + return origin_traits_.GetPort(origin); + } + + private: + TOriginTraits origin_traits_; +}; + +TYPED_TEST_SUITE_P(AbstractOriginTest); + +TYPED_TEST_P(AbstractOriginTest, NonStandardSchemeWithAndroidWebViewHack) { + ScopedSchemeRegistryForTests scoped_registry; + EnableNonStandardSchemesForAndroidWebView(); + + // Regression test for https://crbug.com/896059. + auto origin = this->CreateOriginFromString("cow://"); + EXPECT_FALSE(this->IsOpaque(origin)); + EXPECT_EQ("cow", this->GetScheme(origin)); + EXPECT_EQ("", this->GetHost(origin)); + EXPECT_EQ(0, this->GetPort(origin)); + + // about:blank translates into an opaque origin, even in presence of + // EnableNonStandardSchemesForAndroidWebView. + origin = this->CreateOriginFromString("about:blank"); + EXPECT_TRUE(this->IsOpaque(origin)); +} + +REGISTER_TYPED_TEST_SUITE_P(AbstractOriginTest, + NonStandardSchemeWithAndroidWebViewHack); + +} // namespace url + +#endif // URL_ORIGIN_ABSTRACT_TESTS_H_
diff --git a/url/origin_unittest.cc b/url/origin_unittest.cc index c3b051e..26f9c37 100644 --- a/url/origin_unittest.cc +++ b/url/origin_unittest.cc
@@ -10,10 +10,13 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" #include "url/origin.h" +#include "url/origin_abstract_tests.h" #include "url/url_util.h" namespace url { +namespace { + void ExpectParsedUrlsEqual(const GURL& a, const GURL& b) { EXPECT_EQ(a, b); const Parsed& a_parsed = a.parsed_for_possibly_invalid_spec(); @@ -36,6 +39,8 @@ EXPECT_EQ(a_parsed.ref.len, b_parsed.ref.len); } +} // namespace + class OriginTest : public ::testing::Test { public: void SetUp() override { @@ -671,22 +676,6 @@ EXPECT_TRUE(origin.opaque()); } -TEST_F(OriginTest, NonStandardSchemeWithAndroidWebViewHack) { - EnableNonStandardSchemesForAndroidWebView(); - - // Regression test for https://crbug.com/896059. - Origin origin = Origin::Create(GURL("cow://")); - EXPECT_FALSE(origin.opaque()); - EXPECT_EQ("cow", origin.scheme()); - EXPECT_EQ("", origin.host()); - EXPECT_EQ(0, origin.port()); - - // about:blank translates into an opaque origin, even in presence of - // EnableNonStandardSchemesForAndroidWebView. - origin = Origin::Create(GURL("about:blank")); - EXPECT_TRUE(origin.opaque()); -} - TEST_F(OriginTest, CanBeDerivedFrom) { AddStandardScheme("new-standard", SchemeType::SCHEME_WITH_HOST); Origin opaque_unique_origin = Origin(); @@ -974,4 +963,31 @@ EXPECT_EQ(opaque.GetDebugString(), deserialized.value().GetDebugString()); } +class UrlOriginTestTraits final : public OriginTraitsBase<Origin> { + public: + OriginType CreateOriginFromString(base::StringPiece s) const override { + return Origin::Create(GURL(s)); + } + + bool IsOpaque(const OriginType& origin) const override { + return origin.opaque(); + } + + std::string GetScheme(const OriginType& origin) const override { + return origin.scheme(); + } + + std::string GetHost(const OriginType& origin) const override { + return origin.host(); + } + + uint16_t GetPort(const OriginType& origin) const override { + return origin.port(); + } +}; + +INSTANTIATE_TYPED_TEST_SUITE_P(UrlOrigin, + AbstractOriginTest, + UrlOriginTestTraits); + } // namespace url
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java index 7aafd3f..b115d4c 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/NavigationTest.java
@@ -43,6 +43,7 @@ import org.chromium.weblayer.Tab; import org.chromium.weblayer.TabCallback; import org.chromium.weblayer.TabListCallback; +import org.chromium.weblayer.WebLayer; import org.chromium.weblayer.shell.InstrumentationActivity; import java.io.ByteArrayInputStream; @@ -90,8 +91,8 @@ Fragment fragment, Intent intent, int requestCode, Bundle options) {} } - private static class Callback extends NavigationCallback { - public static class NavigationCallbackHelper extends CallbackHelper { + private class Callback extends NavigationCallback { + public class NavigationCallbackHelper extends CallbackHelper { private Uri mUri; private boolean mIsSameDocument; private int mHttpStatusCode; @@ -109,10 +110,15 @@ mRedirectChain = navigation.getRedirectChain(); mLoadError = navigation.getLoadError(); mNavigationState = navigation.getState(); - mIsKnownProtocol = navigation.isKnownProtocol(); mIsPageInitiatedNavigation = navigation.isPageInitiated(); mIsServedFromBackForwardCache = navigation.isServedFromBackForwardCache(); notifyCalled(); + + int majorVersion = TestThreadUtils.runOnUiThreadBlockingNoException( + () -> WebLayer.getSupportedMajorVersion(mActivityTestRule.getActivity())); + if (majorVersion >= 89) { + mIsKnownProtocol = navigation.isKnownProtocol(); + } } public void assertCalledWith(int currentCallCount, String uri) throws TimeoutException { @@ -162,7 +168,7 @@ } } - public static class UriCallbackHelper extends CallbackHelper { + public class UriCallbackHelper extends CallbackHelper { private Uri mUri; public void notifyCalled(Uri uri) { @@ -175,7 +181,7 @@ } } - public static class NavigationCallbackValueRecorder { + public class NavigationCallbackValueRecorder { private List<String> mObservedValues = Collections.synchronizedList(new ArrayList<String>()); @@ -193,7 +199,7 @@ } } - public static class FirstContentfulPaintCallbackHelper extends CallbackHelper { + public class FirstContentfulPaintCallbackHelper extends CallbackHelper { private long mNavigationStartMillis; private long mFirstContentfulPaintMs; @@ -212,7 +218,7 @@ } } - public static class LargestContentfulPaintCallbackHelper extends CallbackHelper { + public class LargestContentfulPaintCallbackHelper extends CallbackHelper { private long mNavigationStartMillis; private long mLargestContentfulPaintMs;